Settings -> AgentConfigReader, AgentConfigDto 변경 완료

main
semin.baek 10 months ago
parent 6991e21ad3
commit 2ce26273d2

@ -13,7 +13,7 @@
"drop-box-id-list": ["drop3", "drop4"] "drop-box-id-list": ["drop3", "drop4"]
} }
], ],
"datasource": [ "datasource-config": [
{ {
"dataSourceId": "dfcms", "dataSourceId": "dfcms",
"driverClassName": "org.postgresql.Driver", "driverClassName": "org.postgresql.Driver",

@ -9,7 +9,7 @@ public class AgentConfigDto {
private String hostId; private String hostId;
private int listenPort; private int listenPort;
private List<KnownAgent> knownAgent; private List<KnownAgent> knownAgent;
private List<DataSource> datasource; private List<DataSourceConfig> datasourceConfig;
private List<String> sqlMapperLocations; private List<String> sqlMapperLocations;
private DropBoxConfig dropBox; private DropBoxConfig dropBox;
private List<Postman> postman; private List<Postman> postman;
@ -23,7 +23,7 @@ public class AgentConfigDto {
} }
@Data @Data
public static class DataSource { public static class DataSourceConfig {
private String dataSourceId; private String dataSourceId;
private String driverClassName; private String driverClassName;
private String url; private String url;
@ -40,7 +40,7 @@ public class AgentConfigDto {
@Data @Data
public static class DropBox { public static class DropBox {
private String dropBoxId; private String dropBoxId;
private String taskType; private TaskType taskType;
private String dataSourceId; private String dataSourceId;
private String sqlId; private String sqlId;
private String saveDirectoryRoot; private String saveDirectoryRoot;
@ -49,7 +49,7 @@ public class AgentConfigDto {
@Data @Data
public static class Postman { public static class Postman {
private String postmanId; private String postmanId;
private String taskType; private TaskType taskType;
private PostmanAction action; private PostmanAction action;
private PostmanMessage message; private PostmanMessage message;
private String recipientHostId; private String recipientHostId;
@ -59,7 +59,7 @@ public class AgentConfigDto {
@Data @Data
public static class PostmanAction { public static class PostmanAction {
private String type; private ActionType type;
private String command; private String command;
private List<String> parametersKeyList; private List<String> parametersKeyList;
private String cron; private String cron;
@ -67,8 +67,25 @@ public class AgentConfigDto {
@Data @Data
public static class PostmanMessage { public static class PostmanMessage {
private String messageType; private MessageType messageType;
private String dataSourceId; private String dataSourceId;
private String sqlId; private String sqlId;
} }
public static enum ActionType {
TRIGGER,
SCHEDULED
}
public static enum MessageType {
SAVE_DB_DATA,
SAVE_FILE;
}
public static enum TaskType {
DB_READ_THEN_SEND,
SAVE_DB_TABLE,
RECEIVE_FILE
}
} }

@ -1,4 +1,41 @@
package com.bsmlab.dfx.agent.config; package com.bsmlab.dfx.agent.config;
import com.fasterxml.jackson.databind.DatabindException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
@Slf4j
@Component
@Getter
public class AgentConfigReader { public class AgentConfigReader {
private AgentConfigDto agentConfigDto = null;
public void loadConfigFile(String configFilePath) {
try {
ObjectMapper objectMapper = new ObjectMapper();
this.agentConfigDto = objectMapper.readValue(new File(configFilePath), AgentConfigDto.class);
} catch (DatabindException e) {
log.error("cannot parse a setting file. {}", configFilePath, e);
log.error(e.getMessage(), e);
} catch (IOException e) {
log.error("cannot read a setting file. {}", configFilePath);
log.error(e.getMessage(), e);
}
}
public AgentConfigDto.DropBox getDropBox(String dropBoxId) {
AgentConfigDto.DropBox found = null;
for(AgentConfigDto.DropBox dropBox : this.agentConfigDto.getDropBox().getDropBoxList()) {
if(dropBox.getDropBoxId().equals(dropBoxId)) {
found = dropBox;
break;
}
}
return found;
}
} }

@ -1,6 +1,5 @@
package com.bsmlab.dfx.agent.config; package com.bsmlab.dfx.agent.config;
import com.bsmlab.dfx.agent.config.datasource.DataSourceDto;
import com.bsmlab.dfx.agent.config.datasource.DynamicDataSourceService; import com.bsmlab.dfx.agent.config.datasource.DynamicDataSourceService;
import com.bsmlab.dfx.agent.config.datasource.DynamicRoutingDataSource; import com.bsmlab.dfx.agent.config.datasource.DynamicRoutingDataSource;
import io.micrometer.common.util.StringUtils; import io.micrometer.common.util.StringUtils;
@ -31,6 +30,7 @@ import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@ -58,8 +58,8 @@ public class DfxAgentConfiguration {
private Map<String, SqlSessionFactory> temporarySqlSessionFactoryMap = new HashMap<>(); private Map<String, SqlSessionFactory> temporarySqlSessionFactoryMap = new HashMap<>();
Map<String, DataSourceTransactionManager> temporaryTransactionManagerMap = new HashMap<>(); Map<String, DataSourceTransactionManager> temporaryTransactionManagerMap = new HashMap<>();
@Bean("settings") @Bean(name = "agentConfigReader")
public Settings loadSettings() { public AgentConfigReader agentConfigReader() {
if(StringUtils.isBlank(this.embeddedDbFileDirectory)) { if(StringUtils.isBlank(this.embeddedDbFileDirectory)) {
log.error("cannot found a embedded DB file. {}", this.embeddedDbFileDirectory); log.error("cannot found a embedded DB file. {}", this.embeddedDbFileDirectory);
log.error("exit application"); log.error("exit application");
@ -70,65 +70,70 @@ public class DfxAgentConfiguration {
log.error("exit application"); log.error("exit application");
System.exit(0); System.exit(0);
} }
Settings settings = new Settings(); AgentConfigReader agentConfigReader = new AgentConfigReader();
settings.loadSettingFile(this.settingFile); agentConfigReader.loadConfigFile(this.settingFile);
return settings; return agentConfigReader;
} }
@Bean(name = "dynamicRoutingDataSource") @Bean(name = "dynamicRoutingDataSource")
public DynamicRoutingDataSource dynamicRoutingDataSource(Settings settings) { public DynamicRoutingDataSource dynamicRoutingDataSource(AgentConfigReader agentConfigReader) {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource(); DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
Map<String, SqlSessionFactory> sqlSessionFactoryMap = new HashMap<>(); Map<String, SqlSessionFactory> sqlSessionFactoryMap = new HashMap<>();
Map<String, DataSourceTransactionManager> transactionManagerMap = new HashMap<>(); Map<String, DataSourceTransactionManager> transactionManagerMap = new HashMap<>();
Map<String, DataSourceDto> dataSourceDtoMap = settings.getDataSourceDtoMap(); List<AgentConfigDto.DataSourceConfig> dataSourceConfigList = agentConfigReader.getAgentConfigDto().getDatasourceConfig();
for(String dataSourceId : dataSourceDtoMap.keySet()) { for(AgentConfigDto.DataSourceConfig dataSourceConfig : dataSourceConfigList) {
DataSourceDto dataSourceDto = dataSourceDtoMap.get(dataSourceId); BasicDataSource dataSource = createBasicDataSource(dataSourceConfig);
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(dataSourceDto.getDriverClassName());
dataSource.setUrl(dataSourceDto.getUrl());
dataSource.setUsername(dataSourceDto.getUsername());
dataSource.setPassword(dataSourceDto.getPassword());
if(oracle.jdbc.driver.OracleDriver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1 FROM DUAL");
}
else if(org.postgresql.Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1");
}
else if(com.mysql.jdbc.Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1");
}
else if(org.mariadb.jdbc.Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1");
}
else if(com.ibm.db2.jcc.DB2Driver.class.getCanonicalName().equals(dataSourceDto.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1 FROM SYSIBM.SYSDUMMY1");
}
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);
dataSource.setTestOnCreate(true);
dataSource.setTestWhileIdle(true);
dataSource.setInitialSize(3);
dataSource.setMinIdle(3);
dataSource.setMaxIdle(30);
dataSource.setMaxTotal(30);
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setDataSource(dataSource);
try { try {
sqlSessionFactoryMap.put(dataSourceId, sqlSessionFactoryBean.getObject()); sqlSessionFactoryMap.put(dataSourceConfig.getDataSourceId(), sqlSessionFactoryBean.getObject());
} catch (Exception e) { } catch (Exception e) {
log.error("DynamicRoutingDataSource 생성 중 오류: {}", e.getMessage(), e); log.error("DynamicRoutingDataSource 생성 중 오류: {}", e.getMessage(), e);
throw new RuntimeException(e); throw new RuntimeException(e);
} }
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
transactionManagerMap.put(dataSourceId, transactionManager); transactionManagerMap.put(dataSourceConfig.getDataSourceId(), transactionManager);
dynamicRoutingDataSource.addDataSource(dataSourceId, dataSource); dynamicRoutingDataSource.addDataSource(dataSourceConfig.getDataSourceId(), dataSource);
} }
this.temporarySqlSessionFactoryMap = sqlSessionFactoryMap; this.temporarySqlSessionFactoryMap = sqlSessionFactoryMap;
this.temporaryTransactionManagerMap = transactionManagerMap; this.temporaryTransactionManagerMap = transactionManagerMap;
return dynamicRoutingDataSource; return dynamicRoutingDataSource;
} }
private static BasicDataSource createBasicDataSource(AgentConfigDto.DataSourceConfig dataSourceConfig) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(dataSourceConfig.getDriverClassName());
dataSource.setUrl(dataSourceConfig.getUrl());
dataSource.setUsername(dataSourceConfig.getUsername());
dataSource.setPassword(dataSourceConfig.getPassword());
if(oracle.jdbc.driver.OracleDriver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1 FROM DUAL");
}
else if(org.postgresql.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1");
}
else if(com.mysql.jdbc.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1");
}
else if(org.mariadb.jdbc.Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1");
}
else if(com.ibm.db2.jcc.DB2Driver.class.getCanonicalName().equals(dataSourceConfig.getDriverClassName())) {
dataSource.setValidationQuery("SELECT 1 FROM SYSIBM.SYSDUMMY1");
}
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);
dataSource.setTestOnCreate(true);
dataSource.setTestWhileIdle(true);
dataSource.setInitialSize(3);
dataSource.setMinIdle(3);
dataSource.setMaxIdle(30);
dataSource.setMaxTotal(30);
return dataSource;
}
@Bean(name = "dynamicDataSourceService") @Bean(name = "dynamicDataSourceService")
public DynamicDataSourceService dynamicDataSourceService() { public DynamicDataSourceService dynamicDataSourceService() {
DynamicDataSourceService dynamicDataSourceService = new DynamicDataSourceService(); DynamicDataSourceService dynamicDataSourceService = new DynamicDataSourceService();

@ -10,7 +10,6 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor @RequiredArgsConstructor
@Component @Component
public class StartupRunner implements ApplicationRunner { public class StartupRunner implements ApplicationRunner {
private final Settings settings;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {

@ -10,10 +10,10 @@ import org.springframework.stereotype.Component;
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> { public class WebServerCustomizer implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
private final Settings settings; private final AgentConfigReader agentConfigReader;
@Override @Override
public void customize(ConfigurableServletWebServerFactory factory) { public void customize(ConfigurableServletWebServerFactory factory) {
int port = settings.getListenPort(); int port = agentConfigReader.getAgentConfigDto().getListenPort();
factory.setPort(port); factory.setPort(port);
factory.setContextPath("/"); factory.setContextPath("/");
} }

@ -19,29 +19,6 @@ import org.springframework.stereotype.Service;
@Service @Service
public class ListenerService { public class ListenerService {
private final DropBoxService dropBoxService; private final DropBoxService dropBoxService;
private final ListenerMapper listenerMapper;
private final SqlExecuteService sqlExecuteService;
public AckDto saveNewMessage(String messageJsonString) {
AckDto ackDto = null;
try {
ReceiveMessageDto receiveMessageDto = MessageUtils.toReceiveMessageDto(messageJsonString);
int counter = listenerMapper.selectReceiveMessageCountByPk(receiveMessageDto);
if(counter > 0) {
ackDto = AckDto.builder().result(AckDto.RECEIVE_FAIL).message("이전 전송한 메시지 중 중복된 UUID가 존재합니다.").build();
}
else {
listenerMapper.insertReceiveMessage(receiveMessageDto);
ackDto = AckDto.builder().result(AckDto.RECEIVE_SUCCESS).build();
}
} catch (IllegalMessageException | NullMessageException | InCompleteMessageException e) {
log.error("{}", e, e);
ackDto = AckDto.builder().result(AckDto.RECEIVE_FAIL).message(e.getLocalizedMessage()).build();
}
return ackDto;
}
public AckDto receiveMessage(String messageJsonString) { public AckDto receiveMessage(String messageJsonString) {
AckDto ackDto = null; AckDto ackDto = null;

@ -1,16 +1,19 @@
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.AgentConfigDto;
import com.bsmlab.dfx.agent.config.AgentConfigReader;
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.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.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.*; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -18,25 +21,23 @@ import java.util.Map;
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class TaskExecutorService { public class TaskExecutorService {
private final Settings settings; private final AgentConfigReader agentConfigReader;
private final SqlExecuteService sqlExecuteService; private final SqlExecuteService sqlExecuteService;
@Async("threadPoolTaskExecutor") @Async("threadPoolTaskExecutor")
public void processDropBox(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()); AgentConfigDto.DropBox dropBox = agentConfigReader.getDropBox(receiveMessageDto.getRecipientDropBoxId());
if("SAVE_DATA_TABLE".equals(dropBoxDto.getTaskType())) { if(dropBox.getTaskType() == AgentConfigDto.TaskType.SAVE_DB_TABLE) {
//public Map<String, Object> insert(String dataSourceId, String sqlId, Map<String, Object> parameter) {
String dataString = receiveMessageDto.getData();
List<Map<String, Object>> dataMapList = null; //(List<Map<String, Object>>)receiveMessageDto.getData();
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, Object>> dataMapList = null;
dataMapList = (List<Map<String, Object>>) objectMapper.readValue(receiveMessageDto.getData(), List.class); dataMapList = (List<Map<String, Object>>) objectMapper.readValue(receiveMessageDto.getData(), List.class);
for(Map<String, Object> dataMap : dataMapList) { for(Map<String, Object> dataMap : dataMapList) {
sqlExecuteService.insert(dropBoxDto.getDataSourceId(), dropBoxDto.getSqlId(), dataMap); sqlExecuteService.insert(dropBox.getDataSourceId(), dropBox.getSqlId(), dataMap);
} }
} }
else if("RECEIVE_FILE".equals(dropBoxDto.getTaskType())) { else if(dropBox.getTaskType() == AgentConfigDto.TaskType.RECEIVE_FILE) {
} }
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {

@ -1,5 +1,6 @@
package com.bsmlab.dfx.agent.task.dropbox; package com.bsmlab.dfx.agent.task.dropbox;
import com.bsmlab.dfx.agent.config.AgentConfigReader;
import com.bsmlab.dfx.agent.config.Settings; import com.bsmlab.dfx.agent.config.Settings;
import com.bsmlab.dfx.agent.listener.dto.ReceiveMessageDto; import com.bsmlab.dfx.agent.listener.dto.ReceiveMessageDto;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -15,13 +16,22 @@ import java.util.concurrent.ConcurrentLinkedQueue;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
/**
* Listener DropBoxService (queue) . (DropBoxService.add())
* TaskExecutorStarter DropBoxService.poll() .
*/
public class DropBoxService { public class DropBoxService {
private final Settings settings; private final AgentConfigReader agentConfigReader;
private ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>(); private ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
/**
* (ReceiveMessageDto) UUID . UUID .
* @param receiveMessageDto
* @return
*/
public boolean isExistToday(ReceiveMessageDto receiveMessageDto) { public boolean isExistToday(ReceiveMessageDto receiveMessageDto) {
boolean isExist = false; boolean isExist = false;
File root = new File(settings.getMessageStorageRootPath()); File root = new File(agentConfigReader.getAgentConfigDto().getDropBox().getMessageStorageRoot());
Date today = new Date(System.currentTimeMillis()); Date today = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd/"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd/");
String todayDirectoryString = root.getAbsolutePath() + "/" + dateFormat.format(today); String todayDirectoryString = root.getAbsolutePath() + "/" + dateFormat.format(today);
@ -36,8 +46,12 @@ public class DropBoxService {
return isExist; return isExist;
} }
/**
* (queue) .
* @param receiveMessageDto
*/
public void add(ReceiveMessageDto receiveMessageDto) { public void add(ReceiveMessageDto receiveMessageDto) {
File root = new File(settings.getMessageStorageRootPath()); File root = new File(agentConfigReader.getAgentConfigDto().getDropBox().getMessageStorageRoot());
Date today = new Date(System.currentTimeMillis()); Date today = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd/hh"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd/hh");
String targetDirectoryString = root.getAbsolutePath() + "/" + dateFormat.format(today); String targetDirectoryString = root.getAbsolutePath() + "/" + dateFormat.format(today);
@ -58,6 +72,10 @@ public class DropBoxService {
} }
} }
/**
* (queue) .
* @return ReceiveMessageDto serialize
*/
public String poll() { public String poll() {
return queue.poll(); return queue.poll();
} }

Loading…
Cancel
Save