Browse Source

Merge branch 'feature/td' into 'wrdp'

thread dump功能改由jcmd实现.

See merge request o2oa/o2oa!2105
o2null 5 years ago
parent
commit
01188f0b69

+ 12 - 5
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalDataSource.java

@@ -61,7 +61,6 @@ public class ExternalDataSource extends ConfigObject {
 	private String statFilter;
 	@FieldDescribe("执行缓慢sql毫秒数,默认2000毫秒,执行缓慢的sql将被单独记录.")
 	private Integer slowSqlMillis;
-
 	@FieldDescribe("设置此数据库存储的类,默认情况下存储所有类型,如果需要对每个类进行单独的控制以达到高性能,可以将不同的类存储到不同的节点上提高性能.可以使用通配符*")
 	private List<String> includes;
 	@FieldDescribe("在此节点上不存储的类,和includes一起设置实际存储的类,可以使用通配符*")
@@ -70,10 +69,12 @@ public class ExternalDataSource extends ConfigObject {
 	private String logLevel = DEFAULT_LOGLEVEL;
 	@FieldDescribe("事务隔离级别:default,none,read-committed,read-uncommitted,repeatable-read,serializable.默认使用default(数据库设置的事务级别).")
 	private String transactionIsolation;
-	@FieldDescribe("测试入池连接.")
+	@FieldDescribe("测试入池连接,默认false.")
 	private Boolean testConnectionOnCheckin;
-	@FieldDescribe("测试出池连接.")
+	@FieldDescribe("测试出池连接,默认false.")
 	private Boolean testConnectionOnCheckout;
+	@FieldDescribe("空闲阈值,默认300秒.")
+	private Integer maxIdleTime;
 
 	public static final Integer DEFAULT_MAXTOTAL = 50;
 
@@ -89,9 +90,15 @@ public class ExternalDataSource extends ConfigObject {
 
 	public static final String DEFAULT_TRANSACTIONISOLATION = "default";
 
-	public static final Boolean DEFAULT_TESTCONNECTIONONCHECKIN = true;
+	public static final Boolean DEFAULT_TESTCONNECTIONONCHECKIN = false;
+
+	public static final Boolean DEFAULT_TESTCONNECTIONONCHECKOUT = false;
 
-	public static final Boolean DEFAULT_TESTCONNECTIONONCHECKOUT = true;
+	public static final Integer DEFAULT_MAXIDLETIME = 300;
+
+	public Integer getMaxIdleTime() {
+		return maxIdleTime == null ? DEFAULT_MAXIDLETIME : this.maxIdleTime;
+	}
 
 	public Boolean getTestConnectionOnCheckin() {
 		return this.testConnectionOnCheckin == null ? DEFAULT_TESTCONNECTIONONCHECKIN : this.testConnectionOnCheckin;

+ 7 - 0
o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/ExternalDataSources.java

@@ -138,4 +138,11 @@ public class ExternalDataSources extends CopyOnWriteArrayList<ExternalDataSource
 		return null;
 	}
 
+	public Integer getMaxIdleTime() {
+		for (ExternalDataSource o : this) {
+			return o.getMaxIdleTime();
+		}
+		return null;
+	}
+
 }

+ 1 - 0
o2server/x_console/src/main/java/com/x/server/console/ResourceFactory.java

@@ -151,6 +151,7 @@ public class ResourceFactory {
 			// 增加校验
 			dataSource.setTestConnectionOnCheckin(ds.getTestConnectionOnCheckin());
 			dataSource.setTestConnectionOnCheckout(ds.getTestConnectionOnCheckout());
+			dataSource.setMaxIdleTime(ds.getMaxIdleTime());
 			dataSource.setAcquireIncrement(2);
 			if (BooleanUtils.isTrue(ds.getStatEnable())) {
 				dataSource.setFilters(ds.getStatFilter());

+ 0 - 93
o2server/x_console/src/main/java/com/x/server/console/action/Ddl2.java

@@ -1,93 +0,0 @@
-package com.x.server.console.action;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-import com.x.base.core.container.factory.PersistenceXmlHelper;
-import com.x.base.core.project.config.Config;
-import com.x.base.core.project.logger.Logger;
-import com.x.base.core.project.logger.LoggerFactory;
-import com.x.base.core.project.tools.ListTools;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
-import org.apache.openjpa.jdbc.meta.MappingTool;
-import org.apache.openjpa.lib.util.Options;
-import org.apache.openjpa.persistence.EntityManagerImpl;
-import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
-import org.apache.openjpa.persistence.OpenJPAPersistence;
-
-public class Ddl2 {
-
-	private static Logger logger = LoggerFactory.getLogger(Ddl2.class);
-
-	/* 初始化完成 */
-	public boolean execute(String type) throws Exception {
-
-		// List<String> containerEntityNames = new ArrayList<>();
-		// containerEntityNames.addAll((List<String>)
-		// Config.resource(Config.RESOURCE_CONTAINERENTITYNAMES));
-		// List<String> classNames =
-		// ListTools.includesExcludesWildcard(containerEntityNames,
-		// Config.dumpRestoreData().getIncludes(),
-		// Config.dumpRestoreData().getExcludes());
-		// File persistence = new File(Config.dir_local_temp_classes(),
-		// "META-INF/persistence.xml");
-		// PersistenceXmlHelper.writeForDdl(persistence.getAbsolutePath());
-		// String[] arguments = new String[4];
-		// arguments[0] = "-schemaAction";
-		// arguments[1] = StringUtils.equals(type ,"create")? "build":"add";
-		// arguments[2] = "-sql";
-		// arguments[3] = Config.dir_local_temp_sql(true) + "/" + type + ".sql";
-		// MappingTool.main(arguments);
-		// return true;
-		String flag = "build";
-		if (StringUtils.equalsIgnoreCase(type, "createDB")) {
-			flag = "createDB";
-		} else if (StringUtils.equalsIgnoreCase(type, "dropDB")) {
-			flag = "dropDB";
-		} else if (StringUtils.equalsIgnoreCase(type, "drop")) {
-			flag = "drop";
-			// } else if (StringUtils.equalsIgnoreCase(type, "deleteTableContents")) {
-			// flag = "deleteTableContents";
-		}
-		List<String> containerEntityNames = new ArrayList<>();
-		containerEntityNames.addAll((List<String>) Config.resource(Config.RESOURCE_CONTAINERENTITYNAMES));
-		List<String> classNames = ListTools.includesExcludesWildcard(containerEntityNames,
-				Config.dumpRestoreData().getIncludes(), Config.dumpRestoreData().getExcludes());
-		File persistence = new File(Config.dir_local_temp_classes(), "persistence_sql.xml");
-		PersistenceXmlHelper.writeForDdl(persistence.getAbsolutePath());
-		OpenJPAEntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory("enhance",
-				persistence.getName());
-		System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!" + emf);
-		EntityManagerImpl em = (EntityManagerImpl) emf.createEntityManager();
-		String[] arguments = null;
-		String[] args = null;
-		Options opts = new Options();
-		if (StringUtils.equals(flag, "build") || StringUtils.equals(flag, "drop")
-				|| StringUtils.equals(flag, "createDB") || StringUtils.equals(flag, "dropDB")) {
-			arguments = new String[4];
-			File file = new File(Config.dir_local_temp_sql(true), flag + ".sql");
-			arguments[0] = "-schemaAction";
-			arguments[1] = flag;
-			arguments[2] = "-sql";
-			arguments[3] = file.getAbsolutePath();
-			args = opts.setFromCmdLine(arguments);
-			MappingTool.run((JDBCConfiguration) em.getConfiguration(), args, opts, null);
-			logger.print("file : {}.", file.getAbsolutePath());
-		} else if (StringUtils.equals(flag, "deleteTableContents")) {
-			// arguments = new String[2];
-			// arguments[0] = "-schemaAction";
-			// arguments[1] = flag;
-			// args = opts.setFromCmdLine(arguments);
-			// MappingTool.run((JDBCConfiguration) em.getConfiguration(), args, opts, null);
-			// logger.print("delete all table contents.");
-		}
-		em.close();
-		emf.close();
-		return true;
-	}
-
-}

+ 4 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentBbs.java

@@ -1,6 +1,8 @@
 package com.x.server.console.action;
 
 import com.x.base.core.entity.dataitem.ItemCategory;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.bbs.entity.BBSOperationRecord;
 import com.x.bbs.entity.BBSReplyInfo;
 import com.x.bbs.entity.BBSSubjectAttachment;
@@ -13,6 +15,8 @@ import com.x.bbs.entity.BBSVoteRecord;
 
 public class EraseContentBbs extends EraseContent {
 
+	private static Logger logger = LoggerFactory.getLogger(EraseContentBbs.class);
+	
 	@Override
 	public boolean execute() throws Exception {
 		this.init("bbs", ItemCategory.bbs);

+ 4 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentCms.java

@@ -1,6 +1,8 @@
 package com.x.server.console.action;
 
 import com.x.base.core.entity.dataitem.ItemCategory;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.cms.core.entity.CmsBatchOperation;
 import com.x.cms.core.entity.Document;
 import com.x.cms.core.entity.DocumentCommend;
@@ -16,6 +18,8 @@ import com.x.query.core.entity.Item;
 
 public class EraseContentCms extends EraseContent {
 
+	private static Logger logger = LoggerFactory.getLogger(EraseContentCms.class);
+	
 	@Override
 	public boolean execute() throws Exception {
 		this.init("cms", ItemCategory.cms);

+ 4 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentLog.java

@@ -1,5 +1,7 @@
 package com.x.server.console.action;
 
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.processplatform.core.entity.element.FormVersion;
 import com.x.processplatform.core.entity.element.ProcessVersion;
 import com.x.processplatform.core.entity.element.ScriptVersion;
@@ -11,6 +13,8 @@ import com.x.program.center.core.entity.WarnLog;
 
 public class EraseContentLog extends EraseContent {
 
+	private static Logger logger = LoggerFactory.getLogger(EraseContentLog.class);
+	
 	@Override
 	public boolean execute() throws Exception {
 		this.init("log", null);

+ 4 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentMessage.java

@@ -1,5 +1,7 @@
 package com.x.server.console.action;
 
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.message.core.entity.IMConversation;
 import com.x.message.core.entity.IMConversationExt;
 import com.x.message.core.entity.IMMsg;
@@ -10,6 +12,8 @@ import com.x.message.core.entity.Org;
 
 public class EraseContentMessage extends EraseContent {
 
+	private static Logger logger = LoggerFactory.getLogger(EraseContentMessage.class);
+
 	@Override
 	public boolean execute() throws Exception {
 		this.init("message", null);

+ 4 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentOrg.java

@@ -2,6 +2,8 @@ package com.x.server.console.action;
 
 import javax.wsdl.Definition;
 
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.organization.core.entity.Bind;
 import com.x.organization.core.entity.Custom;
 import com.x.organization.core.entity.Group;
@@ -19,6 +21,8 @@ import com.x.organization.core.entity.accredit.EmpowerLog;
 
 public class EraseContentOrg extends EraseContent {
 
+	private static Logger logger = LoggerFactory.getLogger(EraseContentOrg.class);
+	
 	@Override
 	public boolean execute() throws Exception {
 		this.init("org", null);

+ 4 - 0
o2server/x_console/src/main/java/com/x/server/console/action/EraseContentProcessPlatform.java

@@ -1,6 +1,8 @@
 package com.x.server.console.action;
 
 import com.x.base.core.entity.dataitem.ItemCategory;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.processplatform.core.entity.content.Attachment;
 import com.x.processplatform.core.entity.content.DocumentVersion;
 import com.x.processplatform.core.entity.content.Draft;
@@ -19,6 +21,8 @@ import com.x.query.core.entity.Item;
 
 public class EraseContentProcessPlatform extends EraseContent {
 
+	private static Logger logger = LoggerFactory.getLogger(EraseContentProcessPlatform.class);
+	
 	public boolean execute() throws Exception {
 		this.init("processPlatform", ItemCategory.pp);
 		addClass(Attachment.class);

+ 4 - 0
o2server/x_console/src/main/java/com/x/server/console/action/HttpStatus.java

@@ -13,6 +13,8 @@ import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.StringUtils;
 
 import com.x.base.core.project.config.Config;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.DateTools;
 import com.x.server.console.server.Servers;
 
@@ -21,6 +23,8 @@ import com.x.server.console.server.Servers;
  */
 public class HttpStatus extends Thread {
 
+	private static Logger logger = LoggerFactory.getLogger(HttpStatus.class);
+
 	private Integer repeat;
 
 	public HttpStatus(Integer repeat) {

+ 1 - 1
o2server/x_console/src/main/java/com/x/server/console/action/OperatingSystem.java

@@ -8,7 +8,7 @@ import com.x.base.core.project.logger.LoggerFactory;
 
 public class OperatingSystem extends Thread {
 
-	private static Logger logger = LoggerFactory.getLogger(DumpData.class);
+	private static Logger logger = LoggerFactory.getLogger(OperatingSystem.class);
 
 	private Integer count;
 

+ 1 - 1
o2server/x_console/src/main/java/com/x/server/console/action/ProcessPlatformExecutor.java

@@ -19,7 +19,7 @@ import org.apache.commons.lang3.StringUtils;
  */
 public class ProcessPlatformExecutor {
 
-	private static Logger logger = LoggerFactory.getLogger(RestoreData.class);
+	private static Logger logger = LoggerFactory.getLogger(ProcessPlatformExecutor.class);
 
 	 
 	public void execute() throws Exception {

+ 24 - 117
o2server/x_console/src/main/java/com/x/server/console/action/ThreadDump.java

@@ -1,74 +1,45 @@
 package com.x.server.console.action;
 
-import java.io.File;
-import java.lang.Thread.State;
-import java.util.Comparator;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.nio.file.Path;
 import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
+
+import org.apache.commons.lang3.SystemUtils;
 
 import com.x.base.core.project.config.Config;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.DateTools;
-import com.x.base.core.project.tools.DefaultCharset;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.ThreadUtils;
 
 public class ThreadDump {
 
-	private static Logger logger = LoggerFactory.getLogger(DumpData.class);
+	private static Logger logger = LoggerFactory.getLogger(ThreadDump.class);
 
 	public void execute(Integer count) throws Exception {
 		new Thread() {
 			public void run() {
 				try {
-					Map<Long, Integer> state_new = new HashMap<>();
-					Map<Long, Integer> state_runable = new HashMap<>();
-					Map<Long, Integer> state_blocked = new HashMap<>();
-					Map<Long, Integer> state_waiting = new HashMap<>();
-					Map<Long, Integer> state_timed_waiting = new HashMap<>();
-					Map<Long, Integer> state_terminated = new HashMap<>();
-					File startFile = null;
-					for (int i = 1; i <= count; i++) {
-						Date date = new Date();
-						StringBuffer buffer = new StringBuffer();
-						for (Thread thread : ThreadUtils.getAllThreads()) {
-							state(thread, state_new, state_runable, state_blocked, state_waiting,
-									state_timed_waiting, state_terminated);
-							dump(buffer, thread);
-						}
-						File file = new File(Config.dir_logs(true), fileName(i, count, date));
-						if (i == 1) {
-							startFile = file;
-						}
-						if (i != count) {
-							FileUtils.write(file, buffer, DefaultCharset.charset_utf_8);
-							logger.print(String.format("thread dump to file(%d/%d): %s.", i, count,
-									file.getAbsolutePath()));
-							Thread.sleep(5000);
+					RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean();
+					String jvmName = runtimeBean.getName();
+					long pid = Long.parseLong(jvmName.split("@")[0]);
+					Path path = SystemUtils.getJavaHome().toPath();
+					path = path.getParent().resolve("bin/jcmd").toAbsolutePath();
+					for (int i = 0; i < count; i++) {
+						Path out = Config.dir_logs(true).toPath()
+								.resolve("jcmd_Thread.print_" + pid + "_"
+										+ DateTools.format(new Date(), DateTools.formatCompact_yyyyMMddHHmmss) + ".txt")
+								.toAbsolutePath();
+						String cmd = path.toString() + " " + pid + " Thread.print >" + out.toString();
+						ProcessBuilder processBuilder = new ProcessBuilder();
+						if (SystemUtils.IS_OS_WINDOWS) {
+							processBuilder.command("cmd", "/c", cmd);
 						} else {
-							buffer.append(System.lineSeparator()).append("Thread state statistics:");
-							buffer.append(" NEW(" + state_new.size() + "),");
-							buffer.append(" RUNABLE(" + state_runable.size() + "),");
-							buffer.append(" blocked(" + state_blocked.size() + "),");
-							buffer.append(" waiting(" + state_waiting.size() + "),");
-							buffer.append(" timed_waiting(" + state_timed_waiting.size() + "),");
-							buffer.append(" terminated(" + state_terminated.size() + ").");
-							buffer.append(System.lineSeparator());
-							writeState(buffer, state_new, State.NEW, count);
-							writeState(buffer, state_runable, State.RUNNABLE, count);
-							writeState(buffer, state_blocked, State.BLOCKED, count);
-							writeState(buffer, state_waiting, State.WAITING, count);
-							writeState(buffer, state_timed_waiting, State.TIMED_WAITING, count);
-							writeState(buffer, state_terminated, State.TERMINATED, count);
-							FileUtils.write(file, buffer, DefaultCharset.charset_utf_8);
-							logger.print(String.format("thread dump to files: %s - %s.",
-									startFile.getAbsolutePath(), file.getAbsolutePath()));
+							processBuilder.command("sh", "-c", cmd);
 						}
+						processBuilder.start();
+						logger.print("thread dump to file:{}.", out.toString());
+						Thread.sleep(1000);
 					}
 				} catch (Exception e) {
 					e.printStackTrace();
@@ -76,68 +47,4 @@ public class ThreadDump {
 			}
 		}.start();
 	}
-
-	private void writeState(StringBuffer buffer, Map<Long, Integer> map, State state, Integer count) {
-		buffer.append(state).append(", count:").append(map.size()).append(".").append(System.lineSeparator());
-		map.entrySet().stream().sorted(Comparator.comparing(Entry::getValue, Comparator.reverseOrder())).forEach(o -> {
-			buffer.append("\t\t").append(o.getKey()).append(":").append(o.getValue()).append("/").append(count)
-					.append(System.lineSeparator());
-		});
-	}
-
-	private void state(Thread thread, Map<Long, Integer> state_new, Map<Long, Integer> state_runable,
-			Map<Long, Integer> state_blocked, Map<Long, Integer> state_waiting, Map<Long, Integer> state_timed_waiting,
-			Map<Long, Integer> state_terminated) {
-		Map<Long, Integer> state;
-		switch (thread.getState()) {
-			case NEW:
-				state = state_new;
-				break;
-			case RUNNABLE:
-				state = state_runable;
-				break;
-			case BLOCKED:
-				state = state_blocked;
-				break;
-			case WAITING:
-				state = state_waiting;
-				break;
-			case TIMED_WAITING:
-				state = state_timed_waiting;
-				break;
-			case TERMINATED:
-				state = state_terminated;
-				break;
-			default:
-				state = state_terminated;
-				break;
-		}
-		state.compute(thread.getId(), (k, v) -> {
-			if (null == v) {
-				return 1;
-			}
-			return v + 1;
-		});
-	}
-
-	private void dump(StringBuffer buffer, Thread thread) {
-		this.title(buffer, thread);
-		for (StackTraceElement stackTrace : thread.getStackTrace()) {
-			this.stackTrace(buffer, stackTrace);
-		}
-	}
-
-	private void title(StringBuffer buffer, Thread thread) {
-		buffer.append(String.format("id:%s, state:%s, threadGroup:%s, priority:%d.", thread.getId(), thread.getState(),
-				thread.getThreadGroup(), thread.getPriority())).append(System.lineSeparator());
-	}
-
-	private void stackTrace(StringBuffer buffer, StackTraceElement stackTraceElement) {
-		buffer.append("\t\t").append(stackTraceElement.toString()).append(System.lineSeparator());
-	}
-
-	private String fileName(int idx, int count, Date date) {
-		return "stack_" + DateTools.format(date, "yyyyMMddHHmmssSSS") + "_"
-				+ StringUtils.repeat('0', ((count + "").length()) - ((idx + "").length())) + idx + "_" + count + ".txt";
-	}
 }