DropBox(메시지 처리) 진행중

- 송신 부분 설계중
main
semin.baek 10 months ago
parent 97ad14ae68
commit 208fc51e85

@ -1,8 +1,6 @@
{ {
"who-am-i": { "host-id": "first-agent",
"host-id": "first-agent", "listen-port": 16801,
"listen-port": 16801
},
"known-agent": [ "known-agent": [
{ {
"host-id": "second-agent", "host-id": "second-agent",
@ -52,13 +50,35 @@
{ {
"postman-id": "postman1", "postman-id": "postman1",
"task-type": "DB_READ_THEN_SEND", "task-type": "DB_READ_THEN_SEND",
"action": {
"type": "TRIGGER",
"command": "runSelectSomeThenSend",
"parameters-key-list": ["REG_DATE_FROM", "REG_DATE_TO"]
},
"message": {
"message-type": "SAVE_DB_DATA",
"dataSourceId": "dfcms",
"sql-id": "dfcms.selectSome"
},
"recipient-host-id": "third-agent",
"recipient-drop-box-id": "drop3",
"routing-host-id-list": ["first-agent", "second-agent", "third-agent"]
},
{
"postman-id": "postman2",
"task-type": "DB_READ_THEN_SEND",
"action": {
"type": "SCHEDULED",
"cron": "1 0 3 * * *"
},
"message": { "message": {
"message-type": "SAVE_DB_DATA", "message-type": "SAVE_DB_DATA",
"dataSourceId": "dfcms", "dataSourceId": "dfcms",
"sql-id": "dfcms.selectSome" "sql-id": "dfcms.selectSome"
}, },
"recipient-host-id": "third-agent", "recipient-host-id": "third-agent",
"recipient-drop-box-id": "drop3" "recipient-drop-box-id": "drop3",
"routing-host-id-list": ["first-agent", "second-agent", "third-agent"]
} }
] ]
} }

@ -2,6 +2,7 @@ package com.bsmlab.dfx.agent.config;
import com.bsmlab.dfx.agent.config.datasource.DataSourceDto; import com.bsmlab.dfx.agent.config.datasource.DataSourceDto;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxDto; import com.bsmlab.dfx.agent.task.dropbox.DropBoxDto;
import com.bsmlab.dfx.agent.task.postman.PostmanDto;
import com.fasterxml.jackson.databind.DatabindException; import com.fasterxml.jackson.databind.DatabindException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -25,11 +26,15 @@ public class Settings {
private String messageStorageRootPath; private String messageStorageRootPath;
private Map<String, DropBoxDto> dropBoxDtoMap = new HashMap<>(); private Map<String, DropBoxDto> dropBoxDtoMap = new HashMap<>();
private Resource[] mapperLocations; private Resource[] mapperLocations;
private int listenPort = 12345;
private Map<String, PostmanDto> postmanDtoMap;
public void loadSettingFile(String settingFilePath) { public void loadSettingFile(String settingFilePath) {
try { try {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> settingMap = objectMapper.readValue(new File(settingFilePath), Map.class); Map<String, Object> settingMap = objectMapper.readValue(new File(settingFilePath), Map.class);
this.mapperLocations = this.createMapperLocations(settingMap); this.mapperLocations = this.createMapperLocations(settingMap);
this.listenPort = (Integer)settingMap.get("listen-port");
log.debug("settingMap: {}", settingMap); log.debug("settingMap: {}", settingMap);
this.parseDataSources(settingMap); this.parseDataSources(settingMap);
this.parseDropBoxes(settingMap); this.parseDropBoxes(settingMap);
@ -77,7 +82,6 @@ public class Settings {
messageStorageRootFile.mkdirs(); messageStorageRootFile.mkdirs();
} }
List<Map<String, String>> dropBoxMapList = (List<Map<String, String>>)dropBoxSettingMap.get("drop-box-list"); List<Map<String, String>> dropBoxMapList = (List<Map<String, String>>)dropBoxSettingMap.get("drop-box-list");
//TODO drop-box executor 개발 -> ListenerController
for(Map<String, String> dropBoxMap : dropBoxMapList) { for(Map<String, String> dropBoxMap : dropBoxMapList) {
DropBoxDto dropBoxDto = DropBoxDto.builder() DropBoxDto dropBoxDto = DropBoxDto.builder()
.dropBoxId(dropBoxMap.get("drop-box-id")).taskType(dropBoxMap.get("task-type")) .dropBoxId(dropBoxMap.get("drop-box-id")).taskType(dropBoxMap.get("task-type"))
@ -88,6 +92,14 @@ public class Settings {
} }
} }
private void parsePostman(Map<String, Object> settingMap) {
Map<String, PostmanDto> postmanDtoMap = new HashMap<>();
Map<String, Object> postmanSettingMap = (Map<String, Object>)settingMap.get("postman");
}
public Resource[] getMapperLocations() { public Resource[] getMapperLocations() {
return this.mapperLocations; return this.mapperLocations;
} }
@ -107,4 +119,8 @@ public class Settings {
public DropBoxDto getDropBoxDto(String dropBoxId) { public DropBoxDto getDropBoxDto(String dropBoxId) {
return this.dropBoxDtoMap.get(dropBoxId); return this.dropBoxDtoMap.get(dropBoxId);
} }
public int getListenPort() {
return this.listenPort;
}
} }

@ -0,0 +1,20 @@
package com.bsmlab.dfx.agent.config;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
private final Settings settings;
@Override
public void customize(ConfigurableServletWebServerFactory factory) {
int port = settings.getListenPort();
factory.setPort(port);
factory.setContextPath("/");
}
}

@ -0,0 +1,6 @@
package com.bsmlab.dfx.agent.config.constant;
public enum ActionType {
TRIGGER,
SCHEDULED
}

@ -0,0 +1,5 @@
package com.bsmlab.dfx.agent.config.constant;
public enum TaskType {
DB_READ_THEN_SEND
}

@ -1,14 +1,12 @@
package com.bsmlab.dfx.agent.task; package com.bsmlab.dfx.agent.task;
import com.bsmlab.dfx.agent.config.Settings; import com.bsmlab.dfx.agent.config.Settings;
import com.bsmlab.dfx.agent.config.constant.MessageType;
import com.bsmlab.dfx.agent.config.datasource.SqlExecuteService; import com.bsmlab.dfx.agent.config.datasource.SqlExecuteService;
import com.bsmlab.dfx.agent.listener.dto.ReceiveMessageDto; import com.bsmlab.dfx.agent.listener.dto.ReceiveMessageDto;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxDto; import com.bsmlab.dfx.agent.task.dropbox.DropBoxDto;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.EnumUtils;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -24,7 +22,7 @@ public class TaskExecutorService {
private final SqlExecuteService sqlExecuteService; private final SqlExecuteService sqlExecuteService;
@Async("threadPoolTaskExecutor") @Async("threadPoolTaskExecutor")
public void process(String messageFilePath) { public void processDropBox(String messageFilePath) {
try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(messageFilePath))) { try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(messageFilePath))) {
ReceiveMessageDto receiveMessageDto = (ReceiveMessageDto)objectInputStream.readObject(); ReceiveMessageDto receiveMessageDto = (ReceiveMessageDto)objectInputStream.readObject();
DropBoxDto dropBoxDto = settings.getDropBoxDto(receiveMessageDto.getRecipientDropBoxId()); DropBoxDto dropBoxDto = settings.getDropBoxDto(receiveMessageDto.getRecipientDropBoxId());
@ -49,4 +47,9 @@ public class TaskExecutorService {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@Async("threadPoolTaskExecutor")
public void processPostman() {
}
} }

@ -1,5 +1,6 @@
package com.bsmlab.dfx.agent.task; package com.bsmlab.dfx.agent.task;
import com.bsmlab.dfx.agent.config.Settings;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxService; import com.bsmlab.dfx.agent.task.dropbox.DropBoxService;
import io.micrometer.common.util.StringUtils; import io.micrometer.common.util.StringUtils;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
@ -13,6 +14,7 @@ import org.springframework.stereotype.Component;
public class TaskExecutorStarter { public class TaskExecutorStarter {
private final DropBoxService dropBoxService; private final DropBoxService dropBoxService;
private final TaskExecutorService taskExecutorService; private final TaskExecutorService taskExecutorService;
private final Settings settings;
@PostConstruct @PostConstruct
public void run() { public void run() {
@ -21,7 +23,7 @@ public class TaskExecutorStarter {
Thread.sleep(10); Thread.sleep(10);
String messageFilePath = dropBoxService.poll(); String messageFilePath = dropBoxService.poll();
if(StringUtils.isNotBlank(messageFilePath)) { if(StringUtils.isNotBlank(messageFilePath)) {
taskExecutorService.process(messageFilePath); taskExecutorService.processDropBox(messageFilePath);
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
log.error("{}", e, e); log.error("{}", e, e);

@ -0,0 +1,35 @@
package com.bsmlab.dfx.agent.task.postman;
import com.bsmlab.dfx.agent.config.constant.ActionType;
import com.bsmlab.dfx.agent.config.constant.MessageType;
import com.bsmlab.dfx.agent.config.constant.TaskType;
import lombok.Builder;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
public class PostmanDto {
private String postmanId;
private TaskType taskType;
private PostmanActionType postmanActionType;
private PostmanMessageType postmanMessageType;
private String recipientHostId;
private String recipientDropBoxId;
private List<String> routingHostIdList;
public class PostmanActionType {
private ActionType actionType;
private String command;
private List<String> parameterKeyList = new ArrayList<>();
private String cron;
}
public class PostmanMessageType {
private MessageType messageType;
private String dataSourceId;
private String sqlId;
}
}
Loading…
Cancel
Save