From 5858cbac038efdccb77bf076a8822ae701c5d600 Mon Sep 17 00:00:00 2001 From: "icksishu@gmail.com" Date: Wed, 18 Mar 2026 11:41:13 +0900 Subject: [PATCH] =?UTF-8?q?Ack=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=88=98?= =?UTF-8?q?=EC=8B=A0=20=EC=9D=B4=ED=9B=84=20update=20=EC=88=98=EC=8B=A0?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/service/ListenerService.java | 8 ++--- .../task/dropbox/DropBoxSchedulerService.java | 8 ++++- .../task/postman/PostmanSchedulerService.java | 33 ++++++++++++++----- 3 files changed, 35 insertions(+), 14 deletions(-) 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 5d2bdac..d7644d1 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 @@ -138,11 +138,9 @@ public class ListenerService { AckDto ackDto; try { ackDto = MessageUtils.toAckDto(messageJsonString); - if((ackDto.getResult() == AckDto.ResultType.PROCESS_SUCCESS)) { // 상대 에이전트의 DropBox 수신 및 처리 후 처리결과가 정상일 때의 AckDto - postmanSchedulerService.makeCompleteSentMessage(ackDto.getMessageUuid()); - if(agentConfigReader.isConnectedConsole()) { - MessageUtils.announceMessageAck(this.agentConfigReader, ackDto); - } + postmanSchedulerService.makeCompleteSentMessage(ackDto); // 상대측 Dropbox 처리 결과에 따라서 보낸 메시지 결과 처리 + if(agentConfigReader.isConnectedConsole()) { + MessageUtils.announceMessageAck(this.agentConfigReader, ackDto); } } catch (NullMessageException | IllegalMessageException | JsonProcessingException 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 c546592..6b713e7 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 @@ -144,7 +144,13 @@ public class DropBoxSchedulerService { } private void ackDropBoxProcessResult(ReceiveMessageDto receiveMessageDto, String processMessage) { - AckDto.ResultType resultType = EnumUtils.getEnum(AckDto.ResultType.class, receiveMessageDto.getProcessStatus().toString()); + AckDto.ResultType resultType = null; + if(receiveMessageDto.getProcessStatus() == ReceiveMessageDto.ProcessStatus.PROCESS_DONE) { + resultType = AckDto.ResultType.PROCESS_SUCCESS; + } + else if(receiveMessageDto.getProcessStatus() == ReceiveMessageDto.ProcessStatus.PROCESS_FAIL || receiveMessageDto.getProcessStatus() == ReceiveMessageDto.ProcessStatus.PROCESS_NOT_POSSIBLE) { + resultType = AckDto.ResultType.PROCESS_FAIL; + } AckDto ackDto = AckDto.builder().result(resultType).messageUuid(receiveMessageDto.getMessageUuid()).resultText(processMessage).build(); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); 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 2eb7d23..2733a51 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 @@ -102,18 +102,23 @@ public class PostmanSchedulerService { /** * AckDto 수신 후 postProcessingSqlId 처리. 이후 sent 메시지 파일 이름 변경 .complete - * @param messageUuid : AckDto로 전달받은 messageUuid. sentMessageFileMap에 포함되어 있어야 함 + * @param ackDto : AckDto에 포함된 messageUuid는 이전에 보낸 메시지이므로 sentMessageFileMap에 포함되어 있어야 함 */ @SuppressWarnings("unchecked") - public void makeCompleteSentMessage(String messageUuid) { - if(this.sentMessageFileMap.containsKey(messageUuid)) { - File sentMessageFile = new File(this.sentMessageFileMap.get(messageUuid)); + public void makeCompleteSentMessage(AckDto ackDto) { + if(this.sentMessageFileMap.containsKey(ackDto.getMessageUuid())) { + File sentMessageFile = new File(this.sentMessageFileMap.get(ackDto.getMessageUuid())); if(sentMessageFile.exists()) { try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(sentMessageFile))) { ReceiveMessageDto receiveMessageDto = (ReceiveMessageDto)objectInputStream.readObject(); ObjectMapper objectMapper = new ObjectMapper(); List> dataMapList; dataMapList = (List>) objectMapper.readValue(receiveMessageDto.getData(), List.class); + Map addParamMap = new HashMap<>(); + addParamMap.put("messageUuid", receiveMessageDto.getMessageUuid()); + addParamMap.put("processStatus", ackDto.getResult().toString()); + addParamMap.put("resultText", ackDto.getResultText()); + dataMapList.forEach(map -> map.putAll(addParamMap)); AgentConfigDto.Postman postman = this.postmanMap.get(receiveMessageDto.getSenderPostmanId()); sqlExecuteService.update(postman.getMessage().getDataSourceId(), postman.getMessage().getPostProcessingSqlId(), dataMapList); } catch (FileNotFoundException e) { @@ -129,7 +134,7 @@ public class PostmanSchedulerService { File completeMessageFile = new File(sentMessageFile.getAbsolutePath() + ".complete"); sentMessageFile.renameTo(completeMessageFile); } - this.sentMessageFileMap.remove(messageUuid); + this.sentMessageFileMap.remove(ackDto.getMessageUuid()); } } @@ -182,19 +187,31 @@ public class PostmanSchedulerService { log.debug("postman to {} send a message UUID {} (data count: {})", receiveMessageDto.getRecipientHostId(), receiveMessageDto.getMessageUuid(), dataMapList.size()); AckDto ackDto = MessageUtils.send(this.agentConfigReader, postman.getPostmanId(), receiveMessageDto); log.debug("postman received ack from {} ack: {}", receiveMessageDto.getRecipientHostId(), ackDto); - if(ackDto.getResult() == AckDto.ResultType.RECEIVE_SUCCESS) { + if(ackDto.getResult() == AckDto.ResultType.RECEIVE_SUCCESS) { // 전송 완료 및 Ack 수신 후 전송한 dataMapList 에 messageUuid, processStatus, resultText를 추가하여 postProcessingSqlId 실행 receiveMessageDto.setProcessStatus(ReceiveMessageDto.ProcessStatus.PROCESS_RECEIVED); receiveMessageDto.setReceivedTimestamp(System.currentTimeMillis()); String postProcessingSqlId = postman.getMessage().getPostProcessingSqlId(); - sqlExecuteService.update(dataSourceId, postProcessingSqlId, new HashMap()); + Map addParamMap = new HashMap<>(); + addParamMap.put("messageUuid", receiveMessageDto.getMessageUuid()); + addParamMap.put("processStatus", receiveMessageDto.getProcessStatus().toString()); + addParamMap.put("resultText", ackDto.getResultText()); + dataMapList.forEach(map -> map.putAll(addParamMap)); + sqlExecuteService.update(dataSourceId, postProcessingSqlId, dataMapList); } else if(ackDto.getResult() == AckDto.ResultType.TRANSFER_SUCCESS) { receiveMessageDto.setReceivedTimestamp(System.currentTimeMillis()); receiveMessageDto.setProcessStatus(ReceiveMessageDto.ProcessStatus.PROCESS_SEND); } - else if(ackDto.getResult() == AckDto.ResultType.RECEIVE_FAIL || ackDto.getResult() == AckDto.ResultType.TRANSFER_FAIL) { + else if(ackDto.getResult() == AckDto.ResultType.RECEIVE_FAIL || ackDto.getResult() == AckDto.ResultType.TRANSFER_FAIL) { // 전송 완료 및 Nak 수신 후 전송한 dataMapList 에 messageUuid, processStatus, resultText를 추가하여 postProcessingSqlId 실행 log.warn("대상 agent {}[{}]에게 전송하였으나 상대방이 수신하지 못하였습니다. 응답: {} 응답메시지: {}", knownAgent.getHostId(), knownAgent.getHostName(), ackDto.getResult(), ackDto.getResultText()); receiveMessageDto.setProcessStatus(ReceiveMessageDto.ProcessStatus.PROCESS_FAIL); + String postProcessingSqlId = postman.getMessage().getPostProcessingSqlId(); + Map addParamMap = new HashMap<>(); + addParamMap.put("messageUuid", receiveMessageDto.getMessageUuid()); + addParamMap.put("processStatus", receiveMessageDto.getProcessStatus().toString()); + addParamMap.put("resultText", ackDto.getResultText()); + dataMapList.forEach(map -> map.putAll(addParamMap)); + sqlExecuteService.update(dataSourceId, postProcessingSqlId, dataMapList); } if(agentConfigReader.isConnectedConsole()) { MessageUtils.announceMessageHistory(this.agentConfigReader, receiveMessageDto);