diff --git a/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java b/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java index bd19a2f..ce638dc 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java @@ -43,7 +43,7 @@ import java.util.concurrent.Executor; }) public class DfxAgentConfiguration { // gradle bootRun 실행 설정 - // bootRun --args=" --setting.file=D:\projects\bsm-lab\dfx\dfxagent\src\docs\settings-examples\dfxagent.json" + // bootRun D:\projects\bsm-lab\dfx\dfxagent\src\docs\settings-examples\dfxagent.json" // command line java 실행 설정 // java -jar dfxagent.jar --setting.file=D:\projects\bsm-lab\dfx\dfxagent\src\docs\settings-examples\dfxagent.json diff --git a/src/main/java/com/bsmlab/dfx/agent/listener/ListenerController.java b/src/main/java/com/bsmlab/dfx/agent/listener/ListenerController.java index af41fd9..10c8144 100644 --- a/src/main/java/com/bsmlab/dfx/agent/listener/ListenerController.java +++ b/src/main/java/com/bsmlab/dfx/agent/listener/ListenerController.java @@ -50,7 +50,6 @@ public class ListenerController { /** * 처리 결과(AckDto) 수신 - * TODO 추후 송수신 이력을 관리하는 경우 필요한 로직 추가 */ @PostMapping(value = "/telegram") public AckDto telegram(HttpServletRequest request) { @@ -63,4 +62,19 @@ public class ListenerController { } return ackDto; } + + /** + * agent 상태 점검 등 command 수신 + */ + @PostMapping(value = "/command") + public AckDto command(HttpServletRequest request) { + AckDto ackDto; + try { + String bodyString= ServletUtils.getBodyString(request); + ackDto = listenerService.receiveAck(bodyString); + } catch (IOException e) { + ackDto = AckDto.builder().result(AckDto.ResultType.RECEIVE_FAIL).resultText(e.getLocalizedMessage()).messageUuid("").build(); + } + return ackDto; + } } diff --git a/src/main/java/com/bsmlab/dfx/agent/listener/dto/AckDto.java b/src/main/java/com/bsmlab/dfx/agent/listener/dto/AckDto.java index e9b8df8..8029f3b 100644 --- a/src/main/java/com/bsmlab/dfx/agent/listener/dto/AckDto.java +++ b/src/main/java/com/bsmlab/dfx/agent/listener/dto/AckDto.java @@ -7,7 +7,7 @@ import lombok.*; @Builder @AllArgsConstructor @NoArgsConstructor -/** +/* * Listen 프로세스 * 1. listener 수신 * 2. 수신 메시지 저장 (파일 저장 후 메시지 큐(DropBoxQueue) 에 추가) diff --git a/src/main/java/com/bsmlab/dfx/agent/listener/dto/CommandDto.java b/src/main/java/com/bsmlab/dfx/agent/listener/dto/CommandDto.java new file mode 100644 index 0000000..3a0a0b3 --- /dev/null +++ b/src/main/java/com/bsmlab/dfx/agent/listener/dto/CommandDto.java @@ -0,0 +1,18 @@ +package com.bsmlab.dfx.agent.listener.dto; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class CommandDto { + private CommandType commandType; + private String messageUuid; + + public static enum CommandType { + ALIVE, + INFORMATION, + } +} diff --git a/src/main/java/com/bsmlab/dfx/agent/listener/service/ListenerService.java b/src/main/java/com/bsmlab/dfx/agent/listener/service/ListenerService.java index 5f6dede..4980a45 100644 --- a/src/main/java/com/bsmlab/dfx/agent/listener/service/ListenerService.java +++ b/src/main/java/com/bsmlab/dfx/agent/listener/service/ListenerService.java @@ -3,12 +3,15 @@ package com.bsmlab.dfx.agent.listener.service; import com.bsmlab.dfx.agent.config.AgentConfigDto; import com.bsmlab.dfx.agent.config.AgentConfigReader; import com.bsmlab.dfx.agent.listener.dto.AckDto; +import com.bsmlab.dfx.agent.listener.dto.CommandDto; import com.bsmlab.dfx.agent.listener.dto.ReceiveMessageDto; import com.bsmlab.dfx.agent.support.MessageUtils; import com.bsmlab.dfx.agent.support.exception.IllegalMessageException; import com.bsmlab.dfx.agent.support.exception.InCompleteMessageException; import com.bsmlab.dfx.agent.support.exception.NullMessageException; import com.bsmlab.dfx.agent.task.dropbox.DropBoxService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.Part; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -39,7 +42,7 @@ public class ListenerService { try { ReceiveMessageDto receiveMessageDto = MessageUtils.toReceiveMessageDto(messageJsonString); if(dropBoxService.isExistToday(receiveMessageDto)) { - ackDto = AckDto.builder().result(AckDto.ResultType.RECEIVE_FAIL).resultText("금일 전송한 메시지 중 중복된 UUID가 존재합니다.").build(); + ackDto = AckDto.builder().result(AckDto.ResultType.RECEIVE_FAIL).resultText("금일 전송한 메시지 중 중복된 UUID 가 존재합니다.").build(); } else { dropBoxService.add(receiveMessageDto); @@ -62,12 +65,12 @@ public class ListenerService { Iterator iterator = parts.iterator(); Part firstPart = iterator.next(); if(firstPart.getContentType() == null || !firstPart.getContentType().contains("application/json")) { - throw new IllegalMessageException("Multipart의 첫 번째 데이터는 application/json 이어야 합니다."); + throw new IllegalMessageException("Multipart 의 첫 번째 데이터는 application/json 이어야 합니다."); } while(iterator.hasNext()) { Part filePart = iterator.next(); if(filePart.getSubmittedFileName() == null) { - throw new IllegalMessageException("Multipart의 두 번째 데이터 및 그 이후 데이터는 File 이어야 합니다."); + throw new IllegalMessageException("Multipart 의 두 번째 데이터 및 그 이후 데이터는 File 이어야 합니다."); } } firstPart = iterator.next(); @@ -118,4 +121,30 @@ public class ListenerService { } return ackDto; } + + public AckDto receiveCommand(String messageJsonString) { + AckDto ackDto; + CommandDto commandDto; + try { + commandDto = MessageUtils.toCommandDto(messageJsonString); + String resultText = null; + if(CommandDto.CommandType.ALIVE == commandDto.getCommandType()) { + resultText = "ALIVE"; + } + else if(CommandDto.CommandType.INFORMATION == commandDto.getCommandType()) { + AgentConfigDto agentConfigDto = this.agentConfigReader.getAgentConfigDto(); + ObjectMapper objectMapper = new ObjectMapper(); + try { + resultText = objectMapper.writeValueAsString(agentConfigDto); + } catch (JsonProcessingException e) { + resultText = ""; + } + } + ackDto = AckDto.builder().result(AckDto.ResultType.PROCESS_SUCCESS).messageUuid(commandDto.getMessageUuid()).resultText(resultText).build(); + } + catch (IllegalMessageException | NullMessageException e) { + ackDto = AckDto.builder().result(AckDto.ResultType.RECEIVE_FAIL).resultText(e.getLocalizedMessage()).messageUuid("").build(); + } + return ackDto; + } } diff --git a/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java b/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java index 10c8135..ac42748 100644 --- a/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java +++ b/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java @@ -2,6 +2,7 @@ package com.bsmlab.dfx.agent.support; import com.bsmlab.dfx.agent.config.AgentConfigDto; import com.bsmlab.dfx.agent.listener.dto.AckDto; +import com.bsmlab.dfx.agent.listener.dto.CommandDto; import com.bsmlab.dfx.agent.listener.dto.ReceiveMessageDto; import com.bsmlab.dfx.agent.support.exception.IllegalMessageException; import com.bsmlab.dfx.agent.support.exception.InCompleteMessageException; @@ -12,6 +13,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; +import org.h2.command.Command; import java.util.*; @@ -163,4 +165,24 @@ public class MessageUtils { } return ackDto; } + + public static CommandDto toCommandDto(String messageJsonString) throws IllegalMessageException, NullMessageException { + CommandDto commandDto; + ObjectMapper objectMapper = new ObjectMapper(); + Map map = null; + try { + map = objectMapper.readValue(messageJsonString, new TypeReference>() {}); + if(map == null) { + throw new NullMessageException("command message json string is invalid"); + } + else { + CommandDto.CommandType commandType = EnumUtils.getEnum(CommandDto.CommandType.class, String.valueOf(map.get("commandType"))); + String messageUuid = String.valueOf(map.get("messageUuid")); + commandDto = CommandDto.builder().commandType(commandType).messageUuid(messageUuid).build(); + } + } catch (JsonProcessingException e) { + throw new IllegalMessageException(e.getMessage()); + } + return commandDto; + } }