com.squareup.okhttp3
mockwebserver
diff --git a/src/main/java/com/cmcc/magent/config/CommonConfigure.java b/src/main/java/com/cmcc/magent/config/CommonConfigure.java
index 45aa19c..f0f6fc8 100644
--- a/src/main/java/com/cmcc/magent/config/CommonConfigure.java
+++ b/src/main/java/com/cmcc/magent/config/CommonConfigure.java
@@ -114,6 +114,14 @@ public class CommonConfigure {
*/
private String dataRootDirectory;
+ /**
+ * 中间件部署任务执行模式。
+ *
+ * 是否异步部署中间件,接收到部署任务后尽快返回。
+ *
+ */
+ private boolean asyncDeployment;
+
/**
* 设置全局静态变量的值。
*
diff --git a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java
index ca3ebf4..86c1690 100644
--- a/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java
+++ b/src/main/java/com/cmcc/magent/service/impl/MiddlewareManagerServiceImpl.java
@@ -25,6 +25,7 @@ import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference;
/**
@@ -52,6 +53,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
@Resource
private CommonConfigure commonConfigure;
+ /**
+ * 根据命令获取对应的文件名。
+ *
+ * @param cmd 中间件管理命令
+ * @return 对应的文件名
+ */
private String getFilenameForCommand(MiddlewareManagerCommand cmd) {
return switch (cmd) {
case COMMAND_DEPLOYMENT -> DEPLOYMENT_FILENAME;
@@ -64,6 +71,14 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
};
}
+ /**
+ * 将命令写入 Shell 脚本文件。
+ *
+ * @param workDir 工作目录
+ * @param cmd 中间件管理命令
+ * @param command 命令内容
+ * @return 返回一个 MulReturnType 对象,其中包含写入结果的错误码和文件名
+ */
private MulReturnType writeCommandToShellScript(String workDir, MiddlewareManagerCommand cmd, String command) {
String filename = getFilenameForCommand(cmd);
try {
@@ -79,6 +94,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
}
}
+ /**
+ * 创建工作目录。
+ *
+ * @param workDir 工作目录路径
+ * @return 如果创建成功, 返回 true;否则返回 false
+ */
private boolean createWorkDirectory(String workDir) {
Path path = Paths.get(workDir);
if (!Files.exists(path)) {
@@ -91,6 +112,12 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return true;
}
+ /**
+ * 处理命令参数,并更新 MiddlewareData 对象。
+ *
+ * @param data 要更新的 MiddlewareData 对象
+ * @param command 命令参数映射
+ */
private void processCommands(MiddlewareData data, Map command) {
command.forEach((cmd, param) -> {
switch (cmd) {
@@ -119,6 +146,13 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
});
}
+ /**
+ * 保存命令到 Shell 脚本文件。
+ *
+ * @param workDir 工作目录
+ * @param command 命令参数映射
+ * @return 返回一个 MulReturnType 对象,其中包含保存结果的错误码和文件名
+ */
private MulReturnType saveCommands(String workDir, Map command) {
AtomicReference errorCode = new AtomicReference<>(ErrorCode.ERR_OK);
AtomicReference filename = new AtomicReference<>("");
@@ -133,11 +167,18 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return new MulReturnType<>(errorCode.get(), filename.get());
}
+ /**
+ * 下载并校验配置文件。
+ *
+ * @param workDir 工作目录
+ * @param configFiles 配置文件列表
+ * @return 返回一个 MulReturnType 对象,其中包含下载和校验结果的错误码和相关信息
+ */
private MulReturnType downloadAndValidateConfigFiles(String workDir, List configFiles) {
for (RemoteFileDetails file : configFiles) {
try {
- String saveName = Paths.get(workDir + File.separator + file.getFileName()).toString();
- FileDownloader dl = new FileDownloader(file.getUrl(), saveName, new FileDownloader.SimpleDownloadCallback() {
+ String saveName = Paths.get(workDir + File.separator + file.getFileName()).toString();
+ FileDownloader dl = new FileDownloader(file.getUrl(), saveName, new FileDownloader.SimpleDownloadCallback() {
@Override
public void onStart(String url) {
}
@@ -163,13 +204,19 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return new MulReturnType<>(ErrorCode.ERR_OK, "");
}
+ /**
+ * 执行命令。
+ *
+ * @param workDir 工作目录
+ * @param command 命令参数映射
+ */
private void runCommand(String workDir, Map command) {
TreeMap sorted = new TreeMap<>(command);
for (MiddlewareManagerCommand cmd : sorted.keySet()) {
String filename = getFilenameForCommand(cmd);
List ret = ExecutingCommand.runNative("/bin/bash", workDir + File.separator + filename);
- log.info("Run {} Command: {}", MiddlewareManagerCommand.COMMAND_DEPLOYMENT.getStringValue(), ret);
+ log.info("Run {} Command: {}", MiddlewareManagerCommand.COMMAND_DEPLOYMENT.getEnumString(), ret);
}
}
@@ -208,17 +255,37 @@ public class MiddlewareManagerServiceImpl implements MiddlewareManagerService {
return new MulReturnType<>(ErrorCode.ERR_SYSTEMEXCEPTION, "");
}
- err = saveCommands(workDir, command);
- if (err.getFirstParam() != ErrorCode.ERR_OK) {
- return err;
- }
- err = downloadAndValidateConfigFiles(workDir, configFiles);
- if (err.getFirstParam() != ErrorCode.ERR_OK) {
- return err;
- }
+ if (!commonConfigure.isAsyncDeployment()) {
+ err = saveCommands(workDir, command);
+ if (err.getFirstParam() != ErrorCode.ERR_OK) {
+ return err;
+ }
- runCommand(workDir, command);
+ err = downloadAndValidateConfigFiles(workDir, configFiles);
+ if (err.getFirstParam() != ErrorCode.ERR_OK) {
+ return err;
+ }
+
+ runCommand(workDir, command);
+ } else {
+ CompletableFuture.runAsync(() -> {
+ log.info("++++ Task {} Start Running...", data.getUid());
+ MulReturnType error = saveCommands(workDir, command);
+ if (error.getFirstParam() != ErrorCode.ERR_OK) {
+ log.error("---- Finish Task {} Because Of Save Command Error: {}", data.getUid(), error.getSecondParam());
+ return;
+ }
+
+ error = downloadAndValidateConfigFiles(workDir, configFiles);
+ if (error.getFirstParam() != ErrorCode.ERR_OK) {
+ log.error("---- Finish Task {} Because Of Download Config File Error: {}", data.getUid(), error.getSecondParam());
+ return;
+ }
+ runCommand(workDir, command);
+ log.info("---- Task {} Finished", data.getUid());
+ });
+ }
return new MulReturnType<>(ErrorCode.ERR_OK, data.getUid());
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index ea86353..f6be05a 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -28,6 +28,14 @@ spring.jackson.deserialization.fail-on-unknown-properties=false
# Swagger-UI Custom Path
springdoc.swagger-ui.path=/swagger-ui.html
+# OSS Configuration
+#gzs.common.oss.enabled=true
+gzs.common.oss.config.default.accessKey=accessKey
+gzs.common.oss.config.default.secretKey=secretKey
+gzs.common.oss.config.default.endpoint=endpoint
+gzs.common.oss.config.default.accessUrl=accessUrl
+gzs.common.oss.config.default.bucketName=bucketName
+
# common :
common.token-expired-of-seconds=600
common.allow-passwd-retry-times=3
@@ -35,6 +43,7 @@ common.show-sql-command=false
common.res-sampling-msencond=10000
common.locale=zh_CN
common.data-root-directory=/opt/middleware-agent/data
+common.async-deployment=true
# protocol:
protocol.check-timestamp=true
diff --git a/src/main/resources/db/agent.db b/src/main/resources/db/agent.db
index cd2083b..e6ce5f2 100644
Binary files a/src/main/resources/db/agent.db and b/src/main/resources/db/agent.db differ