From 8e8698fb5eb5bbf01a159dff55a3752fdd251516 Mon Sep 17 00:00:00 2001 From: Zhou Rui Date: Tue, 31 Mar 2020 12:50:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- o2server/configSample/node_127.0.0.1.json | 3 +- .../x/base/core/project/config/Config.java | 25 +- .../com/x/base/core/project/config/Node.java | 16 +- .../com/x/server/console/CommandFactory.java | 107 ++-- .../com/x/server/console/DumpDataTask.java | 6 +- .../com/x/server/console/DumpStorageTask.java | 6 +- .../main/java/com/x/server/console/Main.java | 550 ++++++------------ .../com/x/server/console/OptionFactory.java | 27 - .../com/x/server/console/RestoreDataTask.java | 15 +- .../x/server/console/RestoreStorageTask.java | 15 +- .../action/ActionDebugDesignDetail.java | 238 ++++++++ .../action/ActionDebugDetailDisplay.java | 146 ----- .../server/console/action/ActionHeapDump.java | 89 --- .../server/console/action/ActionShowCpu.java | 53 -- .../console/action/ActionShowHttpThread.java | 61 -- .../console/action/ActionShowMemory.java | 51 -- .../x/server/console/action/ActionShowOs.java | 55 -- .../console/action/ActionShowThread.java | 50 -- .../x/server/console/action/ActionStack.java | 144 ----- .../server/console/action/ActionVersion.java | 94 +-- ...onCompactData.java => CompactLocalH2.java} | 36 +- .../{ActionDumpData.java => DumpData.java} | 47 +- ...ctionDumpStorage.java => DumpStorage.java} | 20 +- ...seContentBbs.java => EraseContentBbs.java} | 10 +- ...seContentCms.java => EraseContentCms.java} | 8 +- ...seContentLog.java => EraseContentLog.java} | 8 +- ....java => EraseContentProcessPlatform.java} | 10 +- .../com/x/server/console/action/HeapDump.java | 38 ++ .../console/action/OperatingSystem.java | 37 ++ .../action/ProcessPlatformExecutor.java | 45 ++ ...ctionRestoreData.java => RestoreData.java} | 68 +-- ...estoreStorage.java => RestoreStorage.java} | 130 ++--- .../x/server/console/action/ThreadDump.java | 145 +++++ .../x/server/console/action/ThreadStatus.java | 55 ++ 34 files changed, 984 insertions(+), 1424 deletions(-) delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/OptionFactory.java create mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDesignDetail.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDetailDisplay.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionHeapDump.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionShowCpu.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionShowHttpThread.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionShowMemory.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionShowOs.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionShowThread.java delete mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ActionStack.java rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionCompactData.java => CompactLocalH2.java} (70%) rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionDumpData.java => DumpData.java} (79%) rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionDumpStorage.java => DumpStorage.java} (93%) rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionEraseContentBbs.java => EraseContentBbs.java} (74%) rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionEraseContentCms.java => EraseContentCms.java} (81%) rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionEraseContentLog.java => EraseContentLog.java} (70%) rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionEraseContentProcessPlatform.java => EraseContentProcessPlatform.java} (95%) create mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/HeapDump.java create mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/OperatingSystem.java create mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ProcessPlatformExecutor.java rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionRestoreData.java => RestoreData.java} (80%) rename o2server/x_console/src/main/java/com/x/server/console/action/{ActionRestoreStorage.java => RestoreStorage.java} (58%) create mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ThreadDump.java create mode 100644 o2server/x_console/src/main/java/com/x/server/console/action/ThreadStatus.java diff --git a/o2server/configSample/node_127.0.0.1.json b/o2server/configSample/node_127.0.0.1.json index 30938509f8..9a6cf33f7c 100644 --- a/o2server/configSample/node_127.0.0.1.json +++ b/o2server/configSample/node_127.0.0.1.json @@ -186,5 +186,6 @@ "###nodeAgentEncrypt": "是否启用节点代理加密###", "###quickStartWebApp": "是否使用快速应用部署###", "###banner": "服务器控制台启动标识###", - "###autoStart": "是否自动启动###" + "###autoStart": "是否自动启动###", + "###eraseContentEnable": "是否允许使用擦除数据功能###" } \ No newline at end of file diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java index be754eb9a1..c4dbb38791 100644 --- a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java +++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Config.java @@ -13,20 +13,22 @@ import java.util.concurrent.LinkedBlockingQueue; import javax.naming.InitialContext; import javax.ws.rs.core.MediaType; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.filefilter.WildcardFileFilter; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; -import org.eclipse.jetty.http.MimeTypes; - import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.x.base.core.project.x_program_center; +import com.x.base.core.project.gson.XGsonBuilder; import com.x.base.core.project.tools.BaseTools; import com.x.base.core.project.tools.DefaultCharset; import com.x.base.core.project.tools.Host; import com.x.base.core.project.tools.NumberTools; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.io.filefilter.WildcardFileFilter; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jetty.http.MimeTypes; + public class Config { private static Config INSTANCE; @@ -449,7 +451,14 @@ public class Config { if (null == instance().version) { synchronized (Config.class) { if (null == instance().version) { - instance().version = BaseTools.readCfg(PATH_VERSION); + String text = BaseTools.readCfg(PATH_VERSION); + if (XGsonBuilder.isJson(text)) { + JsonObject obj = XGsonBuilder.instance().fromJson(text, JsonObject.class); + instance().version = obj.get("version").getAsString(); + } else { + instance().version = text; + } + } } } diff --git a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java index c13bc3ac83..6a45930ab1 100644 --- a/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java +++ b/o2server/x_base_core_project/src/main/java/com/x/base/core/project/config/Node.java @@ -1,12 +1,11 @@ package com.x.base.core.project.config; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; - import com.x.base.core.project.annotation.FieldDescribe; -import com.x.base.core.project.tools.BaseTools; import com.x.base.core.project.tools.DateTools; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; + public class Node extends ConfigObject { public static final Integer default_nodeAgentPort = 20010; @@ -75,6 +74,8 @@ public class Node extends ConfigObject { private String banner; @FieldDescribe("是否自动启动") private Boolean autoStart; + @FieldDescribe("是否允许使用擦除数据功能") + private Boolean eraseContentEnable; /* 20191009兼容centerServer */ protected void setCenter(CenterServer centerServer) { @@ -82,6 +83,11 @@ public class Node extends ConfigObject { } /* 20191009兼容centerServer end */ + + public Boolean getEraseContentEnable() { + return BooleanUtils.isNotFalse(eraseContentEnable); + } + public Boolean autoStart() { return BooleanUtils.isNotFalse(autoStart); } @@ -325,4 +331,6 @@ public class Node extends ConfigObject { } + + } diff --git a/o2server/x_console/src/main/java/com/x/server/console/CommandFactory.java b/o2server/x_console/src/main/java/com/x/server/console/CommandFactory.java index d1e14b8cc5..4f02d5f60c 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/CommandFactory.java +++ b/o2server/x_console/src/main/java/com/x/server/console/CommandFactory.java @@ -26,18 +26,23 @@ public class CommandFactory { public static final Pattern stop_pattern = Pattern .compile("^ {0,}stop {0,}(data|storage|center|application|web|all|) {0,}$", Pattern.CASE_INSENSITIVE); - public static final Pattern dump_path_pattern = Pattern.compile("^ {0,}dump (data|storage) path (.+) (.+)$", - Pattern.CASE_INSENSITIVE); + // public static final Pattern dump_path_pattern = Pattern.compile("^ {0,}dump + // (data|storage) path (.+) (.+)$", + // Pattern.CASE_INSENSITIVE); - public static final Pattern dump_pattern = Pattern.compile("^ {0,}dump {0,}(data|storage) (.+)$", - Pattern.CASE_INSENSITIVE); + // public static final Pattern dump_pattern = Pattern.compile("^ {0,}dump + // {0,}(data|storage) (.+)$", + // Pattern.CASE_INSENSITIVE); - public static final Pattern restore_path_pattern = Pattern - .compile("^ {0,}restore {1,}(data|storage) {1,}path {1,}(.+) {1,}(.+)$", Pattern.CASE_INSENSITIVE); + // public static final Pattern restore_path_pattern = Pattern + // .compile("^ {0,}restore {1,}(data|storage) {1,}path {1,}(.+) {1,}(.+)$", + // Pattern.CASE_INSENSITIVE); - public static final Pattern restore_pattern = Pattern.compile( - "^ {0,}restore {0,}(data|storage) {0,}([2][0][1-9][0-9][0-1][0-9][0-3][0-9][0-5][0-9][0-5][0-9][0-5][0-9]) (.+)$", - Pattern.CASE_INSENSITIVE); + // public static final Pattern restore_pattern = Pattern.compile( + // "^ {0,}restore {0,}(data|storage) + // {0,}([2][0][1-9][0-9][0-1][0-9][0-3][0-9][0-5][0-9][0-5][0-9][0-5][0-9]) + // (.+)$", + // Pattern.CASE_INSENSITIVE); public static final Pattern help_pattern = Pattern.compile("^ {0,}help {0,}$", Pattern.CASE_INSENSITIVE); @@ -51,37 +56,12 @@ public class CommandFactory { public static final Pattern setPassword_pattern = Pattern.compile("^ {0,}setPassword (.+) (.+)$", Pattern.CASE_INSENSITIVE); - public static final Pattern erase_content_pattern = Pattern.compile("^ {0,}erase content (cms|pp|bbs|log) (.+)$", - Pattern.CASE_INSENSITIVE); - - public static final Pattern compact_data_pattern = Pattern.compile("^ {0,}compact data (.+)$", - Pattern.CASE_INSENSITIVE); - public static final Pattern convert_dataItem_pattern = Pattern.compile("^ {0,}convert dataItem (.+)$", Pattern.CASE_INSENSITIVE); - public static final Pattern show_os_pattern = Pattern.compile("^ {0,}show os ([1-9][0-9]*) ([1-9][0-9]*) {0,}$", - Pattern.CASE_INSENSITIVE); - - public static final Pattern show_memory_pattern = Pattern - .compile("^ {0,}show memory ([1-9][0-9]*) ([1-9][0-9]*) {0,}$", Pattern.CASE_INSENSITIVE); - - public static final Pattern show_thread_pattern = Pattern - .compile("^ {0,}show thread ([1-9][0-9]*) ([1-9][0-9]*) {0,}$", Pattern.CASE_INSENSITIVE); - - public static final Pattern show_cpu_pattern = Pattern.compile("^ {0,}show cpu ([1-9][0-9]*) ([1-9][0-9]*) {0,}$", - Pattern.CASE_INSENSITIVE); - - public static final Pattern show_http_thread_pattern = Pattern - .compile("^ {0,}show http thread ([1-9][0-9]*) ([1-9][0-9]*) {0,}$", Pattern.CASE_INSENSITIVE); - - public static final Pattern stack_pattern = Pattern.compile("^ {0,}stack ([1-9][0-9]*) ([1-9][0-9]*) (.+)$", + public static final Pattern debugDesignDetail_pattern = Pattern.compile("^(\\s*)ddd(\\s*)", Pattern.CASE_INSENSITIVE); - public static final Pattern heapDump_pattern = Pattern.compile("^ {0,}heap dump (.+)$", Pattern.CASE_INSENSITIVE); - - public static final Pattern debugDetailDisplay_pattern = Pattern.compile("^(\\s*)ddd(\\s*)", Pattern.CASE_INSENSITIVE); - public static void printStartHelp() { try { printStartImage(); @@ -104,46 +84,49 @@ public class CommandFactory { public static void printHelpLine() { try { String help = ""; - help += " help" + "\t\t\t\t\t\t\t" + "show useage message."; - help += StringUtils.LF; - help += " start|stop [all]" + "\t\t\t\t\t" + "start stop all enable server."; - help += StringUtils.LF; - help += " start|stop data" + "\t\t\t\t\t" + "start stop data server."; + help += " help show useage message."; help += StringUtils.LF; - help += " start|stop storage" + "\t\t\t\t\t" + "start stop storage server."; + help += " start|stop [all] start stop all enable server."; help += StringUtils.LF; - help += " start|stop center" + "\t\t\t\t\t" + "start stop center server."; + help += " start|stop data start stop data server."; help += StringUtils.LF; - help += " start|stop application" + "\t\t\t\t\t" + "start stop application server."; + help += " start|stop storage start stop storage server."; help += StringUtils.LF; - help += " start|stop web" + "\t\t\t\t\t\t" + "start stop web server."; + help += " start|stop center start stop center server."; help += StringUtils.LF; - help += " dump data (passwd)" + "\t\t\t\t\t" + "dump data from database."; + help += " start|stop application start stop application server."; help += StringUtils.LF; - help += " dump storage (passwd)" + "\t\t\t\t\t" + "dump storage from database,file."; + help += " start|stop web start stop web server."; help += StringUtils.LF; - help += " restore data yyyyMMddHHmmss (passwd)" + "\t\t\t" + "restore data to database."; - help += StringUtils.LF; - help += " restore storage yyyyMMddHHmmss (passwd)" + "\t\t" + "restore storage to database,file."; - help += StringUtils.LF; - help += " setPassword (oldpasswd) (newpasswd)" + "\t\t\t" + "change initial manager password."; + // help += " dump data (passwd) dump data from database."; // help += StringUtils.LF; - // help += " update (backup) (latest) (passwd)" + "\t\t\t" + "upgrade to new - // version."; - help += StringUtils.LF; - help += " update file (path) (backup) (passwd)" + "\t\t\t" + "upgrade to new version from local zip file."; - help += StringUtils.LF; - help += " compact data (passwd)" + "\t\t\t\t\t" + "compact local h2 repository database."; + // help += " dump storage (passwd) dump storage from database,file."; + // help += StringUtils.LF; + // help += " restore data yyyyMMddHHmmss (passwd)" + "\t\t\t" + "restore data to + // database."; + // help += StringUtils.LF; + // help += " restore storage yyyyMMddHHmmss (passwd)" + "\t\t" + "restore + // storage to database,file."; + // help += StringUtils.LF; + help += " setPassword (oldpasswd) (newpasswd) change initial manager password."; help += StringUtils.LF; - help += " erase content (cms|pp|bbs|log) (passwd)" + "\t\t" + "remove all data except design."; + help += " update file (path) (backup) (passwd) upgrade to new version from local zip file."; help += StringUtils.LF; - help += " create encrypt key" + "\t\t\t\t\t" + "create random RSA key."; + // help += " compact data (passwd) compact local h2 repository database."; + // help += StringUtils.LF; + // help += " erase content (cms|pp|bbs|log) (passwd)" + "\t\t" + "remove all + // data except design."; + // help += StringUtils.LF; + help += " create encrypt key create random RSA key."; + // help += StringUtils.LF; + // help += " show (os|cpu|memory|thread) interval repeat" + "\t\t" + "show + // operating system infomation."; help += StringUtils.LF; - help += " show (os|cpu|memory|thread) interval repeat" + "\t\t" + "show operating system infomation."; + help += " version show available update version."; help += StringUtils.LF; - help += " version " + "\t\t\t\t\t\t" + "show available update version."; + help += " exit exit after stop."; help += StringUtils.LF; - help += " exit" + "\t\t\t\t\t\t\t" + "exit after stop."; + help += " ddd - option debug design detail command with argument."; help += StringUtils.LF; System.out.println(help); } catch (Exception e) { diff --git a/o2server/x_console/src/main/java/com/x/server/console/DumpDataTask.java b/o2server/x_console/src/main/java/com/x/server/console/DumpDataTask.java index 9408fc50d9..9dd748dbb3 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/DumpDataTask.java +++ b/o2server/x_console/src/main/java/com/x/server/console/DumpDataTask.java @@ -16,7 +16,7 @@ import org.quartz.JobExecutionException; 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.server.console.action.ActionDumpData; +import com.x.server.console.action.DumpData; public class DumpDataTask implements Job { @@ -26,8 +26,8 @@ public class DumpDataTask implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { logger.print("schedule dump data task start."); - ActionDumpData action = new ActionDumpData(); - action.execute(Config.currentNode().dumpData().path(), Config.token().getPassword()); + DumpData action = new DumpData(); + action.execute(Config.currentNode().dumpData().path()); if (Config.currentNode().dumpData().size() > 0) { File dir = new File(Config.base(), "local/dump"); List list = new ArrayList<>(); diff --git a/o2server/x_console/src/main/java/com/x/server/console/DumpStorageTask.java b/o2server/x_console/src/main/java/com/x/server/console/DumpStorageTask.java index 5aaaa5a4db..6b345653ea 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/DumpStorageTask.java +++ b/o2server/x_console/src/main/java/com/x/server/console/DumpStorageTask.java @@ -16,7 +16,7 @@ import org.quartz.JobExecutionException; 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.server.console.action.ActionDumpStorage; +import com.x.server.console.action.DumpStorage; public class DumpStorageTask implements Job { @@ -26,8 +26,8 @@ public class DumpStorageTask implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { try { logger.print("schedule dump storage task start."); - ActionDumpStorage action = new ActionDumpStorage(); - action.execute(Config.currentNode().dumpStorage().path(), Config.token().getPassword()); + DumpStorage action = new DumpStorage(); + action.execute(Config.currentNode().dumpStorage().path()); if (Config.currentNode().dumpStorage().size() > 0) { File dir = new File(Config.base(), "local/dump"); List list = new ArrayList<>(); diff --git a/o2server/x_console/src/main/java/com/x/server/console/Main.java b/o2server/x_console/src/main/java/com/x/server/console/Main.java index 79659759d8..8f400974d8 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/Main.java +++ b/o2server/x_console/src/main/java/com/x/server/console/Main.java @@ -12,14 +12,20 @@ import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import java.nio.channels.FileLock; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Date; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import java.util.regex.Matcher; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jetty.deploy.App; +import org.eclipse.jetty.deploy.DeploymentManager; +import org.quartz.Scheduler; + import com.x.base.core.project.config.ApplicationServer; import com.x.base.core.project.config.CenterServer; import com.x.base.core.project.config.Config; @@ -28,39 +34,15 @@ import com.x.base.core.project.config.StorageServer; import com.x.base.core.project.config.WebServer; import com.x.base.core.project.tools.DefaultCharset; import com.x.base.core.project.tools.StringTools; -import com.x.server.console.action.ActionCompactData; import com.x.server.console.action.ActionConfig; import com.x.server.console.action.ActionCreateEncryptKey; -import com.x.server.console.action.ActionDebugDetailDisplay; -import com.x.server.console.action.ActionDumpData; -import com.x.server.console.action.ActionDumpStorage; -import com.x.server.console.action.ActionEraseContentBbs; -import com.x.server.console.action.ActionEraseContentCms; -import com.x.server.console.action.ActionEraseContentLog; -import com.x.server.console.action.ActionEraseContentProcessPlatform; -import com.x.server.console.action.ActionHeapDump; -import com.x.server.console.action.ActionRestoreData; -import com.x.server.console.action.ActionRestoreStorage; +import com.x.server.console.action.ActionDebugDesignDetail; import com.x.server.console.action.ActionSetPassword; -import com.x.server.console.action.ActionShowCpu; -import com.x.server.console.action.ActionShowHttpThread; -import com.x.server.console.action.ActionShowMemory; -import com.x.server.console.action.ActionShowOs; -import com.x.server.console.action.ActionShowThread; -import com.x.server.console.action.ActionStack; import com.x.server.console.action.ActionUpdateFile; import com.x.server.console.action.ActionVersion; import com.x.server.console.log.LogTools; import com.x.server.console.server.Servers; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; -import org.eclipse.jetty.deploy.App; -import org.eclipse.jetty.deploy.DeploymentManager; -import org.quartz.Scheduler; - public class Main { private static final String MANIFEST_FILENAME = "manifest.cfg"; @@ -82,8 +64,8 @@ public class Main { throw new Exception("无法找到当前节点,请检查config/node_{name}.json与local/node.cfg文件内容中的名称是否一致."); } final LinkedBlockingQueue commandQueue = new LinkedBlockingQueue<>(); -// try (PipedInputStream pipedInput = new PipedInputStream(); -// PipedOutputStream pipedOutput = new PipedOutputStream(pipedInput)) { + // try (PipedInputStream pipedInput = new PipedInputStream(); + // PipedOutputStream pipedOutput = new PipedOutputStream(pipedInput)) { new Thread() { /* 文件中的命令输出到解析器 */ public void run() { @@ -160,152 +142,110 @@ public class Main { continue; } - matcher = CommandFactory.show_os_pattern.matcher(cmd); - if (matcher.find()) { - showOs(matcher.group(1), matcher.group(2)); - continue; - } - - matcher = CommandFactory.show_cpu_pattern.matcher(cmd); - if (matcher.find()) { - showCpu(matcher.group(1), matcher.group(2)); - continue; - } - - matcher = CommandFactory.stack_pattern.matcher(cmd); - if (matcher.find()) { - stack(matcher.group(1), matcher.group(2), matcher.group(3)); - continue; - } - - matcher = CommandFactory.heapDump_pattern.matcher(cmd); - if (matcher.find()) { - heapDump(matcher.group(1)); - continue; - } - - matcher = CommandFactory.show_memory_pattern.matcher(cmd); - if (matcher.find()) { - showMemory(matcher.group(1), matcher.group(2)); - continue; - } - - matcher = CommandFactory.show_thread_pattern.matcher(cmd); - if (matcher.find()) { - showThread(matcher.group(1), matcher.group(2)); - continue; - } - - matcher = CommandFactory.show_http_thread_pattern.matcher(cmd); - if (matcher.find()) { - showHttpThread(matcher.group(1), matcher.group(2)); - continue; - } - matcher = CommandFactory.start_pattern.matcher(cmd); if (matcher.find()) { switch (matcher.group(1)) { - case "application": - startApplicationServer(); - break; - case "center": - startCenterServer(); - break; - case "web": - startWebServer(); - break; - case "storage": - startStorageServer(); - break; - case "data": - startDataServer(); - break; - default: - startAll(); - break; + case "application": + startApplicationServer(); + break; + case "center": + startCenterServer(); + break; + case "web": + startWebServer(); + break; + case "storage": + startStorageServer(); + break; + case "data": + startDataServer(); + break; + default: + startAll(); + break; } continue; } matcher = CommandFactory.stop_pattern.matcher(cmd); if (matcher.find()) { switch (matcher.group(1)) { - case "application": - stopApplicationServer(); - break; - case "center": - stopCenterServer(); - break; - case "web": - stopWebServer(); - break; - case "storage": - stopStorageServer(); - break; - case "data": - stopDataServer(); - break; - default: - stopAll(); - break; - } - continue; - } - matcher = CommandFactory.dump_path_pattern.matcher(cmd); - if (matcher.find()) { - switch (matcher.group(1)) { - case "data": - dumpData(matcher.group(2), matcher.group(3)); - break; - case "storage": - dumpStorage(matcher.group(2), matcher.group(3)); - break; - default: - break; - } - continue; - } - matcher = CommandFactory.dump_pattern.matcher(cmd); - if (matcher.find()) { - switch (matcher.group(1)) { - case "data": - dumpData("", matcher.group(2)); - break; - case "storage": - dumpStorage("", matcher.group(2)); - break; - default: - break; - } - continue; - } - matcher = CommandFactory.restore_path_pattern.matcher(cmd); - if (matcher.find()) { - switch (matcher.group(1)) { - case "data": - resotreDataPath(matcher.group(2), matcher.group(3)); - break; - case "storage": - resotreStoragePath(matcher.group(2), matcher.group(3)); - break; - default: - break; - } - continue; - } - matcher = CommandFactory.restore_pattern.matcher(cmd); - if (matcher.find()) { - switch (matcher.group(1)) { - case "data": - resotreData(matcher.group(2), matcher.group(3)); - break; - case "storage": - resotreStorage(matcher.group(2), matcher.group(3)); - break; - default: - break; + case "application": + stopApplicationServer(); + break; + case "center": + stopCenterServer(); + break; + case "web": + stopWebServer(); + break; + case "storage": + stopStorageServer(); + break; + case "data": + stopDataServer(); + break; + default: + stopAll(); + break; } continue; } + // matcher = CommandFactory.dump_path_pattern.matcher(cmd); + // if (matcher.find()) { + // switch (matcher.group(1)) { + // case "data": + // dumpData(matcher.group(2), matcher.group(3)); + // break; + // case "storage": + // dumpStorage(matcher.group(2), matcher.group(3)); + // break; + // default: + // break; + // } + // continue; + // } + // matcher = CommandFactory.dump_pattern.matcher(cmd); + // if (matcher.find()) { + // switch (matcher.group(1)) { + // case "data": + // dumpData("", matcher.group(2)); + // break; + // case "storage": + // dumpStorage("", matcher.group(2)); + // break; + // default: + // break; + // } + // continue; + // } + // matcher = CommandFactory.restore_path_pattern.matcher(cmd); + // if (matcher.find()) { + // switch (matcher.group(1)) { + // case "data": + // resotreDataPath(matcher.group(2), matcher.group(3)); + // break; + // case "storage": + // resotreStoragePath(matcher.group(2), matcher.group(3)); + // break; + // default: + // break; + // } + // continue; + // } + // matcher = CommandFactory.restore_pattern.matcher(cmd); + // if (matcher.find()) { + // switch (matcher.group(1)) { + // case "data": + // resotreData(matcher.group(2), matcher.group(3)); + // break; + // case "storage": + // resotreStorage(matcher.group(2), matcher.group(3)); + // break; + // default: + // break; + // } + // continue; + // } matcher = CommandFactory.help_pattern.matcher(cmd); if (matcher.find()) { CommandFactory.printHelp(); @@ -338,43 +278,15 @@ public class Main { } } - matcher = CommandFactory.erase_content_pattern.matcher(cmd); - if (matcher.find()) { - switch (matcher.group(1)) { - case "pp": - eraseContentProcessPlatform(matcher.group(2)); - break; - case "cms": - eraseContentCms(matcher.group(2)); - break; - case "log": - eraseContentLog(matcher.group(2)); - break; - case "bbs": - eraseContentBbs(matcher.group(2)); - break; - - default: - break; - } - continue; - } - - matcher = CommandFactory.compact_data_pattern.matcher(cmd); - if (matcher.find()) { - compactData(matcher.group(1)); - continue; - } - matcher = CommandFactory.create_encrypt_key_pattern.matcher(cmd); if (matcher.find()) { createEncryptKey(matcher.group(1)); continue; } - matcher = CommandFactory.debugDetailDisplay_pattern.matcher(cmd); + matcher = CommandFactory.debugDesignDetail_pattern.matcher(cmd); if (matcher.find()) { - debugDetailDisplay(cmd); + debugDesignDetail(cmd); continue; } @@ -405,51 +317,8 @@ public class Main { } return true; } - - private static boolean showOs(String interval, String repeat) { - try { - return new ActionShowOs().execute(Integer.parseInt(interval, 10), Integer.parseInt(repeat, 10)); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - private static boolean showCpu(String interval, String repeat) { - try { - return new ActionShowCpu().execute(Integer.parseInt(interval, 10), Integer.parseInt(repeat, 10)); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - private static boolean showMemory(String interval, String repeat) { - try { - return new ActionShowMemory().execute(Integer.parseInt(interval, 10), Integer.parseInt(repeat, 10)); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - private static boolean showThread(String interval, String repeat) { - try { - return new ActionShowThread().execute(Integer.parseInt(interval, 10), Integer.parseInt(repeat, 10)); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - private static boolean showHttpThread(String interval, String repeat) { - try { - return new ActionShowHttpThread().execute(Integer.parseInt(interval, 10), Integer.parseInt(repeat, 10)); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } + + private static boolean createEncryptKey(String password) { try { @@ -682,82 +551,81 @@ public class Main { } } - private static boolean dumpData(String path, String password) { - try { - return (new ActionDumpData()).execute(path, password); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - private static boolean dumpStorage(String path, String password) { - try { - return (new ActionDumpStorage()).execute(path, password); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - private static void resotreData(String dateString, String password) { - try { - SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); - Date date = format.parse(dateString); - File file = new File(Config.base(), "local/dump/dumpData_" + format.format(date)); - if (file.exists() && file.isDirectory()) { - (new ActionRestoreData()).execute(date, password); - } else { - System.out.println("directory " + file.getAbsolutePath() + " not existed."); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - private static void resotreDataPath(String path, String password) { - try { - (new ActionRestoreData()).execute(path, password); - } catch (Exception e) { - e.printStackTrace(); - } - } - - private static void resotreStorage(String dateString, String password) { - try { - SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); - Date date = format.parse(dateString); - File file = new File(Config.base(), "local/dump/dumpStorage_" + format.format(date)); - if (file.exists() && file.isDirectory()) { - ActionRestoreStorage restoreStorage = new ActionRestoreStorage(); - restoreStorage.execute(date, password); - } else { - System.out.println("directory " + file.getAbsolutePath() + " not existed."); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - - private static void debugDetailDisplay(String cmd) { +// private static boolean dumpData(String path, String password) { +// try { +// return (new ActionDumpData()).execute(path, password); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return true; +// } +// +// private static boolean dumpStorage(String path, String password) { +// try { +// return (new ActionDumpStorage()).execute(path, password); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return true; +// } + +// private static void resotreData(String dateString, String password) { +// try { +// SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); +// Date date = format.parse(dateString); +// File file = new File(Config.base(), "local/dump/dumpData_" + format.format(date)); +// if (file.exists() && file.isDirectory()) { +// (new ActionRestoreData()).execute(date, password); +// } else { +// System.out.println("directory " + file.getAbsolutePath() + " not existed."); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// private static void resotreDataPath(String path, String password) { +// try { +// (new ActionRestoreData()).execute(path, password); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + +// private static void resotreStorage(String dateString, String password) { +// try { +// SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); +// Date date = format.parse(dateString); +// File file = new File(Config.base(), "local/dump/dumpStorage_" + format.format(date)); +// if (file.exists() && file.isDirectory()) { +// ActionRestoreStorage restoreStorage = new ActionRestoreStorage(); +// restoreStorage.execute(date, password); +// } else { +// System.out.println("directory " + file.getAbsolutePath() + " not existed."); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + private static void debugDesignDetail(String cmd) { try { String[] args = StringTools.translateCommandline(cmd); args = Arrays.copyOfRange(args, 1, args.length); - ActionDebugDetailDisplay action = new ActionDebugDetailDisplay(); - action.execute(args); + ActionDebugDesignDetail action = new ActionDebugDesignDetail(); + action.execute(args); } catch (Exception e) { e.printStackTrace(); } } - private static void resotreStoragePath(String path, String password) { - try { - new ActionRestoreStorage().execute(path, password); - } catch (Exception e) { - e.printStackTrace(); - } - } +// private static void resotreStoragePath(String path, String password) { +// try { +// new ActionRestoreStorage().execute(path, password); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } private static void createTempClassesDirectory(String base) throws Exception { File local_temp_classes_dir = new File(base, "local/temp/classes"); @@ -914,67 +782,15 @@ public class Main { return false; } - private static boolean compactData(String password) throws Exception { - try { - return new ActionCompactData().execute(password); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - - private static boolean eraseContentProcessPlatform(String password) throws Exception { - try { - return new ActionEraseContentProcessPlatform().execute(password); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } +// private static boolean compactData(String password) throws Exception { +// try { +// return new ActionCompactData().execute(password); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// return false; +// } - private static boolean eraseContentCms(String password) throws Exception { - try { - return new ActionEraseContentCms().execute(password); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - - private static boolean eraseContentBbs(String password) throws Exception { - try { - return new ActionEraseContentBbs().execute(password); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - - private static boolean eraseContentLog(String password) throws Exception { - try { - return new ActionEraseContentLog().execute(password); - } catch (Exception e) { - e.printStackTrace(); - } - return false; - } - - private static boolean stack(String count, String interval, String password) { - try { - return new ActionStack().execute(Integer.parseInt(count, 10), Integer.parseInt(interval, 10), password); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } - - private static boolean heapDump(String password) { - try { - return new ActionHeapDump().execute(password); - } catch (Exception e) { - e.printStackTrace(); - } - return true; - } + } \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/OptionFactory.java b/o2server/x_console/src/main/java/com/x/server/console/OptionFactory.java deleted file mode 100644 index 7f439851cf..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/OptionFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.x.server.console; - -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; - -public class OptionFactory { - - public static Options options() { - Options ops = new Options(); - ops.addOption(new Option("help", "print usage message.")); - ops.addOption(start()); - ops.addOption(exit()); - return ops; - } - - private static Option start() { - Option o = Option.builder("start").hasArg().argName("center|storage|data|web|application|all") - .desc("start server or start all server alone.").build(); - return o; - } - - private static Option exit() { - Option o = Option.builder("exit").desc("stop all server and exit.").build(); - return o; - } - -} diff --git a/o2server/x_console/src/main/java/com/x/server/console/RestoreDataTask.java b/o2server/x_console/src/main/java/com/x/server/console/RestoreDataTask.java index 895ec6ee8c..26e2cbf519 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/RestoreDataTask.java +++ b/o2server/x_console/src/main/java/com/x/server/console/RestoreDataTask.java @@ -1,14 +1,13 @@ package com.x.server.console; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - 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.action.ActionRestoreData; +import com.x.server.console.action.RestoreData; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; public class RestoreDataTask implements Job { @@ -19,8 +18,8 @@ public class RestoreDataTask implements Job { try { logger.print("schedule restore data task start, restore from:{}.", Config.currentNode().restoreData().path()); - ActionRestoreData action = new ActionRestoreData(); - action.execute(Config.currentNode().restoreData().path(), Config.token().getPassword()); + RestoreData action = new RestoreData(); + action.execute(Config.currentNode().restoreData().path()); } catch (Exception e) { throw new JobExecutionException(e); } diff --git a/o2server/x_console/src/main/java/com/x/server/console/RestoreStorageTask.java b/o2server/x_console/src/main/java/com/x/server/console/RestoreStorageTask.java index 20a4fb0487..c6314daa18 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/RestoreStorageTask.java +++ b/o2server/x_console/src/main/java/com/x/server/console/RestoreStorageTask.java @@ -1,14 +1,13 @@ package com.x.server.console; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - 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.action.ActionRestoreStorage; +import com.x.server.console.action.RestoreStorage; + +import org.quartz.Job; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; public class RestoreStorageTask implements Job { @@ -19,8 +18,8 @@ public class RestoreStorageTask implements Job { try { logger.print("schedule restore storage task start, restore from:{}.", Config.currentNode().restoreData().path()); - ActionRestoreStorage action = new ActionRestoreStorage(); - action.execute(Config.currentNode().restoreStorage().path(), Config.token().getPassword()); + RestoreStorage action = new RestoreStorage(); + action.execute(Config.currentNode().restoreStorage().path()); } catch (Exception e) { throw new JobExecutionException(e); } diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDesignDetail.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDesignDetail.java new file mode 100644 index 0000000000..6072a29715 --- /dev/null +++ b/o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDesignDetail.java @@ -0,0 +1,238 @@ +package com.x.server.console.action; + +import java.util.Objects; + +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 org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.math.NumberUtils; + +/* +@author zhourui + +*/ +public class ActionDebugDesignDetail extends ActionBase { + + private static Logger logger = LoggerFactory.getLogger(ActionDebugDesignDetail.class); + + private static Options options = new Options(); + + private static final String CMD_PPE = "ppe"; + private static final String CMD_OS = "os"; + private static final String CMD_TS = "ts"; + private static final String CMD_HD = "hd"; + private static final String CMD_TD = "td"; + private static final String CMD_EC = "ec"; + private static final String CMD_DD = "dd"; + private static final String CMD_DS = "ds"; + private static final String CMD_RD = "rd"; + private static final String CMD_RS = "rs"; + private static final String CMD_CLH2 = "clh2"; + + private static final int REPEAT_MAX = 100; + private static final int REPEAT_MIN = 1; + + public void execute(String... args) { + try { + CommandLineParser parser = new DefaultParser(); + CommandLine cmd = parser.parse(options(), args); + if (cmd.hasOption(CMD_PPE)) { + ppe(cmd); + } else if (cmd.hasOption(CMD_OS)) { + os(cmd); + } else if (cmd.hasOption(CMD_TS)) { + ts(cmd); + } else if (cmd.hasOption(CMD_HD)) { + hd(cmd); + } else if (cmd.hasOption(CMD_TD)) { + td(cmd); + } else if (cmd.hasOption(CMD_EC)) { + ec(cmd); + } else if (cmd.hasOption(CMD_DD)) { + dd(cmd); + } else if (cmd.hasOption(CMD_DS)) { + ds(cmd); + } else if (cmd.hasOption(CMD_RD)) { + rd(cmd); + } else if (cmd.hasOption(CMD_RS)) { + rs(cmd); + } else if (cmd.hasOption(CMD_CLH2)) { + clh2(cmd); + } else { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp("ddd (Debug Design Detail)", options); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static Options options() { + options.addOption(ppeOption()); + options.addOption(osOption()); + options.addOption(tsOption()); + options.addOption(hdOption()); + options.addOption(tdOption()); + options.addOption(ecOption()); + options.addOption(ddOption()); + options.addOption(dsOption()); + options.addOption(rdOption()); + options.addOption(rsOption()); + options.addOption(clh2Option()); + return options; + } + + private static Option ppeOption() { + return Option.builder(CMD_PPE).longOpt("processPlatformExecutor").hasArg(false).desc("显示流程平台执行线程状态.").build(); + } + + private static Option osOption() { + return Option.builder("os").longOpt("operatingSystem").argName("repeat").numberOfArgs(1).optionalArg(true) + .hasArgs().desc("显示操作系统信息,间隔2秒.").build(); + + } + + private static Option tsOption() { + return Option.builder("ts").longOpt("threadStatus").argName("repeat").optionalArg(true).hasArgs() + .desc("服务器线程状态,间隔2秒.合并多次执行线程信息到最后一份日志.").build(); + } + + private static Option hdOption() { + return Option.builder("hd").longOpt("heapDump").hasArg(false).desc("生成堆转储文件.").build(); + } + + private static Option tdOption() { + return Option.builder("td").longOpt("threadDump").argName("count").optionalArg(true).hasArg() + .desc("导出对比线程状态,间隔5秒.").build(); + } + + private static Option ecOption() { + return Option.builder("ec").longOpt("eraseContent").argName("type").hasArg().optionalArg(false) + .desc("清空实例数据,保留设计数据,type可选值 bbs cms log processPlatform.").build(); + } + + private static Option clh2Option() { + return Option.builder("clh2").longOpt("compactLocalH2").desc("压缩本地H2数据库.").build(); + } + + private static Option ddOption() { + return Option.builder("dd").longOpt("dumpData").argName("path").hasArg().optionalArg(true) + .desc("导出数据库服务器的数据转换成json格式保存到本地文件.").build(); + } + + private static Option dsOption() { + return Option.builder("ds").longOpt("dumpStorage").argName("path").hasArg().optionalArg(true) + .desc("导出存储服务器的文件数据转换成json格式保存到本地文件.").build(); + } + + private static Option rdOption() { + return Option.builder("rd").longOpt("restoreData").argName("path or date").hasArg() + .desc("将导出的json格式数据恢复到数据库服务器.").build(); + } + + private static Option rsOption() { + return Option.builder("rs").longOpt("restoreStorage").argName("path or date").hasArg() + .desc("将导出的json格式文件数据恢复到存储服务器.").build(); + } + + private void ec(CommandLine cmd) throws Exception { + if (BooleanUtils.isNotTrue(Config.currentNode().getEraseContentEnable())) { + logger.print("erase content is disabled."); + } + String type = Objects.toString(cmd.getOptionValue("ec")); + switch (type) { + case "processPlatform": + new EraseContentProcessPlatform().execute(); + break; + case "bbs": + new EraseContentBbs().execute(); + break; + case "cms": + new EraseContentCms().execute(); + break; + case "log": + new EraseContentLog().execute(); + break; + default: + logger.print("type may be processPlatform bbs cms log."); + } + } + + private void td(CommandLine cmd) throws Exception { + Integer count = this.getArgInteger(cmd, CMD_TD, 10); + ThreadDump threadDump = new ThreadDump(); + threadDump.execute(count); + } + + private void clh2(CommandLine cmd) throws Exception { + CompactLocalH2 compactLocalH2 = new CompactLocalH2(); + compactLocalH2.execute(); + } + + private void dd(CommandLine cmd) throws Exception { + String path = Objects.toString(cmd.getOptionValue(CMD_DD), ""); + DumpData dumpData = new DumpData(); + dumpData.execute(path); + } + + private void ds(CommandLine cmd) throws Exception { + String path = Objects.toString(cmd.getOptionValue(CMD_DS), ""); + DumpStorage dumpStorage = new DumpStorage(); + dumpStorage.execute(path); + } + + private void rd(CommandLine cmd) throws Exception { + String path = Objects.toString(cmd.getOptionValue(CMD_RD), ""); + RestoreData restoreData = new RestoreData(); + restoreData.execute(path); + } + + private void rs(CommandLine cmd) throws Exception { + String path = Objects.toString(cmd.getOptionValue(CMD_RS), ""); + RestoreStorage restoreStorage = new RestoreStorage(); + restoreStorage.execute(path); + } + + private void ts(CommandLine cmd) { + final Integer repeat = this.getArgInteger(cmd, CMD_TS, 1); + ThreadStatus threadStatus = new ThreadStatus(repeat); + threadStatus.start(); + } + + private void ppe(CommandLine cmd) throws Exception { + ProcessPlatformExecutor processPlatformExecutor = new ProcessPlatformExecutor(); + processPlatformExecutor.execute(); + } + + private void os(CommandLine cmd) { + final Integer command = this.getArgInteger(cmd, "os", 1); + OperatingSystem operatingSystem = new OperatingSystem(command); + operatingSystem.start(); + } + + private void hd(CommandLine cmd) throws Exception { + HeapDump heapDump = new HeapDump(); + heapDump.execute(); + } + + private Integer getArgInteger(CommandLine cmd, String opt, Integer defaultValue) { + Integer repeat = defaultValue; + String r = cmd.getOptionValue(opt); + if (NumberUtils.isParsable(r)) { + repeat = NumberUtils.toInt(r); + } + if (repeat < REPEAT_MIN || repeat > REPEAT_MAX) { + repeat = REPEAT_MIN; + } + return repeat; + } + +} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDetailDisplay.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDetailDisplay.java deleted file mode 100644 index e28a110922..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionDebugDetailDisplay.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.x.server.console.action; - -import java.lang.management.ManagementFactory; -import com.sun.management.OperatingSystemMXBean; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; - -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 org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; - -public class ActionDebugDetailDisplay extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionShowMemory.class); - - private static Options options; - - private Date start; - - private void init() throws Exception { - this.start = new Date(); - } - - public boolean execute(String... args) { - try { - this.init(); - new Thread() { - public void run() { - try { - CommandLineParser parser = new DefaultParser(); - CommandLine cmd = parser.parse(options(), args); - if (cmd.hasOption("ppe")) { - ppe(cmd); - } else if (cmd.hasOption("os")) { - os(cmd); - } else { - HelpFormatter formatter = new HelpFormatter(); - formatter.printHelp("ddd (Debug Detail Display)", options); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - }.start(); - - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - private Options options() { - if (null == options) { - options = new Options(); - options.addOption(ppexeOption()); - options.addOption(osOption()); - } - return options; - } - - private Option ppexeOption() { - Option opt = Option.builder("ppexe").desc("显示流程平台执行线程状态.").build(); - return opt; - } - - private Option osOption() { - Option opt = Option.builder("os").argName("repeat").optionalArg(true).hasArgs().type(Integer.class) - .desc("显示操作系统信息.").build(); - return opt; - } - - private void ppe(CommandLine cmd) throws Exception { - ExecutorService[] executorServices = Config.resource_node_processPlatformExecutors(); - List list = new ArrayList<>(); - for (int i = 0; i < executorServices.length; i++) { - ExecutorService service = executorServices[i]; - ThreadPoolExecutor executor = (ThreadPoolExecutor) service; - BlockingQueue queue = executor.getQueue(); - list.add("processPlatform executorServices[" + i + "] completed: " + executor.getCompletedTaskCount() - + ", block: " + queue.size() + "."); - if (!queue.isEmpty()) { - List os = new ArrayList<>(); - for (Runnable o : queue) { - os.add(o.getClass().toString()); - } - list.add("\t┕blocking: " + StringUtils.join(os, ",") + "."); - } - } - System.out.println(StringUtils.join(list, StringUtils.LF)); - } - - private void os(CommandLine cmd) throws Exception { - Integer repeat = 10; - String r = cmd.getOptionValue("os", "10"); - if (NumberUtils.isParsable(r)) { - repeat = NumberUtils.toInt(r); - } - if (repeat < 1 || repeat > 100) { - repeat = 10; - } - // final Integer interval_adjust = Math.min(Math.max(interval, 1), 20); - // final Integer repeat_repeat = Math.min(Math.max(repeat, 1), 200); - final Integer rpt = repeat; - new Thread() { - public void run() { - OperatingSystemMXBean bean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); - try { - for (int i = 0; i < rpt; i++) { - StringBuffer buffer = new StringBuffer(); - buffer.append("cpu:" + bean.getAvailableProcessors()) - .append(", process load:" + percent(bean.getProcessCpuLoad())) - .append(", system load:" + percent(bean.getSystemCpuLoad())) - .append(". memory:").append(bean.getTotalPhysicalMemorySize() / (1024 * 1024)) - .append("m, free:").append(bean.getFreePhysicalMemorySize() / (1024 * 1024)) - .append("m, committed virtual:") - .append(bean.getCommittedVirtualMemorySize() / (1024 * 1024)).append("m."); - System.out.println(buffer.toString()); - Thread.sleep(3000); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - }.start(); - } - - private String percent(Double d) { - return new Double((d * 100)).intValue() + "%"; - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionHeapDump.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionHeapDump.java deleted file mode 100644 index 825c60693c..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionHeapDump.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.x.server.console.action; - -import java.io.File; -import java.lang.management.ManagementFactory; -import java.util.Date; - -import javax.management.MBeanServer; - -import org.apache.commons.lang3.StringUtils; - -import com.sun.management.HotSpotDiagnosticMXBean; -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; - -public class ActionHeapDump extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionHeapDump.class); - - private Date start; - - private Date end; - // This is the name of the HotSpot Diagnostic MBean - private static final String HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic"; - // field to store the hotspot diagnostic MBean - private static volatile HotSpotDiagnosticMXBean hotspotMBean; - - public boolean execute(String password) { - try { - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } - start = new Date(); - File file = new File(Config.dir_logs(), - "heapDump_" + DateTools.format(start, DateTools.formatCompact_yyyyMMddHHmmss) + ".hprof"); - dumpHeap(file.getAbsolutePath()); - end = new Date(); - - logger.print( - "generate java heap dump to {}, elapsed: {}ms, parses file see url: https://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html", - file.getAbsoluteFile(), end.getTime() - start.getTime()); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - static void dumpHeap(String fileName) { - // initialize hotspot diagnostic MBean - initHotspotMBean(); - try { - hotspotMBean.dumpHeap(fileName, true); - } catch (RuntimeException re) { - throw re; - } catch (Exception exp) { - throw new RuntimeException(exp); - } - } - - // initialize the hotspot diagnostic MBean field - private static void initHotspotMBean() { - if (hotspotMBean == null) { - synchronized (ActionHeapDump.class) { - if (hotspotMBean == null) { - hotspotMBean = getHotspotMBean(); - } - } - } - } - - // get the hotspot diagnostic MBean from the - // platform MBean server - private static HotSpotDiagnosticMXBean getHotspotMBean() { - try { - MBeanServer server = ManagementFactory.getPlatformMBeanServer(); - HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(server, HOTSPOT_BEAN_NAME, - HotSpotDiagnosticMXBean.class); - return bean; - } catch (RuntimeException re) { - throw re; - } catch (Exception exp) { - throw new RuntimeException(exp); - } - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowCpu.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowCpu.java deleted file mode 100644 index 10a1b87f08..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowCpu.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.x.server.console.action; - -import java.lang.management.ManagementFactory; -import java.util.Date; - -import org.apache.commons.lang3.math.NumberUtils; - -import com.sun.management.OperatingSystemMXBean; -import com.x.base.core.project.logger.Logger; -import com.x.base.core.project.logger.LoggerFactory; - -public class ActionShowCpu extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionShowCpu.class); - - private Date start; - - private void init() throws Exception { - this.start = new Date(); - } - - public boolean execute(Integer interval, Integer repeat) { - try { - this.init(); - OperatingSystemMXBean bean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); - final Integer interval_adjust = Math.min(Math.max(interval, 1), 20); - final Integer repeat_repeat = Math.min(Math.max(repeat, 1), 200); - new Thread() { - public void run() { - try { - for (int i = 0; i < repeat_repeat; i++) { - System.out.println("show cpu process cpu load:" + percent(bean.getProcessCpuLoad()) - + ", system cpu load:" + percent(bean.getSystemCpuLoad()) + "."); - Thread.sleep(interval_adjust * 1000); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }.start(); - - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - private String percent(Double d) { - return new Double((d * 100)).intValue() + "%"; - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowHttpThread.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowHttpThread.java deleted file mode 100644 index ab632539a3..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowHttpThread.java +++ /dev/null @@ -1,61 +0,0 @@ -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.server.console.server.Servers; - -public class ActionShowHttpThread extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionShowHttpThread.class); - - public boolean execute(Integer interval, Integer repeat) { - try { - final Integer interval_adjust = Math.min(Math.max(interval, 1), 20); - final Integer repeat_repeat = Math.min(Math.max(repeat, 1), 200); - new Thread() { - public void run() { - try { - for (int i = 0; i < repeat_repeat; i++) { - show(); - Thread.sleep(interval_adjust * 1000); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }.start(); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - private void show() { - StringBuffer sb = new StringBuffer(); - if (Servers.centerServerIsRunning()) { - sb.append("center server:"); - sb.append(String.format("thread pool size:%d, idle:%d. ", Servers.centerServer.getThreadPool().getThreads(), - Servers.centerServer.getThreadPool().getIdleThreads())); - } else { - sb.append("is not running. "); - } - if (Servers.applicationServerIsRunning()) { - sb.append("application server:"); - sb.append(String.format("thread pool size:%d, idle:%d. ", - Servers.applicationServer.getThreadPool().getThreads(), - Servers.applicationServer.getThreadPool().getIdleThreads())); - } else { - sb.append("is not running. "); - } - if (Servers.webServerIsRunning()) { - sb.append("web server:"); - sb.append(String.format("thread pool size:%d, idle:%d. ", Servers.webServer.getThreadPool().getThreads(), - Servers.webServer.getThreadPool().getIdleThreads())); - } else { - sb.append("is not running. "); - } - System.out.println(sb.toString()); - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowMemory.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowMemory.java deleted file mode 100644 index ed2e9d65c9..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowMemory.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.x.server.console.action; - -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryMXBean; -import java.util.Date; - -import com.x.base.core.project.logger.Logger; -import com.x.base.core.project.logger.LoggerFactory; - -public class ActionShowMemory extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionShowMemory.class); - - private Date start; - - private void init() throws Exception { - this.start = new Date(); - } - - public boolean execute(Integer interval, Integer repeat) { - try { - this.init(); - MemoryMXBean bean = ManagementFactory.getMemoryMXBean(); - final Integer interval_adjust = Math.min(Math.max(interval, 1), 20); - final Integer repeat_repeat = Math.min(Math.max(repeat, 1), 200); - new Thread() { - public void run() { - try { - for (int i = 0; i < repeat_repeat; i++) { - System.out.println("show memory heap used:" + bean.getHeapMemoryUsage().getUsed() / 1048576 - + "m, max:" + bean.getHeapMemoryUsage().getMax() / 1048576 + "m, committed:" - + bean.getHeapMemoryUsage().getCommitted() / 1048576 + "m, non heap used:" - + bean.getNonHeapMemoryUsage().getUsed() / 1048576 + "m, max:" - + bean.getNonHeapMemoryUsage().getMax() / 1048576 + "m, committed:" - + bean.getNonHeapMemoryUsage().getCommitted() / 1048576 + "m."); - Thread.sleep(interval_adjust * 1000); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }.start(); - - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowOs.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowOs.java deleted file mode 100644 index 95fd4476f1..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowOs.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.x.server.console.action; - -import java.lang.management.ManagementFactory; -import java.util.Date; - -import org.apache.commons.lang3.math.NumberUtils; - -import com.sun.management.OperatingSystemMXBean; -import com.x.base.core.project.logger.Logger; -import com.x.base.core.project.logger.LoggerFactory; - -public class ActionShowOs extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionShowOs.class); - - private Date start; - - private void init() throws Exception { - this.start = new Date(); - } - - public boolean execute(Integer interval, Integer repeat) { - try { - this.init(); - OperatingSystemMXBean bean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); - final Integer interval_adjust = Math.min(Math.max(interval, 1), 20); - final Integer repeat_repeat = Math.min(Math.max(repeat, 1), 200); - new Thread() { - public void run() { - try { - for (int i = 0; i < repeat_repeat; i++) { - System.out.println("show os operating system processors:" + bean.getAvailableProcessors() - + ", total memory:" + bean.getTotalPhysicalMemorySize() / (1024 * 1024) + "m, free:" - + bean.getFreePhysicalMemorySize() / (1024 * 1024) + "m, committed virtual memory:" - + bean.getCommittedVirtualMemorySize() / (1024 * 1024) + "m."); - Thread.sleep(interval_adjust * 1000); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - }.start(); - - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - private String percent(Double d) { - return (d.intValue() * 100) + "%"; - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowThread.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowThread.java deleted file mode 100644 index 6e15c3983d..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionShowThread.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.x.server.console.action; - -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadMXBean; -import java.util.Date; - -import com.x.base.core.project.logger.Logger; -import com.x.base.core.project.logger.LoggerFactory; - -public class ActionShowThread extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionShowThread.class); - - private Date start; - - private void init() throws Exception { - this.start = new Date(); - } - - public boolean execute(Integer interval, Integer repeat) { - try { - this.init(); - ThreadMXBean bean = ManagementFactory.getThreadMXBean(); - final Integer interval_adjust = Math.min(Math.max(interval, 1), 20); - final Integer repeat_repeat = Math.min(Math.max(repeat, 1), 200); - new Thread() { - public void run() { - try { - for (int i = 0; i < repeat_repeat; i++) { - int deadLockedCount = bean.findDeadlockedThreads() == null ? 0 - : bean.findDeadlockedThreads().length; - System.out.println("show thread total started:" + bean.getTotalStartedThreadCount() - + ", count:" + bean.getThreadCount() + ", dead:" + deadLockedCount + ", daemon:" - + bean.getDaemonThreadCount() + ", peak:" + bean.getPeakThreadCount() + "."); - Thread.sleep(interval_adjust * 1000); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }.start(); - - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionStack.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionStack.java deleted file mode 100644 index 59052ad4cd..0000000000 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionStack.java +++ /dev/null @@ -1,144 +0,0 @@ -package com.x.server.console.action; - -import java.io.File; -import java.lang.Thread.State; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.ThreadUtils; - -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; - -public class ActionStack extends ActionBase { - - private static Logger logger = LoggerFactory.getLogger(ActionStack.class); - - public boolean execute(Integer count, Integer interval, String password) { - try { - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } - Map state_new = new HashMap<>(); - Map state_runable = new HashMap<>(); - Map state_blocked = new HashMap<>(); - Map state_waiting = new HashMap<>(); - Map state_timed_waiting = new HashMap<>(); - Map 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()) { - this.state(thread, state_new, state_runable, state_blocked, state_waiting, state_timed_waiting, - state_terminated); - this.dump(buffer, thread); - } - File file = new File(Config.dir_logs(true), this.fileName(i, count, date)); - if (i == 1) { - startFile = file; - } - if (i != count) { - FileUtils.write(file, buffer, DefaultCharset.charset_utf_8); - Thread.sleep(interval); - } 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()); - this.writeState(buffer, state_new, State.NEW, count); - this.writeState(buffer, state_runable, State.RUNNABLE, count); - this.writeState(buffer, state_blocked, State.BLOCKED, count); - this.writeState(buffer, state_waiting, State.WAITING, count); - this.writeState(buffer, state_timed_waiting, State.TIMED_WAITING, count); - this.writeState(buffer, state_terminated, State.TERMINATED, count); - FileUtils.write(file, buffer, DefaultCharset.charset_utf_8); - logger.print("stack dump thread to files: {} - {}.", startFile.getAbsolutePath(), - file.getAbsolutePath()); - } - } - } catch (Exception e) { - e.printStackTrace(); - return false; - } - return true; - } - - private void writeState(StringBuffer buffer, Map 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 state_new, Map state_runable, - Map state_blocked, Map state_waiting, Map state_timed_waiting, - Map state_terminated) { - Map 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"; - } - -} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionVersion.java b/o2server/x_console/src/main/java/com/x/server/console/action/ActionVersion.java index 05c8f279fe..0e876eb38d 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionVersion.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/ActionVersion.java @@ -1,106 +1,14 @@ package com.x.server.console.action; -import java.io.InputStream; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -import org.apache.commons.io.IOUtils; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.reflect.TypeToken; import com.x.base.core.project.config.Config; -import com.x.base.core.project.gson.XGsonBuilder; -import com.x.base.core.project.http.HttpMediaType; import com.x.base.core.project.logger.Logger; import com.x.base.core.project.logger.LoggerFactory; -import com.x.base.core.project.tools.ListTools; public class ActionVersion extends ActionBase { private static Logger logger = LoggerFactory.getLogger(ActionVersion.class); public void execute() throws Exception { - List wos = this.list(); - if (ListTools.isEmpty(wos)) { - System.out.println("already the latest version!"); - } else { - for (WrapVersion _o : wos) { - System.out.println("version:" + _o.getVersion() + ", size:" + (_o.getSize() / 1024 / 1024) + "M"); - for (String _s : _o.getDescriptionList()) { - System.out.println(_s); - } - } - } - } - - List list() throws Exception { - List wos = new ArrayList<>(); - String address = Config.collect().url("/o2_collect_assemble/jaxrs/update/list/next/" + Config.version()); - URL url = new URL(address); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setUseCaches(false); - connection.setRequestProperty("Content-Type", HttpMediaType.APPLICATION_JSON_UTF_8); - connection.setRequestMethod("GET"); - connection.setDoOutput(false); - connection.setDoInput(true); - connection.connect(); - String json = ""; - try (InputStream input = connection.getInputStream()) { - json = IOUtils.toString(input, StandardCharsets.UTF_8); - } - connection.disconnect(); - Gson gson = XGsonBuilder.instance(); - JsonElement jsonElement = gson.fromJson(json, JsonElement.class); - if (jsonElement.isJsonObject()) { - JsonObject jsonObject = jsonElement.getAsJsonObject(); - if (jsonObject.has("data")) { - wos = gson.fromJson(jsonObject.get("data"), new TypeToken>() { - }.getType()); - - } - } - wos = wos.stream().sorted(Comparator.comparing(WrapVersion::getVersion)).collect(Collectors.toList()); - return wos; - } - - public static class WrapVersion { - - private List descriptionList = new ArrayList<>(); - - private String version; - - private Long size; - - public List getDescriptionList() { - return descriptionList; - } - - public void setDescriptionList(List descriptionList) { - this.descriptionList = descriptionList; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public Long getSize() { - return size; - } - - public void setSize(Long size) { - this.size = size; - } - + logger.print(Config.version()); } } diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionCompactData.java b/o2server/x_console/src/main/java/com/x/server/console/action/CompactLocalH2.java similarity index 70% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionCompactData.java rename to o2server/x_console/src/main/java/com/x/server/console/action/CompactLocalH2.java index 64da3e31af..e822cfe6a7 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionCompactData.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/CompactLocalH2.java @@ -3,14 +3,6 @@ package com.x.server.console.action; import java.sql.DriverManager; import java.util.Date; -import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.StringUtils; -import org.h2.store.fs.FileUtils; -import org.h2.tools.DeleteDbFiles; -import org.h2.tools.RunScript; -import org.h2.tools.Script; - -import com.x.base.core.container.factory.SlicePropertiesBuilder; import com.x.base.core.project.config.Config; import com.x.base.core.project.config.DataServer; import com.x.base.core.project.logger.Logger; @@ -18,22 +10,20 @@ import com.x.base.core.project.logger.LoggerFactory; import com.x.base.core.project.tools.DateTools; import com.x.server.console.server.Servers; -public class ActionCompactData { +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.h2.store.fs.FileUtils; +import org.h2.tools.DeleteDbFiles; +import org.h2.tools.RunScript; +import org.h2.tools.Script; - private static Logger logger = LoggerFactory.getLogger(ActionCompactData.class); +public class CompactLocalH2 { - private Date start; + private static Logger logger = LoggerFactory.getLogger(CompactLocalH2.class); - private void init() throws Exception { - this.start = new Date(); - } + private Date start =new Date(); - public boolean execute(String password) throws Exception { - this.init(); - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } + public boolean execute() throws Exception { DataServer server = Config.currentNode().getData(); if (null == server) { logger.print("not config dataServer."); @@ -44,7 +34,7 @@ public class ActionCompactData { return false; } if (Servers.dataServerIsRunning()) { - logger.print("data server is running."); + logger.print("data server is running, must stop data server first."); return false; } /* 需要注入驱动程序 */ @@ -59,8 +49,8 @@ public class ActionCompactData { RunScript.execute(url, "sa", Config.token().getPassword(), backup, null, false); FileUtils.delete(backup); Date end = new Date(); - System.out.println("compact data completed at " + DateTools.format(end) + ", elapsed:" - + (end.getTime() - start.getTime()) + "ms."); + System.out.println(String.format("compact data completed at %s, elapsed:%dms.", DateTools.format(end), + end.getTime() - start.getTime())); return true; } diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionDumpData.java b/o2server/x_console/src/main/java/com/x/server/console/action/DumpData.java similarity index 79% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionDumpData.java rename to o2server/x_console/src/main/java/com/x/server/console/action/DumpData.java index 7b1d6a0d45..a2b66ca13c 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionDumpData.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/DumpData.java @@ -28,24 +28,19 @@ import com.x.base.core.project.tools.DateTools; import com.x.base.core.project.tools.DefaultCharset; import com.x.base.core.project.tools.ListTools; -public class ActionDumpData { +public class DumpData { - private static Logger logger = LoggerFactory.getLogger(ActionDumpData.class); + private static Logger logger = LoggerFactory.getLogger(DumpData.class); - private Date start; + private Date start = new Date(); private File dir; private DumpRestoreDataCatalog catalog; - private Gson pureGsonDateFormated; + private Gson pureGsonDateFormated = XGsonBuilder.instance(); - public boolean execute(String path, String password) throws Exception { - this.start = new Date(); - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } + public boolean execute(String path) throws Exception { if (StringUtils.isEmpty(path)) { this.dir = new File(Config.base(), "local/dump/dumpData_" + DateTools.compact(this.start)); } else { @@ -58,7 +53,6 @@ public class ActionDumpData { FileUtils.forceMkdir(this.dir); FileUtils.cleanDirectory(this.dir); this.catalog = new DumpRestoreDataCatalog(); - pureGsonDateFormated = XGsonBuilder.instance(); /* 初始化完成 */ @@ -71,22 +65,23 @@ public class ActionDumpData { PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames); for (int i = 0; i < classNames.size(); i++) { Class cls = (Class) Class.forName(classNames.get(i)); - EntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(), - persistence.getName(), PersistenceXmlHelper.properties(cls.getName(), Config.slice().getEnable())); - EntityManager em = emf.createEntityManager(); - try { - logger.print("dump data({}/{}): {}, count: {}.", (i + 1), classNames.size(), cls.getName(), - this.estimateCount(em, cls)); - this.dump(cls, em); - } finally { - em.close(); - emf.close(); - } + EntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(), + persistence.getName(), + PersistenceXmlHelper.properties(cls.getName(), Config.slice().getEnable())); + EntityManager em = emf.createEntityManager(); + try { + logger.print("dump data({}/{}): {}, count: {}.", (i + 1), classNames.size(), cls.getName(), + this.estimateCount(em, cls)); + this.dump(cls, em); + } finally { + em.close(); + emf.close(); + } } FileUtils.write(new File(dir, "catalog.json"), pureGsonDateFormated.toJson(this.catalog), DefaultCharset.charset); logger.print("dump data completed, directory: {}, count: {}, elapsed: {} minutes.", dir.getAbsolutePath(), - this.count(), (new Date().getTime() - start.getTime()) / 1000 / 60); + this.count(), (System.currentTimeMillis() - start.getTime()) / 1000 / 60); return true; } @@ -120,7 +115,7 @@ public class ActionDumpData { FileUtils.write(file, pureGsonDateFormated.toJson(list), DefaultCharset.charset); } em.clear(); - System.gc(); + Runtime.getRuntime().gc(); } while (ListTools.isNotEmpty(list)); this.catalog.put(cls.getName(), count); } @@ -131,9 +126,9 @@ public class ActionDumpData { Root root = cq.from(cls); Predicate p = cb.conjunction(); if (StringUtils.isNotEmpty(id)) { - p = cb.greaterThan(root.get("id"), id); + p = cb.greaterThan(root.get(JpaObject.id_FIELDNAME), id); } - cq.select(root).where(p).orderBy(cb.asc(root.get("id"))); + cq.select(root).where(p).orderBy(cb.asc(root.get(JpaObject.id_FIELDNAME))); return em.createQuery(cq).setMaxResults(size).getResultList(); } diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionDumpStorage.java b/o2server/x_console/src/main/java/com/x/server/console/action/DumpStorage.java similarity index 93% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionDumpStorage.java rename to o2server/x_console/src/main/java/com/x/server/console/action/DumpStorage.java index 1aebf5875b..c6f566f2d4 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionDumpStorage.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/DumpStorage.java @@ -34,24 +34,19 @@ import com.x.base.core.project.tools.DateTools; import com.x.base.core.project.tools.DefaultCharset; import com.x.base.core.project.tools.ListTools; -public class ActionDumpStorage { +public class DumpStorage { - private static Logger logger = LoggerFactory.getLogger(ActionDumpStorage.class); + private static Logger logger = LoggerFactory.getLogger(DumpStorage.class); - private Date start; + private Date start= new Date(); private File dir; private DumpRestoreStorageCatalog catalog; - private Gson pureGsonDateFormated; + private Gson pureGsonDateFormated=XGsonBuilder.instance(); - public boolean execute(String path, String password) throws Exception { - this.start = new Date(); - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } + public boolean execute(String path) throws Exception { if (StringUtils.isEmpty(path)) { this.dir = new File(Config.base(), "local/dump/dumpStorage_" + DateTools.compact(this.start)); } else { @@ -63,7 +58,6 @@ public class ActionDumpStorage { } FileUtils.forceMkdir(this.dir); FileUtils.cleanDirectory(this.dir); - this.pureGsonDateFormated = XGsonBuilder.instance(); this.catalog = new DumpRestoreStorageCatalog(); List storageContainerEntityNames = new ArrayList<>(); @@ -94,7 +88,7 @@ public class ActionDumpStorage { logger.print( "dump storage completed, directory: {}, count: {}, normal: {}, empty: {}, invalidStorage: {}, size: {}M, elapsed: {} minutes.", dir.getAbsolutePath(), this.count(), this.normal(), this.empty(), this.invalidStorage(), - (this.size() / 1024 / 1024), (new Date().getTime() - start.getTime()) / 1000 / 60); + (this.size() / 1024 / 1024), (System.currentTimeMillis() - start.getTime()) / 1000 / 60); return true; } @@ -201,7 +195,7 @@ public class ActionDumpStorage { this.dumpWrite(file, normalList, emptyList, invalidStorageList); } em.clear(); - System.gc(); + Runtime.getRuntime().gc(); } while (ListTools.isNotEmpty(list)); DumpRestoreStorageCatalogItem item = new DumpRestoreStorageCatalogItem(); item.setCount(count); diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentBbs.java b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentBbs.java similarity index 74% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentBbs.java rename to o2server/x_console/src/main/java/com/x/server/console/action/EraseContentBbs.java index f9c546a01f..fbde2b1604 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentBbs.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentBbs.java @@ -16,15 +16,11 @@ import com.x.bbs.entity.BBSVoteOption; import com.x.bbs.entity.BBSVoteOptionGroup; import com.x.bbs.entity.BBSVoteRecord; -public class ActionEraseContentBbs extends ActionEraseContentProcessPlatform { +public class EraseContentBbs extends EraseContentProcessPlatform { - private static Logger logger = LoggerFactory.getLogger(ActionEraseContentBbs.class); + private static Logger logger = LoggerFactory.getLogger(EraseContentBbs.class); - public boolean execute(String password) throws Exception { - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } + public boolean execute() throws Exception { this.init("bbs", ItemCategory.bbs); addClass(BBSOperationRecord.class); addClass(BBSReplyInfo.class); diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentCms.java b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentCms.java similarity index 81% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentCms.java rename to o2server/x_console/src/main/java/com/x/server/console/action/EraseContentCms.java index 075ea9c51d..faae8a4b64 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentCms.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentCms.java @@ -18,15 +18,11 @@ import com.x.cms.core.entity.DocumentCommentCommend; import com.x.cms.core.entity.DocumentCommend; import com.x.cms.core.entity.CmsBatchOperation; -public class ActionEraseContentCms extends ActionEraseContentProcessPlatform { +public class EraseContentCms extends EraseContentProcessPlatform { - private static Logger logger = LoggerFactory.getLogger(ActionEraseContentCms.class); + private static Logger logger = LoggerFactory.getLogger(EraseContentCms.class); public boolean execute(String password) throws Exception { - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } this.init("cms", ItemCategory.cms); addClass(Document.class); addClass(Review.class); diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentLog.java b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentLog.java similarity index 70% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentLog.java rename to o2server/x_console/src/main/java/com/x/server/console/action/EraseContentLog.java index e1adac37eb..564b815b9a 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentLog.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentLog.java @@ -10,15 +10,11 @@ import com.x.program.center.core.entity.ScheduleLog; import com.x.program.center.core.entity.UnexpectedErrorLog; import com.x.program.center.core.entity.WarnLog; -public class ActionEraseContentLog extends ActionEraseContentProcessPlatform { +public class EraseContentLog extends EraseContentProcessPlatform { - private static Logger logger = LoggerFactory.getLogger(ActionEraseContentLog.class); + private static Logger logger = LoggerFactory.getLogger(EraseContentLog.class); public boolean execute(String password) throws Exception { - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } this.init("log", null); addClass(ScheduleLog.class); addClass(PromptErrorLog.class); diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentProcessPlatform.java b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentProcessPlatform.java similarity index 95% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentProcessPlatform.java rename to o2server/x_console/src/main/java/com/x/server/console/action/EraseContentProcessPlatform.java index 32885c1c58..a8e038e841 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionEraseContentProcessPlatform.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/EraseContentProcessPlatform.java @@ -43,9 +43,9 @@ import com.x.processplatform.core.entity.content.WorkCompleted; import com.x.processplatform.core.entity.content.WorkLog; import com.x.query.core.entity.Item; -public class ActionEraseContentProcessPlatform { +public class EraseContentProcessPlatform { - private static Logger logger = LoggerFactory.getLogger(ActionEraseContentProcessPlatform.class); + private static Logger logger = LoggerFactory.getLogger(EraseContentProcessPlatform.class); private Date start; @@ -55,11 +55,7 @@ public class ActionEraseContentProcessPlatform { private ItemCategory itemCategory; - public boolean execute(String password) throws Exception { - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not match."); - return false; - } + public boolean execute() throws Exception { this.init("processPlatform", ItemCategory.pp); addClass(Attachment.class); addClass(DocumentVersion.class); diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/HeapDump.java b/o2server/x_console/src/main/java/com/x/server/console/action/HeapDump.java new file mode 100644 index 0000000000..13653437c5 --- /dev/null +++ b/o2server/x_console/src/main/java/com/x/server/console/action/HeapDump.java @@ -0,0 +1,38 @@ +package com.x.server.console.action; + +import java.io.File; +import java.lang.management.ManagementFactory; +import java.util.Date; + +import javax.management.MBeanServer; + +import com.sun.management.HotSpotDiagnosticMXBean; +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; + +public class HeapDump { + + private static Logger logger = LoggerFactory.getLogger(HeapDump.class); + + private static final String HOTSPOT_BEAN_NAME = "com.sun.management:type=HotSpotDiagnostic"; + + public void execute() throws Exception { + try { + Date start = new Date(); + File file = new File(Config.dir_logs(), + "heapDump_" + DateTools.format(start, DateTools.formatCompact_yyyyMMddHHmmss) + ".hprof"); + MBeanServer server = ManagementFactory.getPlatformMBeanServer(); + HotSpotDiagnosticMXBean bean = ManagementFactory.newPlatformMXBeanProxy(server, HOTSPOT_BEAN_NAME, + HotSpotDiagnosticMXBean.class); + bean.dumpHeap(file.getAbsolutePath(), true); + logger.print( + "generate java heap dump to {}, elapsed: {}ms, parses file see url: https://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html", + file.getAbsoluteFile(), System.currentTimeMillis() - start.getTime()); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/OperatingSystem.java b/o2server/x_console/src/main/java/com/x/server/console/action/OperatingSystem.java new file mode 100644 index 0000000000..6a80143719 --- /dev/null +++ b/o2server/x_console/src/main/java/com/x/server/console/action/OperatingSystem.java @@ -0,0 +1,37 @@ +package com.x.server.console.action; + +import java.lang.management.ManagementFactory; + +import com.sun.management.OperatingSystemMXBean; +import com.x.base.core.project.logger.Logger; +import com.x.base.core.project.logger.LoggerFactory; + +public class OperatingSystem extends Thread { + + private static Logger logger = LoggerFactory.getLogger(DumpData.class); + + private Integer count; + + public OperatingSystem(int count) { + this.count = count; + } + + public void run() { + OperatingSystemMXBean bean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + try { + for (int i = 0; i < count; i++) { + String msg = String.format( + "cpu:%d, system load:%.2f, process load:%.2f. memory:%dm, free:%dm, committed virtual:%dm.", + bean.getAvailableProcessors(), bean.getSystemCpuLoad(), bean.getProcessCpuLoad(), + bean.getTotalPhysicalMemorySize() / (1024 * 1024), + bean.getFreePhysicalMemorySize() / (1024 * 1024), + bean.getCommittedVirtualMemorySize() / (1024 * 1024)); + System.out.println(msg); + Thread.sleep(2000); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ProcessPlatformExecutor.java b/o2server/x_console/src/main/java/com/x/server/console/action/ProcessPlatformExecutor.java new file mode 100644 index 0000000000..7953ed0969 --- /dev/null +++ b/o2server/x_console/src/main/java/com/x/server/console/action/ProcessPlatformExecutor.java @@ -0,0 +1,45 @@ +package com.x.server.console.action; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; + +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 org.apache.commons.lang3.StringUtils; + + + +/** + * @author zhourui + */ +public class ProcessPlatformExecutor { + + private static Logger logger = LoggerFactory.getLogger(RestoreData.class); + + + public void execute() throws Exception { + ExecutorService[] executorServices = Config.resource_node_processPlatformExecutors(); + List list = new ArrayList<>(); + for (int i = 0; i < executorServices.length; i++) { + ExecutorService service = executorServices[i]; + ThreadPoolExecutor executor = (ThreadPoolExecutor) service; + BlockingQueue queue = executor.getQueue(); + list.add(String.format("processPlatform executorServices[%d] completed:%d, block:%d.", i, + executor.getCompletedTaskCount(), queue.size())); + if (!queue.isEmpty()) { + List os = new ArrayList<>(); + for (Runnable o : queue) { + os.add(o.getClass().toString()); + } + list.add(" +++ blocking: " + StringUtils.join(os, ",") + "."); + } + } + System.out.println(StringUtils.join(list, StringUtils.LF)); + + } +} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreData.java b/o2server/x_console/src/main/java/com/x/server/console/action/RestoreData.java similarity index 80% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreData.java rename to o2server/x_console/src/main/java/com/x/server/console/action/RestoreData.java index f2c08a5fb0..f09a38f545 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreData.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/RestoreData.java @@ -14,11 +14,6 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.openjpa.persistence.OpenJPAPersistence; - import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -33,49 +28,48 @@ import com.x.base.core.project.tools.DateTools; import com.x.base.core.project.tools.DefaultCharset; import com.x.base.core.project.tools.ListTools; -public class ActionRestoreData { +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.openjpa.persistence.OpenJPAPersistence; + +/** + * @author zhourui + */ +public class RestoreData { - private static Logger logger = LoggerFactory.getLogger(ActionRestoreData.class); + private static Logger logger = LoggerFactory.getLogger(RestoreData.class); - private Date start; + private Date start = new Date(); private File dir; private DumpRestoreDataCatalog catalog; - private Gson pureGsonDateFormated; + private Gson pureGsonDateFormated = XGsonBuilder.instance(); - public boolean execute(Date date, String password) throws Exception { - this.start = new Date(); - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not mactch."); - return false; + public boolean execute(String path) throws Exception { + if (StringUtils.isEmpty(path)) { + logger.print("path is empty."); } - this.dir = new File(Config.base(), "local/dump/dumpData_" + DateTools.compact(date)); - this.catalog = BaseTools.readConfigObject("local/dump/dumpData_" + DateTools.compact(date) + "/catalog.json", - DumpRestoreDataCatalog.class); - pureGsonDateFormated = XGsonBuilder.instance(); - return this.execute(); - } - - public boolean execute(String path, String password) throws Exception { - this.start = new Date(); - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not mactch."); - return false; - } - this.dir = new File(path); - if (!(this.dir.exists() && this.dir.isDirectory())) { - logger.print("dir not exist: {}.", path); - return false; - } else if (StringUtils.startsWith(dir.getAbsolutePath(), Config.base())) { - logger.print("path can not in base directory."); - return false; + if (BooleanUtils.isTrue(DateTools.isCompactDateTime(path))) { + this.dir = new File(Config.base(), "local/dump/dumpData_" + path); + this.catalog = BaseTools.readConfigObject("local/dump/dumpData_" + path + "/catalog.json", + DumpRestoreDataCatalog.class); + } else { + this.dir = new File(path); + if (!(this.dir.exists() && this.dir.isDirectory())) { + logger.print("dir not exist: {}.", path); + return false; + } else if (StringUtils.startsWith(dir.getAbsolutePath(), Config.base())) { + logger.print("path can not in base directory."); + return false; + } } this.catalog = XGsonBuilder.instance() .fromJson(FileUtils.readFileToString(new File(dir.getAbsolutePath() + File.separator + "catalog.json"), DefaultCharset.charset_utf_8), DumpRestoreDataCatalog.class); - pureGsonDateFormated = XGsonBuilder.instance(); return this.execute(); } @@ -113,7 +107,7 @@ public class ActionRestoreData { } } logger.print("restore data completed, total count: {}, elapsed: {} minutes.", count, - (new Date().getTime() - start.getTime()) / 1000 / 60); + (System.currentTimeMillis() - start.getTime()) / 1000 / 60); return true; } @@ -149,7 +143,7 @@ public class ActionRestoreData { } em.getTransaction().commit(); em.clear(); - System.gc(); + Runtime.getRuntime().gc(); } System.out.println("restore data: " + cls.getName() + " completed, count: " + count + "."); return count; diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreStorage.java b/o2server/x_console/src/main/java/com/x/server/console/action/RestoreStorage.java similarity index 58% rename from o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreStorage.java rename to o2server/x_console/src/main/java/com/x/server/console/action/RestoreStorage.java index f793e2577f..d94002c303 100644 --- a/o2server/x_console/src/main/java/com/x/server/console/action/ActionRestoreStorage.java +++ b/o2server/x_console/src/main/java/com/x/server/console/action/RestoreStorage.java @@ -2,6 +2,7 @@ package com.x.server.console.action; import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -17,6 +18,7 @@ import javax.persistence.criteria.Root; import org.apache.commons.io.FileUtils; import org.apache.commons.io.FilenameUtils; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.openjpa.persistence.OpenJPAPersistence; @@ -37,72 +39,67 @@ import com.x.base.core.project.tools.DateTools; import com.x.base.core.project.tools.DefaultCharset; import com.x.base.core.project.tools.ListTools; -public class ActionRestoreStorage { +/** + * @author zhourui + */ - private static Logger logger = LoggerFactory.getLogger(ActionRestoreStorage.class); +public class RestoreStorage { - private Date start; + private static Logger logger = LoggerFactory.getLogger(RestoreStorage.class); + + private Date start = new Date(); private File dir; private DumpRestoreStorageCatalog catalog; - private Gson pureGsonDateFormated; - - public boolean execute(Date date, String password) throws Exception { - this.start = new Date(); - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not mactch."); - return false; - } - this.dir = new File(Config.base(), "local/dump/dumpStorage_" + DateTools.compact(date)); - this.catalog = BaseTools.readConfigObject("local/dump/dumpStorage_" + DateTools.compact(date) + "/catalog.json", - DumpRestoreStorageCatalog.class); - pureGsonDateFormated = XGsonBuilder.instance(); - return this.execute(); - } + private Gson pureGsonDateFormated = XGsonBuilder.instance(); - public boolean execute(String path, String password) throws Exception { - this.start = new Date(); - if (!StringUtils.equals(Config.token().getPassword(), password)) { - logger.print("password not mactch."); - return false; + public boolean execute(final String path) throws Exception { + if (StringUtils.isEmpty(path)) { + logger.print("path is empty."); } - this.dir = new File(path); - if (!(this.dir.exists() && this.dir.isDirectory())) { - logger.print("dir not exist: {}.", path); - return false; - } else if (StringUtils.startsWith(dir.getAbsolutePath(), Config.base())) { - logger.print("path can not in base directory."); - return false; + if (BooleanUtils.isTrue(DateTools.isCompactDateTime(path))) { + this.dir = new File(Config.base(), "local/dump/dumpStorage_" + path); + this.catalog = BaseTools.readConfigObject("local/dump/dumpStorage_" + path + "/catalog.json", + DumpRestoreStorageCatalog.class); + } else { + this.dir = new File(path); + if (!(this.dir.exists() && this.dir.isDirectory())) { + logger.print("dir not exist: {}.", path); + return false; + } else if (StringUtils.startsWith(dir.getAbsolutePath(), Config.base())) { + logger.print("path can not in base directory."); + return false; + } + this.catalog = XGsonBuilder.instance() + .fromJson(FileUtils.readFileToString( + new File(dir.getAbsolutePath() + File.separator + "catalog.json"), + DefaultCharset.charset_utf_8), DumpRestoreStorageCatalog.class); } - this.catalog = XGsonBuilder.instance() - .fromJson(FileUtils.readFileToString(new File(dir.getAbsolutePath() + File.separator + "catalog.json"), - DefaultCharset.charset_utf_8), DumpRestoreStorageCatalog.class); - pureGsonDateFormated = XGsonBuilder.instance(); return this.execute(); } - public boolean execute() throws Exception { - List storageContainerEntityNames = new ArrayList<>(); + private boolean execute() throws Exception { + final List storageContainerEntityNames = new ArrayList<>(); storageContainerEntityNames.addAll((List) Config.resource(Config.RESOURCE_STORAGECONTAINERENTITYNAMES)); List classNames = new ArrayList<>(); classNames.addAll(this.catalog.keySet()); classNames = ListTools.includesExcludesWildcard(classNames, Config.dumpRestoreStorage().getIncludes(), Config.dumpRestoreStorage().getExcludes()); logger.print("restore storage find {} to restore.", classNames.size()); - File persistence = new File(Config.dir_local_temp_classes(), DateTools.compact(this.start) + "_dump.xml"); + final File persistence = new File(Config.dir_local_temp_classes(), DateTools.compact(this.start) + "_dump.xml"); PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames); - StorageMappings storageMappings = Config.storageMappings(); + final StorageMappings storageMappings = Config.storageMappings(); int count = 0; for (int i = 0; i < classNames.size(); i++) { - Class cls = (Class) Class.forName(classNames.get(i)); - EntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(), + final Class cls = (Class) Class.forName(classNames.get(i)); + final EntityManagerFactory emf = OpenJPAPersistence.createEntityManagerFactory(cls.getName(), persistence.getName(), PersistenceXmlHelper.properties(cls.getName(), Config.slice().getEnable())); - EntityManager em = emf.createEntityManager(); + final EntityManager em = emf.createEntityManager(); em.setFlushMode(FlushModeType.COMMIT); try { - DumpRestoreStorageCatalogItem item = this.catalog.get(cls.getName()); + final DumpRestoreStorageCatalogItem item = this.catalog.get(cls.getName()); logger.print( "restore storage({}/{}): {}, count: {}, normal: {} will be restore, invalidStorage: {} and empty: {} will be ignore, size: {}M.", (i + 1), classNames.size(), cls.getName(), item.getCount(), item.getNormal(), @@ -113,26 +110,27 @@ public class ActionRestoreStorage { emf.close(); } logger.print("restore storage completed, total count: {}, elapsed: {} minutes.", count, - (new Date().getTime() - start.getTime()) / 1000 / 60); + (System.currentTimeMillis() - start.getTime()) / 1000 / 60); } return false; } - private long store(Class cls, EntityManager em, StorageMappings storageMappings) - throws Exception { - File classDirectory = new File(this.dir, cls.getName()); + private long store(final Class cls, final EntityManager em, + final StorageMappings storageMappings) throws Exception { + final File classDirectory = new File(this.dir, cls.getName()); if ((!classDirectory.exists()) || (!classDirectory.isDirectory())) { throw new Exception("can not find directory: " + classDirectory.getAbsolutePath() + "."); } long count = 0; - List files = new ArrayList(FileUtils.listFiles(classDirectory, new String[] { "json" }, false)); + final List files = new ArrayList( + FileUtils.listFiles(classDirectory, new String[] { "json" }, false)); /** 对文件进行排序,和dump的时候的顺序保持一直 */ Collections.sort(files, new Comparator() { - public int compare(File o1, File o2) { - String n1 = FilenameUtils.getBaseName(o1.getName()); - String n2 = FilenameUtils.getBaseName(o2.getName()); - Integer i1 = Integer.parseInt(n1); - Integer i2 = Integer.parseInt(n2); + public int compare(final File o1, final File o2) { + final String n1 = FilenameUtils.getBaseName(o1.getName()); + final String n2 = FilenameUtils.getBaseName(o2.getName()); + final Integer i1 = Integer.parseInt(n1); + final Integer i2 = Integer.parseInt(n2); return i1.compareTo(i2); } }); @@ -144,11 +142,11 @@ public class ActionRestoreStorage { file = files.get(i); /** 必须先转换成 jsonElement 不能直接转成泛型T,如果直接转会有类型不匹配比如Integer变成了Double */ logger.print("restoring " + (i + 1) + "/" + files.size() + " part of storage: " + cls.getName() + "."); - JsonArray raws = this.convert(file); + final JsonArray raws = this.convert(file); if (null != raws) { em.getTransaction().begin(); - for (JsonElement o : raws) { - T t = pureGsonDateFormated.fromJson(o, cls); + for (final JsonElement o : raws) { + final T t = pureGsonDateFormated.fromJson(o, cls); if (Config.dumpRestoreStorage().getRedistribute()) { mapping = storageMappings.random(cls); } else { @@ -158,7 +156,7 @@ public class ActionRestoreStorage { throw new Exception( "can not find storageMapping class: " + cls.getName() + ", name:" + t.getName()); } - File source = new File(classDirectory, FilenameUtils.getBaseName(file.getName()) + final File source = new File(classDirectory, FilenameUtils.getBaseName(file.getName()) + StorageObject.PATHSEPARATOR + FilenameUtils.getName(t.path())); try (FileInputStream input = new FileInputStream(source)) { t.saveContent(mapping, input, t.getName()); @@ -168,28 +166,28 @@ public class ActionRestoreStorage { } em.getTransaction().commit(); em.clear(); - System.gc(); + Runtime.getRuntime().gc(); } } return count; } - private JsonArray convert(File file) throws Exception { + private JsonArray convert(final File file) throws IOException { /** 这里不进行判断,因为格式是严格约定的,出现意外应该先报错停止 */ - String json = FileUtils.readFileToString(file, DefaultCharset.charset); - JsonElement jsonElement = pureGsonDateFormated.fromJson(json, JsonElement.class); - JsonObject jsonObject = jsonElement.getAsJsonObject(); + final String json = FileUtils.readFileToString(file, DefaultCharset.charset); + final JsonElement jsonElement = pureGsonDateFormated.fromJson(json, JsonElement.class); + final JsonObject jsonObject = jsonElement.getAsJsonObject(); return jsonObject.get("normals").getAsJsonArray(); } - private void clean(Class cls, EntityManager em, StorageMappings storageMappings) - throws Exception { + private void clean(final Class cls, final EntityManager em, + final StorageMappings storageMappings) throws Exception { List list = null; StorageMapping mapping = null; do { if (ListTools.isNotEmpty(list)) { em.getTransaction().begin(); - for (T t : list) { + for (final T t : list) { mapping = storageMappings.get(cls, t.getStorage()); if (null != mapping) { t.deleteContent(mapping); @@ -198,9 +196,9 @@ public class ActionRestoreStorage { } em.getTransaction().commit(); } - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(cls); - Root root = cq.from(cls); + final CriteriaBuilder cb = em.getCriteriaBuilder(); + final CriteriaQuery cq = cb.createQuery(cls); + final Root root = cq.from(cls); cq.select(root); list = em.createQuery(cq).setMaxResults(Config.dumpRestoreData().getBatchSize()).getResultList(); } while (ListTools.isNotEmpty(list)); diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ThreadDump.java b/o2server/x_console/src/main/java/com/x/server/console/action/ThreadDump.java new file mode 100644 index 0000000000..577a46ef0a --- /dev/null +++ b/o2server/x_console/src/main/java/com/x/server/console/action/ThreadDump.java @@ -0,0 +1,145 @@ +package com.x.server.console.action; + +import java.io.File; +import java.lang.Thread.State; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import com.google.gson.Gson; +import com.x.base.core.project.config.Config; +import com.x.base.core.project.gson.XGsonBuilder; +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); + + public void execute(Integer count) throws Exception { + new Thread() { + public void run() { + try { + Map state_new = new HashMap<>(); + Map state_runable = new HashMap<>(); + Map state_blocked = new HashMap<>(); + Map state_waiting = new HashMap<>(); + Map state_timed_waiting = new HashMap<>(); + Map 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); + } 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())); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }.start(); + } + + private void writeState(StringBuffer buffer, Map 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 state_new, Map state_runable, + Map state_blocked, Map state_waiting, Map state_timed_waiting, + Map state_terminated) { + Map 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"; + } +} \ No newline at end of file diff --git a/o2server/x_console/src/main/java/com/x/server/console/action/ThreadStatus.java b/o2server/x_console/src/main/java/com/x/server/console/action/ThreadStatus.java new file mode 100644 index 0000000000..91e2408fec --- /dev/null +++ b/o2server/x_console/src/main/java/com/x/server/console/action/ThreadStatus.java @@ -0,0 +1,55 @@ +package com.x.server.console.action; + +import java.lang.management.ManagementFactory; +import java.lang.management.ThreadMXBean; +import java.util.ArrayList; +import java.util.List; + +import com.x.server.console.server.Servers; + +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; + +/** + * @author + */ +public class ThreadStatus extends Thread { + + private Integer repeat; + + public ThreadStatus(Integer repeat) { + this.repeat = repeat; + } + + public void run() { + try { + ThreadMXBean bean = ManagementFactory.getThreadMXBean(); + for (int i = 0; i < repeat; i++) { + List list = new ArrayList<>(); + int deadLockedCount = bean.findDeadlockedThreads() == null ? 0 : bean.findDeadlockedThreads().length; + list.add(String.format("thread total started:%d, count:%d, peak:%d, daemon:%d, dead:%d.", + bean.getTotalStartedThreadCount(), bean.getThreadCount(), bean.getPeakThreadCount(), + bean.getDaemonThreadCount(), deadLockedCount)); + if (BooleanUtils.isTrue(Servers.centerServerIsRunning())) { + list.add(String.format(" +++ center server thread pool size:%d, idle:%d.", + Servers.centerServer.getThreadPool().getThreads(), + Servers.centerServer.getThreadPool().getIdleThreads())); + } + if (BooleanUtils.isTrue(Servers.applicationServerIsRunning())) { + list.add(String.format(" +++ application server thread pool size:%d, idle:%d.", + Servers.applicationServer.getThreadPool().getThreads(), + Servers.applicationServer.getThreadPool().getIdleThreads())); + } + if (BooleanUtils.isTrue(Servers.webServerIsRunning())) { + list.add(String.format(" +++ web server thread pool size:%d, idle:%d.", + Servers.webServer.getThreadPool().getThreads(), + Servers.webServer.getThreadPool().getIdleThreads())); + } + System.out.println(StringUtils.join(list, StringUtils.LF)); + Thread.sleep(2000); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file -- GitLab