From 1135a74d225070362fe26843f0824f7e6e7e7767 Mon Sep 17 00:00:00 2001 From: "icksishu@gmail.com" Date: Fri, 2 Jan 2026 16:07:45 +0900 Subject: [PATCH] =?UTF-8?q?dfxconsole=EB=A1=9C=EB=B6=80=ED=84=B0=20setting?= =?UTF-8?q?s.json=20=EC=88=98=EC=8B=A0=20=EB=B0=8F=20=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20#17=20-=20=EC=A7=84=ED=96=89=EC=A4=91=20(L?= =?UTF-8?q?istenerService.java=20line=20176=20=ED=99=95=EC=9D=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/docs/agent-bsm-lab-postgres/shutdown.cmd | 1 + .../listener/service/ListenerService.java | 16 ++++++++++++++-- .../task/dropbox/DropBoxSchedulerService.java | 19 +++++++++++++++++-- .../agent/task/dropbox/DropBoxService.java | 11 ++++++++++- .../task/postman/PostmanSchedulerService.java | 13 +++++++++++++ 5 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/docs/agent-bsm-lab-postgres/shutdown.cmd diff --git a/src/docs/agent-bsm-lab-postgres/shutdown.cmd b/src/docs/agent-bsm-lab-postgres/shutdown.cmd new file mode 100644 index 0000000..f562008 --- /dev/null +++ b/src/docs/agent-bsm-lab-postgres/shutdown.cmd @@ -0,0 +1 @@ +wget --no-check-certificate --header="Content-Type: application/json" --header="User-Agent: DFXConsole" --post-data="{\"comment\":\"배포하기 위해 종료\",\"exitCode\":0,\"delaySeconds\":3,\"forceAfterSeconds\":15}" https://localhost:17801/actuator/dfxagentShutdown 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 8379d19..5d2bdac 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 @@ -9,6 +9,7 @@ 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.DropBoxSchedulerService; import com.bsmlab.dfx.agent.task.dropbox.DropBoxService; import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService; import com.fasterxml.jackson.core.JsonProcessingException; @@ -36,6 +37,7 @@ import java.util.Iterator; @Service public class ListenerService { private final DropBoxService dropBoxService; + private final DropBoxSchedulerService dropBoxSchedulerService; private final AgentConfigReader agentConfigReader; private final PostmanSchedulerService postmanSchedulerService; @@ -155,10 +157,10 @@ public class ListenerService { try { commandDto = MessageUtils.toCommandDto(messageJsonString); String resultText = null; - if(CommandDto.CommandType.ALIVE == commandDto.getCommandType()) { + if(CommandDto.CommandType.ALIVE == commandDto.getCommandType()) { // ALIVE 메시지인 경우 "ALIVE" 문자열 반송 resultText = "ALIVE"; } - else if(CommandDto.CommandType.INFORMATION == commandDto.getCommandType()) { + else if(CommandDto.CommandType.INFORMATION == commandDto.getCommandType()) { // INFORMATION 메시지인 경우 AgentConfigDto의 인스턴스 내용을 반송 AgentConfigDto agentConfigDto = this.agentConfigReader.getAgentConfigDto(); ObjectMapper objectMapper = new ObjectMapper(); try { @@ -167,6 +169,16 @@ public class ListenerService { resultText = ""; } } + else if(CommandDto.CommandType.SAVE_CONFIG == commandDto.getCommandType()) { // SAVE_CONFIG 메시지인 경우 수신 데이터를 AgentConfigDto로 변환 + //TODO 1. Postman, Dropbox 쓰레드 정지 + this.postmanSchedulerService.stopAll(); + this.dropBoxSchedulerService.stopAll(); + //TODO 2. AgentConfigDto 갱신 및 settings.json으로 저장 + //TODO 3. Postman, Dropbox 쓰래드 시작 + this.dropBoxSchedulerService.launch(); + this.postmanSchedulerService.launch(); + + } ackDto = AckDto.builder().result(AckDto.ResultType.PROCESS_SUCCESS).messageUuid(commandDto.getMessageUuid()).resultText(resultText).build(); } catch (IllegalMessageException | NullMessageException e) { diff --git a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java index 446234e..c546592 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxSchedulerService.java @@ -176,15 +176,30 @@ public class DropBoxSchedulerService { public void launch() { // 실행확인됨 log.debug("{} launch", this.getClass().getName()); + dropBoxService.allowToPoll(); this.scheduledFutureMap = new HashMap<>(); for(int i = 0; i < this.agentConfigReader.getAgentConfigDto().getDropBoxConfig().getThreadPoolSize(); i++) { this.scheduleTask(i); } - - // 수동 메지시 파일 스캐너 + // 수동 메지시 파일 스캐너 쓰레드 시작 this.startManualMessageFileScanner(); } + // 전체 DropBox 중지 + public void stopAll() { + // 수동 메시지 파일 스캐너 중지 + manualMessageFileScannerScheduledFuture.cancel(true); + // 큐에서 수신 메시지(파일) 가져오기 중지 + dropBoxService.denyToPoll(); + // Dropbox 쓰레드 중지 + for(ScheduledFuture scheduledFuture : scheduledFutureMap.values()) { + if(scheduledFuture != null) { + scheduledFuture.cancel(true); + } + scheduledFutureMap.clear(); + } + } + private void scheduleTask(int taskId) { Runnable task = () -> { String messageFilePath = dropBoxService.poll(); diff --git a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxService.java b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxService.java index 651c9f8..0deb455 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxService.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/dropbox/DropBoxService.java @@ -28,6 +28,7 @@ import java.util.concurrent.ConcurrentLinkedQueue; public class DropBoxService { private final AgentConfigReader agentConfigReader; private ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); + private boolean isAllowedToPoll; /** * 수신한 메시지(ReceiveMessageDto)는 하루 이내에 UUID가 중복되지 않아야 한다. 일일 UUID 중복을 체크한다. @@ -113,7 +114,15 @@ public class DropBoxService { * @return ReceiveMessageDto의 serialize 파일 경로 */ public String poll() { - return queue.poll(); + return this.isAllowedToPoll ? queue.poll() : null; + } + + public void denyToPoll() { + this.isAllowedToPoll = false; + } + + public void allowToPoll() { + this.isAllowedToPoll = true; } public int getPollSize() { diff --git a/src/main/java/com/bsmlab/dfx/agent/task/postman/PostmanSchedulerService.java b/src/main/java/com/bsmlab/dfx/agent/task/postman/PostmanSchedulerService.java index 37bfa84..2eb7d23 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/postman/PostmanSchedulerService.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/postman/PostmanSchedulerService.java @@ -43,6 +43,7 @@ public class PostmanSchedulerService { private Map postmanMap = new HashMap<>(); private Map sentMessageFileMap = new HashMap<>(); + // 전달받은 PostmanId의 쓰레드 실행 (run) private void startPostman(String postmanId) { AgentConfigDto.Postman postman = this.postmanMap.get(postmanId); this.stop(postmanId); @@ -59,6 +60,7 @@ public class PostmanSchedulerService { } } + // Postman 설정에 따라서 모든 Postman 쓰레드 활성화 (startPostman) public void launch() { // 실행확인됨 log.info("{} launch", this.getClass().getName()); List postmanList = agentConfigReader.getScheduledTypePostmanList(); @@ -71,6 +73,17 @@ public class PostmanSchedulerService { this.findAndAddSentMessageFile(new File(agentConfigReader.getAgentConfigDto().getDropBoxConfig().getSentMessageStorageRoot())); } + // 현재 동작중인 모든 Postman 쓰레드 중지 및 postmanMap 제거 + public void stopAll() { + for(String postmanId : postmanMap.keySet()) { + ScheduledFuture scheduledFuture = scheduledFutureMap.remove(postmanId); + if(scheduledFuture != null) { + scheduledFuture.cancel(true); + } + } + postmanMap.clear(); + } + private void findAndAddSentMessageFile(File parentDirectory) { File[] filesOnDirectory = parentDirectory.listFiles(); if(filesOnDirectory != null) {