Settings -> AgentConfigReader, AgentConfigDto 변경 완료

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

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

@ -9,7 +9,7 @@ public class AgentConfigDto {
private String hostId;
private int listenPort;
private List<KnownAgent> knownAgent;
private List<DataSource> datasource;
private List<DataSourceConfig> datasourceConfig;
private List<String> sqlMapperLocations;
private DropBoxConfig dropBox;
private List<Postman> postman;
@ -23,7 +23,7 @@ public class AgentConfigDto {
}
@Data
public static class DataSource {
public static class DataSourceConfig {
private String dataSourceId;
private String driverClassName;
private String url;
@ -40,7 +40,7 @@ public class AgentConfigDto {
@Data
public static class DropBox {
private String dropBoxId;
private String taskType;
private TaskType taskType;
private String dataSourceId;
private String sqlId;
private String saveDirectoryRoot;
@ -49,7 +49,7 @@ public class AgentConfigDto {
@Data
public static class Postman {
private String postmanId;
private String taskType;
private TaskType taskType;
private PostmanAction action;
private PostmanMessage message;
private String recipientHostId;
@ -59,7 +59,7 @@ public class AgentConfigDto {
@Data
public static class PostmanAction {
private String type;
private ActionType type;
private String command;
private List<String> parametersKeyList;
private String cron;
@ -67,8 +67,25 @@ public class AgentConfigDto {
@Data
public static class PostmanMessage {
private String messageType;
private MessageType messageType;
private String dataSourceId;
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;
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 {
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;
import com.bsmlab.dfx.agent.config.datasource.DataSourceDto;
import com.bsmlab.dfx.agent.config.datasource.DynamicDataSourceService;
import com.bsmlab.dfx.agent.config.datasource.DynamicRoutingDataSource;
import io.micrometer.common.util.StringUtils;
@ -31,6 +30,7 @@ import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
@ -58,8 +58,8 @@ public class DfxAgentConfiguration {
private Map<String, SqlSessionFactory> temporarySqlSessionFactoryMap = new HashMap<>();
Map<String, DataSourceTransactionManager> temporaryTransactionManagerMap = new HashMap<>();
@Bean("settings")
public Settings loadSettings() {
@Bean(name = "agentConfigReader")
public AgentConfigReader agentConfigReader() {
if(StringUtils.isBlank(this.embeddedDbFileDirectory)) {
log.error("cannot found a embedded DB file. {}", this.embeddedDbFileDirectory);
log.error("exit application");
@ -70,65 +70,70 @@ public class DfxAgentConfiguration {
log.error("exit application");
System.exit(0);
}
Settings settings = new Settings();
settings.loadSettingFile(this.settingFile);
return settings;
AgentConfigReader agentConfigReader = new AgentConfigReader();
agentConfigReader.loadConfigFile(this.settingFile);
return agentConfigReader;
}
@Bean(name = "dynamicRoutingDataSource")
public DynamicRoutingDataSource dynamicRoutingDataSource(Settings settings) {
public DynamicRoutingDataSource dynamicRoutingDataSource(AgentConfigReader agentConfigReader) {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
Map<String, SqlSessionFactory> sqlSessionFactoryMap = new HashMap<>();
Map<String, DataSourceTransactionManager> transactionManagerMap = new HashMap<>();
Map<String, DataSourceDto> dataSourceDtoMap = settings.getDataSourceDtoMap();
for(String dataSourceId : dataSourceDtoMap.keySet()) {
DataSourceDto dataSourceDto = dataSourceDtoMap.get(dataSourceId);
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);
List<AgentConfigDto.DataSourceConfig> dataSourceConfigList = agentConfigReader.getAgentConfigDto().getDatasourceConfig();
for(AgentConfigDto.DataSourceConfig dataSourceConfig : dataSourceConfigList) {
BasicDataSource dataSource = createBasicDataSource(dataSourceConfig);
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
try {
sqlSessionFactoryMap.put(dataSourceId, sqlSessionFactoryBean.getObject());
sqlSessionFactoryMap.put(dataSourceConfig.getDataSourceId(), sqlSessionFactoryBean.getObject());
} catch (Exception e) {
log.error("DynamicRoutingDataSource 생성 중 오류: {}", e.getMessage(), e);
throw new RuntimeException(e);
}
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource);
transactionManagerMap.put(dataSourceId, transactionManager);
dynamicRoutingDataSource.addDataSource(dataSourceId, dataSource);
transactionManagerMap.put(dataSourceConfig.getDataSourceId(), transactionManager);
dynamicRoutingDataSource.addDataSource(dataSourceConfig.getDataSourceId(), dataSource);
}
this.temporarySqlSessionFactoryMap = sqlSessionFactoryMap;
this.temporaryTransactionManagerMap = transactionManagerMap;
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")
public DynamicDataSourceService dynamicDataSourceService() {
DynamicDataSourceService dynamicDataSourceService = new DynamicDataSourceService();

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

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

@ -19,29 +19,6 @@ import org.springframework.stereotype.Service;
@Service
public class ListenerService {
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) {
AckDto ackDto = null;

@ -1,16 +1,19 @@
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.listener.dto.ReceiveMessageDto;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxDto;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
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.Map;
@ -18,25 +21,23 @@ import java.util.Map;
@RequiredArgsConstructor
@Slf4j
public class TaskExecutorService {
private final Settings settings;
private final AgentConfigReader agentConfigReader;
private final SqlExecuteService sqlExecuteService;
@Async("threadPoolTaskExecutor")
public void processDropBox(String messageFilePath) {
try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(messageFilePath))) {
ReceiveMessageDto receiveMessageDto = (ReceiveMessageDto)objectInputStream.readObject();
DropBoxDto dropBoxDto = settings.getDropBoxDto(receiveMessageDto.getRecipientDropBoxId());
if("SAVE_DATA_TABLE".equals(dropBoxDto.getTaskType())) {
//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();
AgentConfigDto.DropBox dropBox = agentConfigReader.getDropBox(receiveMessageDto.getRecipientDropBoxId());
if(dropBox.getTaskType() == AgentConfigDto.TaskType.SAVE_DB_TABLE) {
ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, Object>> dataMapList = null;
dataMapList = (List<Map<String, Object>>) objectMapper.readValue(receiveMessageDto.getData(), List.class);
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) {

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

Loading…
Cancel
Save