diff --git a/src/database/create-database.sql b/src/database/create-database.sql
index 790e3ae..370b83c 100644
--- a/src/database/create-database.sql
+++ b/src/database/create-database.sql
@@ -99,7 +99,7 @@ COMMENT ON COLUMN TB_DFX_POSTMAN.RECIPIENT_DROPBOX_ID IS '수신자 DROPBOX ID';
COMMENT ON COLUMN TB_DFX_POSTMAN.DESCRIPTION IS '설명';
-CREATE TABLE TB_DFX_AGENT_MESSAGE_HISTORY (
+CREATE TABLE TB_DFX_AGENT_MESSAGE (
MESSAGE_UUID VARCHAR(36) NOT NULL
, SENDER_AGENT_ID VARCHAR(256) NOT NULL
, SENDER_POSTMAN_ID VARCHAR(256) NOT NULL
@@ -113,11 +113,50 @@ CREATE TABLE TB_DFX_AGENT_MESSAGE_HISTORY (
, MESSAGE_DATA TEXT
, MESSAGE_DATA_COUNT DECIMAL(9) DEFAULT 0
, PROCESS_ACK_TS TIMESTAMPTZ(3)
- , CONSTRAINT PK_DFX_AGENT_MESSAGE_HISTORY PRIMARY KEY (SENDER_AGENT_ID, MESSAGE_UUID)
+ , CONSTRAINT PK_DFX_AGENT_MESSAGE PRIMARY KEY (MESSAGE_UUID, SENDER_AGENT_ID)
+);
+CREATE INDEX IX_DFX_AGENT_MESSAGE_1 ON TB_DFX_AGENT_MESSAGE (RECIPIENT_AGENT_ID);
+CREATE INDEX IX_DFX_AGENT_MESSAGE_2 ON TB_DFX_AGENT_MESSAGE (CONSOLE_RECEIVE_TS);
+COMMENT ON TABLE TB_DFX_AGENT_MESSAGE IS '에이전트간 메시지';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.MESSAGE_UUID IS 'MESSAGE UUID';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.SENDER_AGENT_ID IS '송신 에이전트 ID';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.SENDER_POSTMAN_ID IS '송신 에이전트 POSTMAN ID';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.SENDER_TS IS '송신 시간';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.RECIPIENT_AGENT_ID IS '수신 에이전트 ID';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.RECIPIENT_DROPBOX_ID IS '수신 DROPBOX ID';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.RECIPIENT_TS IS '수신 시간';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.MESSAGE_TYPE_CODE IS '메시지 타입 코드 CODE_GROUP: MESSAGE_TYPE';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.CONSOLE_RECEIVE_TS IS '콘솔 수신 시간';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.PROCESS_STATUS_CODE IS '프로세스 상태 코드 CODE_GROUP: PROCESS_STATUS';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.MESSAGE_DATA IS '메시지 데이터';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.MESSAGE_DATA_COUNT IS '메시지 데이터 갯수';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE.PROCESS_ACK_TS IS '처리결과 수신 시간';
+
+
+CREATE SEQUENCE SQ_DFX_AGENT_MESSAGE_HISTORY START WITH 1 MINVALUE 1 MAXVALUE 999999999999999999 INCREMENT BY 1 CACHE 1;
+CREATE TABLE TB_DFX_AGENT_MESSAGE_HISTORY (
+ AGENT_MESSAGE_HISTORY_SEQ DECIMAL(18) NOT NULL
+ , MESSAGE_UUID VARCHAR(36) NOT NULL
+ , SENDER_AGENT_ID VARCHAR(256) NOT NULL
+ , SENDER_POSTMAN_ID VARCHAR(256) NOT NULL
+ , SENDER_TS TIMESTAMPTZ(3)
+ , RECIPIENT_AGENT_ID VARCHAR(256) NOT NULL
+ , RECIPIENT_DROPBOX_ID VARCHAR(256) NOT NULL
+ , RECIPIENT_TS TIMESTAMPTZ(3)
+ , MESSAGE_TYPE_CODE VARCHAR(64)
+ , CONSOLE_RECEIVE_TS TIMESTAMPTZ(3)
+ , PROCESS_STATUS_CODE VARCHAR(64)
+ , MESSAGE_DATA TEXT
+ , MESSAGE_DATA_COUNT DECIMAL(9) DEFAULT 0
+ , PROCESS_ACK_TS TIMESTAMPTZ(3)
+ , CONSTRAINT PK_DFX_AGENT_MESSAGE_HISTORY PRIMARY KEY (AGENT_MESSAGE_HISTORY_SEQ)
);
-CREATE INDEX IX_DFX_AGENT_MESSAGE_HISTORY_1 ON TB_DFX_AGENT_MESSAGE_HISTORY (RECIPIENT_AGENT_ID);
-CREATE INDEX IX_DFX_AGENT_MESSAGE_HISTORY_2 ON TB_DFX_AGENT_MESSAGE_HISTORY (CONSOLE_RECEIVE_TS);
-COMMENT ON TABLE TB_DFX_AGENT_MESSAGE_HISTORY IS '에이전트간 메시지 송신 이력';
+CREATE INDEX IX_DFX_AGENT_MESSAGE_HISTORY_1 ON TB_DFX_AGENT_MESSAGE_HISTORY (SENDER_AGENT_ID);
+CREATE INDEX IX_DFX_AGENT_MESSAGE_HISTORY_2 ON TB_DFX_AGENT_MESSAGE_HISTORY (MESSAGE_UUID);
+CREATE INDEX IX_DFX_AGENT_MESSAGE_HISTORY_3 ON TB_DFX_AGENT_MESSAGE_HISTORY (RECIPIENT_AGENT_ID);
+CREATE INDEX IX_DFX_AGENT_MESSAGE_HISTORY_4 ON TB_DFX_AGENT_MESSAGE_HISTORY (CONSOLE_RECEIVE_TS);
+COMMENT ON TABLE TB_DFX_AGENT_MESSAGE_HISTORY IS '에이전트간 메시지 송수신 이력';
+COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE_HISTORY.AGENT_MESSAGE_HISTORY_SEQ IS '메시지 송신 이력 순번 SQ_DFX_AGENT_MESSAGE_HISTORY';
COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE_HISTORY.MESSAGE_UUID IS 'MESSAGE UUID';
COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE_HISTORY.SENDER_AGENT_ID IS '송신 에이전트 ID';
COMMENT ON COLUMN TB_DFX_AGENT_MESSAGE_HISTORY.SENDER_POSTMAN_ID IS '송신 에이전트 POSTMAN ID';
diff --git a/src/main/front/src/router/index.js b/src/main/front/src/router/index.js
index 5c9b0ff..dc5f632 100644
--- a/src/main/front/src/router/index.js
+++ b/src/main/front/src/router/index.js
@@ -26,6 +26,13 @@ const router = createRouter({
props: { contentId: 'agent-manage-view' },
meta: { isRequiredAuth: true },
},
+ {
+ path: '/message-history.html',
+ name: 'message-history',
+ component: MainView,
+ props: { contentId: 'message-history-view' },
+ meta: { isRequiredAuth: true },
+ },
],
})
diff --git a/src/main/front/src/views/AgentManageView.vue b/src/main/front/src/views/AgentManageView.vue
index 10cbfd0..19f1f1f 100644
--- a/src/main/front/src/views/AgentManageView.vue
+++ b/src/main/front/src/views/AgentManageView.vue
@@ -54,7 +54,7 @@ onMounted(async () => {
|
- | no data. |
+ no datas. |
diff --git a/src/main/front/src/views/MainView.vue b/src/main/front/src/views/MainView.vue
index 895857c..abf8bf5 100644
--- a/src/main/front/src/views/MainView.vue
+++ b/src/main/front/src/views/MainView.vue
@@ -4,6 +4,7 @@ import { userApi } from '@/components/userInfo'
import { useRouter, RouterLink } from 'vue-router'
import DashboardView from './DashboardView.vue'
import AgentManageView from './AgentManageView.vue'
+import MessageHistoryView from './MessageHistoryView.vue'
import { computed } from 'vue'
const props = defineProps({
@@ -24,6 +25,8 @@ const currentContent = computed(() => {
return DashboardView
} else if (props.contentId == 'agent-manage-view') {
return AgentManageView
+ } else if (props.contentId == 'message-history-view') {
+ return MessageHistoryView
} else {
return DashboardView
}
@@ -63,7 +66,7 @@ const currentContent = computed(() => {
Agents
- History
+ Messages
diff --git a/src/main/front/src/views/MessageHistoryView.vue b/src/main/front/src/views/MessageHistoryView.vue
new file mode 100644
index 0000000..0a090f3
--- /dev/null
+++ b/src/main/front/src/views/MessageHistoryView.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+ 송수신 메시지 목록
+
+
+
+ | Message UUID |
+ Sender (Postman) |
+ Recipient (Dropbox) |
+ Send |
+ Receive |
+ Status |
+ Data count |
+ Data |
+
+
+
+
+ | {{ dfxAgentMessageDto.messageUuid }} |
+ {{ dfxAgentMessageDto.senderAgentId }}({{ dfxAgentMessageDto.senderPostmanId }}) |
+ {{ dfxAgentMessageDto.recipientAgentId }}({{ dfxAgentMessageDto.receipientDropboxId }}) |
+ {{ dfxAgentMessageDto.senderTimeString }} |
+ {{ dfxAgentMessageDto.recipientTimeString }} |
+ {{ dfxAgentMessageDto.processStatusCode }} |
+ {{ dfxAgentMessageDto.messageDateCount }} |
+ |
+
+
+ | no datas. |
+
+
+
+
+
+
+
+
+
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 3350d2c..0b1a647 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
@@ -27,6 +27,8 @@ public class AckDto {
RECEIVE_SUCCESS,
RECEIVE_FAIL,
PROCESS_SUCCESS,
- PROCESS_FAIL
+ PROCESS_FAIL,
+ TRANSFER_SUCCESS,
+ TRANSFER_FAIL
}
}
diff --git a/src/main/java/com/bsmlab/dfx/agent/listener/dto/ReceiveMessageDto.java b/src/main/java/com/bsmlab/dfx/agent/listener/dto/ReceiveMessageDto.java
index 36ff060..1851e0e 100644
--- a/src/main/java/com/bsmlab/dfx/agent/listener/dto/ReceiveMessageDto.java
+++ b/src/main/java/com/bsmlab/dfx/agent/listener/dto/ReceiveMessageDto.java
@@ -28,6 +28,7 @@ public class ReceiveMessageDto implements Serializable {
private ProcessStatus processStatus;
public static enum ProcessStatus {
+ PROCESS_SEND,
PROCESS_RECEIVED,
PROCESS_DONE,
PROCESS_NOT_POSSIBLE,
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 75cb43d..d991030 100644
--- a/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java
+++ b/src/main/java/com/bsmlab/dfx/agent/support/MessageUtils.java
@@ -14,19 +14,16 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.EnumUtils;
import org.apache.commons.lang3.StringUtils;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
@Slf4j
public class MessageUtils {
private MessageUtils() {};
+ private static final ObjectMapper objectMapper = new ObjectMapper();
@SuppressWarnings("unchecked")
public static ReceiveMessageDto toReceiveMessageDto(String messageJsonString) throws IllegalMessageException, NullMessageException, InCompleteMessageException {
ReceiveMessageDto receiveMessageDto = null;
- ObjectMapper objectMapper = new ObjectMapper();
Map map = null;
try {
map = objectMapper.readValue(messageJsonString, new TypeReference>() {});
@@ -58,6 +55,16 @@ public class MessageUtils {
throw new InCompleteMessageException("senderTimestamp 값의 형식이 숫자형식이 아닙니다. " + senderTimeStampString);
}
}
+ String senderPostmanId;
+ if(map.get("senderPostmanId") == null) {
+ throw new InCompleteMessageException("senderPostmanId 엘리먼트를 찾을 수 없습니다.");
+ }
+ else if(StringUtils.isBlank(String.valueOf(map.get("senderPostmanId")))) {
+ throw new InCompleteMessageException("senderPostmanId 값을 찾을 수 없습니다.");
+ }
+ else {
+ senderPostmanId = String.valueOf(map.get("senderPostmanId"));
+ }
String messageUuid;
if(map.get("messageUuid") == null) {
throw new InCompleteMessageException("messageUuid 엘리먼트를 찾을 수 없습니다.");
@@ -123,6 +130,18 @@ public class MessageUtils {
else {
recipientDropBoxId = String.valueOf(map.get("recipientDropBoxId"));
}
+ List routingHostList = null;
+ if(map.get("routingHostList") == null) {
+ throw new InCompleteMessageException("routingHostList 엘리먼트를 찾을 수 없습니다.");
+ }
+ else {
+ List