[ Service ] [ Executor ] 修改OctopusObjectMapper
This commit is contained in:
@@ -136,7 +136,7 @@ func executorOMHandler(octopusMessage *OctopusMessage) {
|
||||
|
||||
// send back the result log
|
||||
octopusMessage.Result = resultLog
|
||||
octopusMessage.ACTime = utils.ParseISOLocalDateTime()
|
||||
octopusMessage.ACTime = utils.ParseDateTimeTime()
|
||||
|
||||
// Send
|
||||
octopusMessage.SendToOctopusServer()
|
||||
|
||||
@@ -15,6 +15,7 @@ func ParseDateTimeTime() string {
|
||||
return now.Format(time.DateTime)
|
||||
}
|
||||
|
||||
// ParseISOLocalDateTime 时间格式为2023-08-11T10:48:15+08:00
|
||||
func ParseISOLocalDateTime() string {
|
||||
now := time.Now()
|
||||
return now.Format(time.RFC3339)
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
package io.wdd.common.config;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
|
||||
@Component
|
||||
public class OctopusObjectMapperConfig {
|
||||
|
||||
private static final String STANDARD_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
private static final String DATE_PATTERN = "yyyy-MM-dd";
|
||||
|
||||
private static final String TIME_PATTERN = "HH:mm:ss";
|
||||
|
||||
public static ObjectMapper OctopusObjectMapper = null;
|
||||
|
||||
|
||||
@PostConstruct
|
||||
public void setOctopusObjectMapper() {
|
||||
OctopusObjectMapper = new ObjectMapper();
|
||||
|
||||
/*
|
||||
* 1. java.util.Date yyyy-MM-dd HH:mm:ss
|
||||
* 2. 支持JDK8 LocalDateTime、LocalDate、 LocalTime
|
||||
* 3. Jdk8Module模块支持如Stream、Optional等类
|
||||
* 4. 序列化时包含所有字段
|
||||
* 5. 在序列化一个空对象时时不抛出异常
|
||||
* 6. 忽略反序列化时在json字符串中存在, 但在java对象中不存在的属性
|
||||
* 7. 数字序列化成字符穿且调用BigDecimal.toPlainString()方法
|
||||
*/
|
||||
OctopusObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
|
||||
|
||||
// 初始化JavaTimeModule
|
||||
JavaTimeModule javaTimeModule = new JavaTimeModule();
|
||||
|
||||
//处理LocalDateTime
|
||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter
|
||||
.ofPattern(STANDARD_PATTERN);
|
||||
javaTimeModule.addSerializer(
|
||||
LocalDateTime.class,
|
||||
new LocalDateTimeSerializer(dateTimeFormatter)
|
||||
);
|
||||
javaTimeModule.addDeserializer(
|
||||
LocalDateTime.class,
|
||||
new LocalDateTimeDeserializer(dateTimeFormatter)
|
||||
);
|
||||
|
||||
//处理LocalDate
|
||||
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN);
|
||||
javaTimeModule.addSerializer(
|
||||
LocalDate.class,
|
||||
new LocalDateSerializer(dateFormatter)
|
||||
);
|
||||
javaTimeModule.addDeserializer(
|
||||
LocalDate.class,
|
||||
new LocalDateDeserializer(dateFormatter)
|
||||
);
|
||||
|
||||
//处理LocalTime
|
||||
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(TIME_PATTERN);
|
||||
javaTimeModule.addSerializer(
|
||||
LocalTime.class,
|
||||
new LocalTimeSerializer(timeFormatter)
|
||||
);
|
||||
javaTimeModule.addDeserializer(
|
||||
LocalTime.class,
|
||||
new LocalTimeDeserializer(timeFormatter)
|
||||
);
|
||||
|
||||
OctopusObjectMapper.registerModule(javaTimeModule);
|
||||
OctopusObjectMapper.setDateFormat(
|
||||
new SimpleDateFormat(STANDARD_PATTERN)
|
||||
);
|
||||
|
||||
OctopusObjectMapper.configure(
|
||||
SerializationFeature.FAIL_ON_EMPTY_BEANS,
|
||||
false
|
||||
);
|
||||
OctopusObjectMapper.configure(
|
||||
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
|
||||
false
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
package io.wdd.common.utils;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonInclude;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
|
||||
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
|
||||
@Configuration
|
||||
public class OctopusObjectMapperConfig {
|
||||
|
||||
public static ObjectMapper OctopusObjectMapper = null;
|
||||
|
||||
@Resource
|
||||
ObjectMapper objectMapper;
|
||||
|
||||
@PostConstruct
|
||||
public void setOctopusObjectMapper() {
|
||||
OctopusObjectMapper = objectMapper;
|
||||
}
|
||||
|
||||
public static Jackson2ObjectMapperBuilderCustomizer common() {
|
||||
|
||||
return jacksonObjectMapperBuilder -> {
|
||||
//若POJO对象的属性值为null,序列化时不进行显示
|
||||
jacksonObjectMapperBuilder.serializationInclusion(JsonInclude.Include.NON_NULL);
|
||||
|
||||
//针对于Date类型,文本格式化
|
||||
jacksonObjectMapperBuilder.simpleDateFormat("yyyy-MM-dd");
|
||||
|
||||
//
|
||||
jacksonObjectMapperBuilder.failOnEmptyBeans(false);
|
||||
jacksonObjectMapperBuilder.failOnUnknownProperties(false);
|
||||
jacksonObjectMapperBuilder.autoDetectFields(true);
|
||||
|
||||
//针对于JDK新时间类。序列化时带有T的问题,自定义格式化字符串
|
||||
JavaTimeModule javaTimeModule = new JavaTimeModule();
|
||||
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
|
||||
jacksonObjectMapperBuilder.modules(javaTimeModule);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -109,6 +109,8 @@ public class TimeUtils {
|
||||
}
|
||||
|
||||
/**
|
||||
* yyyy-MM-dd HH:mm:ss
|
||||
*
|
||||
* @return 格式化 去掉时间中的毫秒数
|
||||
*/
|
||||
public static LocalDateTime currentFormatTime() {
|
||||
|
||||
@@ -12,6 +12,8 @@ import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static io.wdd.rpc.message.handler.sync.OMessageHandler.StopWaitingResult;
|
||||
import static io.wdd.rpc.message.handler.sync.OMessageHandler.WaitFromAgent;
|
||||
import static io.wdd.rpc.status.CommonAndStatusCache.ALL_AGENT_TOPIC_NAME_SET;
|
||||
|
||||
@Service
|
||||
@@ -51,18 +53,26 @@ public class ExecutionServiceImpl implements ExecutionService {
|
||||
// send the message
|
||||
oMessageToAgentSender.send(octopusMessage);
|
||||
|
||||
System.out.println("originOctopusMessage = " + octopusMessage.hashCode());
|
||||
|
||||
// 需要返回结果
|
||||
if (!durationTask) {
|
||||
// 等待结果
|
||||
WaitFromAgent(octopusMessage);
|
||||
|
||||
synchronized (octopusMessage) {
|
||||
|
||||
try {
|
||||
octopusMessage.wait(10000);
|
||||
|
||||
|
||||
log.debug("等待结束!");
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// 转换结果
|
||||
commandResultLog = (ArrayList<String>) octopusMessage.getResult();
|
||||
|
||||
@@ -76,6 +86,9 @@ public class ExecutionServiceImpl implements ExecutionService {
|
||||
|
||||
}
|
||||
|
||||
// 释放等待队列
|
||||
StopWaitingResult(octopusMessage);
|
||||
|
||||
return commandResultLog;
|
||||
}
|
||||
|
||||
@@ -85,7 +98,7 @@ public class ExecutionServiceImpl implements ExecutionService {
|
||||
return OctopusMessage
|
||||
.builder()
|
||||
.octopusMessageType(OctopusMessageType.EXECUTOR)
|
||||
.init_time(TimeUtils.currentFormatTime())
|
||||
.init_time(TimeUtils.currentTime())
|
||||
.uuid(agentTopicName)
|
||||
.content(
|
||||
executionMessage
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static io.wdd.common.utils.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
|
||||
/**
|
||||
* The type Accept boot up info message.
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static io.wdd.rpc.message.handler.sync.OMessageToServerListener.FROM_AGENT_MATCH_TO_AGENT_MAP;
|
||||
import static io.wdd.rpc.message.handler.sync.OMessageToServerListener.OCTOPUS_MESSAGE_FROM_AGENT;
|
||||
@@ -43,6 +44,42 @@ public class OMessageHandler {
|
||||
|
||||
}
|
||||
|
||||
public static void WaitFromAgent(OctopusMessage octopusMessage) {
|
||||
|
||||
// 构建 MatchKey
|
||||
String matchKey = GenerateOMessageMatchKey(
|
||||
octopusMessage.getOctopusMessageType(),
|
||||
octopusMessage.getInit_time()
|
||||
);
|
||||
|
||||
// 开始等待
|
||||
FROM_AGENT_MATCH_TO_AGENT_MAP.put(
|
||||
matchKey,
|
||||
octopusMessage
|
||||
);
|
||||
|
||||
//debug
|
||||
log.info(
|
||||
"wait from agent map is => {}",
|
||||
FROM_AGENT_MATCH_TO_AGENT_MAP
|
||||
);
|
||||
}
|
||||
|
||||
public static void StopWaitingResult(OctopusMessage octopusMessage) {
|
||||
|
||||
// 构建 MatchKey
|
||||
String matchKey = GenerateOMessageMatchKey(
|
||||
octopusMessage.getOctopusMessageType(),
|
||||
octopusMessage.getInit_time()
|
||||
);
|
||||
|
||||
// 开始等待
|
||||
if (FROM_AGENT_MATCH_TO_AGENT_MAP.containsKey(matchKey)) {
|
||||
FROM_AGENT_MATCH_TO_AGENT_MAP.remove(matchKey);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析所有从Agent传回的消息,中央集中化处理
|
||||
*/
|
||||
@@ -54,7 +91,7 @@ public class OMessageHandler {
|
||||
if (OCTOPUS_MESSAGE_FROM_AGENT.isEmpty()) {
|
||||
|
||||
try {
|
||||
OCTOPUS_MESSAGE_FROM_AGENT.wait(5000);
|
||||
TimeUnit.MILLISECONDS.sleep(500);
|
||||
} catch (InterruptedException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@@ -70,6 +107,7 @@ public class OMessageHandler {
|
||||
replayOMessage.getOctopusMessageType(),
|
||||
replayOMessage.getInit_time()
|
||||
);
|
||||
|
||||
if (!FROM_AGENT_MATCH_TO_AGENT_MAP.containsKey(matchKey)) {
|
||||
// 没有这个Key,说明等待结果已经超时了,直接丢弃,然后继续循环
|
||||
// todo 错误的数据需要放置于某处
|
||||
@@ -93,32 +131,4 @@ public class OMessageHandler {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected void waitFor(OctopusMessage octopusMessage) {
|
||||
|
||||
// 构建 MatchKey
|
||||
String matchKey = GenerateOMessageMatchKey(
|
||||
octopusMessage.getOctopusMessageType(),
|
||||
octopusMessage.getInit_time()
|
||||
);
|
||||
|
||||
// 开始等待
|
||||
FROM_AGENT_MATCH_TO_AGENT_MAP.put(
|
||||
matchKey,
|
||||
octopusMessage
|
||||
);
|
||||
}
|
||||
|
||||
public void stopWaiting(OctopusMessage octopusMessage) {
|
||||
|
||||
// 构建 MatchKey
|
||||
String matchKey = GenerateOMessageMatchKey(
|
||||
octopusMessage.getOctopusMessageType(),
|
||||
octopusMessage.getInit_time()
|
||||
);
|
||||
|
||||
// 开始等待
|
||||
FROM_AGENT_MATCH_TO_AGENT_MAP.remove(matchKey);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import java.io.IOException;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.HashMap;
|
||||
|
||||
import static io.wdd.common.utils.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
|
||||
@Configuration
|
||||
@Slf4j(topic = "Octopus Message Listener")
|
||||
@@ -72,6 +72,8 @@ public class OMessageToServerListener {
|
||||
octopusMessage
|
||||
);
|
||||
|
||||
System.out.println("receivedOctopusMessage = " + octopusMessage.hashCode());
|
||||
|
||||
// 获取Agent的版本信息
|
||||
if (octopusMessage
|
||||
.getUuid()
|
||||
@@ -96,9 +98,5 @@ public class OMessageToServerListener {
|
||||
// 将收到的消息,直接存储到 缓存队列中
|
||||
log.debug("cache the octopus message to inner cache list !");
|
||||
OCTOPUS_MESSAGE_FROM_AGENT.offer(octopusMessage);
|
||||
oMessageHandler.waitFor(octopusMessage);
|
||||
|
||||
// 唤醒等待线程
|
||||
OCTOPUS_MESSAGE_FROM_AGENT.notify();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,6 @@ package io.wdd.rpc.message.sender;
|
||||
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import io.wdd.common.handler.MyRuntimeException;
|
||||
import io.wdd.rpc.init.InitRabbitMQConfig;
|
||||
import io.wdd.rpc.message.OctopusMessage;
|
||||
@@ -15,7 +14,7 @@ import org.springframework.stereotype.Component;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
import static io.wdd.common.utils.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
|
||||
/**
|
||||
* adaptor
|
||||
@@ -31,8 +30,6 @@ public class OMessageToAgentSender {
|
||||
@Resource
|
||||
InitRabbitMQConfig initRabbitMQConfig;
|
||||
|
||||
@Resource
|
||||
ObjectMapper objectMapper;
|
||||
|
||||
/**
|
||||
* send to Queue -- InitFromServer
|
||||
@@ -106,7 +103,7 @@ public class OMessageToAgentSender {
|
||||
@SneakyThrows
|
||||
private byte[] writeData(Object data) {
|
||||
|
||||
return objectMapper.writeValueAsBytes(data);
|
||||
return OctopusObjectMapper.writeValueAsBytes(data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import org.springframework.util.CollectionUtils;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Map;
|
||||
|
||||
import static io.wdd.common.utils.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.rpc.status.CommonAndStatusCache.ALL_HEALTHY_AGENT_TOPIC_NAME_LIST;
|
||||
|
||||
/**
|
||||
|
||||
@@ -10,7 +10,7 @@ import lombok.experimental.SuperBuilder;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import static io.wdd.common.utils.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
|
||||
@@ -22,7 +22,7 @@ import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static io.wdd.common.utils.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
|
||||
import static io.wdd.rpc.status.OctopusStatusMessage.*;
|
||||
|
||||
@Slf4j
|
||||
|
||||
@@ -67,6 +67,8 @@ public class ServerInfoVO {
|
||||
@TableField(fill = FieldFill.INSERT_UPDATE)
|
||||
private LocalDateTime updateTime;
|
||||
|
||||
private Integer proxyType;
|
||||
|
||||
/**
|
||||
* server location , type City Country
|
||||
*/
|
||||
@@ -149,4 +151,5 @@ public class ServerInfoVO {
|
||||
|
||||
private String agentVersion;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -5,8 +5,6 @@ import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@SpringBootTest
|
||||
class ServerApplicationTests {
|
||||
@@ -18,57 +16,7 @@ class ServerApplicationTests {
|
||||
@Test
|
||||
void testCoreExecutionCompleteScript() {
|
||||
|
||||
ArrayList<String> command1 = new ArrayList<>(
|
||||
List.of(
|
||||
"echo",
|
||||
"yes"
|
||||
)
|
||||
);
|
||||
|
||||
ArrayList<String> command2 = new ArrayList<>(
|
||||
List.of(
|
||||
"apt-get",
|
||||
"update"
|
||||
)
|
||||
);
|
||||
|
||||
ArrayList<String> command3 = new ArrayList<>(
|
||||
List.of(
|
||||
"echo",
|
||||
"\"no\""
|
||||
)
|
||||
);
|
||||
|
||||
ArrayList<String> command4 = new ArrayList<>(
|
||||
List.of(
|
||||
"apt-get",
|
||||
"install",
|
||||
"nginx",
|
||||
"-y"
|
||||
)
|
||||
);
|
||||
|
||||
List<List<String>> completeScript = new ArrayList<>();
|
||||
completeScript.add(command1);
|
||||
completeScript.add(command2);
|
||||
completeScript.add(command3);
|
||||
completeScript.add(command4);
|
||||
|
||||
|
||||
ArrayList<String> targetMachineList = new ArrayList<>(
|
||||
List.of(
|
||||
"Chengdu-amd64-98-98066f"
|
||||
)
|
||||
);
|
||||
|
||||
List<String> resultList = asyncExecutionService.SyncSendCommandToAgentComplete(
|
||||
targetMachineList,
|
||||
"Scheduled Script",
|
||||
completeScript
|
||||
);
|
||||
|
||||
|
||||
System.out.println("resultList = " + resultList);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user