스케쥴러 동작 및 초기화 로직 오류 수정

main
semin.baek 9 months ago
parent da7fbcb7f6
commit 81f4efb339

@ -1,35 +1,28 @@
{ {
"description": "워크스테이션에서 실행함. 개발PC의 agent와 연결. 메시지 수신 후 cubrid 저장",
"myHostId": "bd-test-cubrid", "myHostId": "bd-test-cubrid",
"myListenPort": 17801, "myListenPort": 17801,
"knownAgentList": [ "knownAgentList": [
{
"hostId": "bd-test-oracle",
"hostName": "192.168.0.16",
"listenPort": 16801,
"dropBoxIdList": [
"drop-tto-db"
]
}
], ],
"dataSourceConfig": [ "dataSourceConfig": [
{ {
"dataSourceId": "oracle", "dataSourceId": "cubrid",
"driverClassName": "org.postgresql.Driver", "driverClassName": "cubrid.jdbc.driver.CUBRIDDriver",
"url": "jdbc:oracle:thin:@192.168.0.221:1521:xe", "url": "jdbc:cubrid:14.63.185.105:33000:amif:ami::",
"username": "ami", "username": "ami",
"password": "fox12#$%" "password": "fox12#$%"
} }
], ],
"sqlMapperLocations": [ "sqlMapperLocations": [
"D:/projects/bsm-lab/dfx/dfxagent/src/docs/mapper-examples/**/*.xml" "/home/dfxagent/agent/conf/mappers/**/*.xml"
], ],
"dropBox": { "dropBox": {
"receivedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/received", "receivedMessageStorageRoot": "/home/dfxagent/agent/messages/received",
"processedMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/processed", "processedMessageStorageRoot": "/home/dfxagent/agent/messages/processed",
"failureMessageStorageRoot": "D:/projects/bsm-lab/dfx/dfxagent/src/docs/messages/failure", "failureMessageStorageRoot": "/home/dfxagent/agent/messages/failure",
"dropBoxList": [ "dropBoxList": [
{ {
"dropBoxId": "bd-test-cubrid", "dropBoxId": "db-bd-cubrid-save",
"taskType": "RECEIVE_DB_TO_DB_SAVE", "taskType": "RECEIVE_DB_TO_DB_SAVE",
"dataSourceId": "cubrid", "dataSourceId": "cubrid",
"sqlId": "address.dropbox.cubrid.ttoBd.insertTtoBd" "sqlId": "address.dropbox.cubrid.ttoBd.insertTtoBd"

@ -1,10 +1,11 @@
{ {
"description": "개발PC에서 실행함. 웍스테이션 에이전트(bd-test-cubrid)와 연결. 웍스테이션 oracle 에서 TTO_BD 테이블을 조회하여 bd-test-cubrid 에이전트에게 전달함",
"myHostId": "bd-test-oracle", "myHostId": "bd-test-oracle",
"myListenPort": 16801, "myListenPort": 16801,
"knownAgentList": [ "knownAgentList": [
{ {
"hostId": "bd-test-cubrid", "hostId": "bd-test-cubrid",
"hostName": "192.168.0.16", "hostName": "mkami.foxsoft.kr",
"listenPort": 17801, "listenPort": 17801,
"dropBoxIdList": [ "dropBoxIdList": [
"drop-tto-db" "drop-tto-db"
@ -13,9 +14,9 @@
], ],
"dataSourceConfig": [ "dataSourceConfig": [
{ {
"dataSourceId": "oracle", "dataSourceId": "ds-oracle",
"driverClassName": "org.postgresql.Driver", "driverClassName": "oracle.jdbc.driver.OracleDriver",
"url": "jdbc:oracle:thin:@192.168.0.221:1521:xe", "url": "jdbc:oracle:thin:@mkami.foxsoft.kr:1521:xe",
"username": "ami", "username": "ami",
"password": "fox12#$%" "password": "fox12#$%"
} }
@ -40,11 +41,11 @@
}, },
"message": { "message": {
"messageType": "TRANSFER_DB_TO_DB", "messageType": "TRANSFER_DB_TO_DB",
"dataSourceId": "oracle", "dataSourceId": "ds-oracle",
"sqlId": "address.postman.oracle.ttoBd.selectTtoBd10" "sqlId": "address.postman.oracle.ttoBd.selectTtoBd10"
}, },
"recipientHostId": "bd-test-cubrid", "recipientHostId": "bd-test-cubrid",
"recipientDropBoxId": "drop-tto-db", "recipientDropBoxId": "db-bd-cubrid-save",
"routingHostIdList": [ "routingHostIdList": [
"bd-test-oracle", "bd-test-oracle",
"bd-test-cubrid" "bd-test-cubrid"

@ -6,6 +6,7 @@ import java.util.List;
@Data @Data
public class AgentConfigDto { public class AgentConfigDto {
private String description;
private String myHostId; private String myHostId;
private int myListenPort; private int myListenPort;
private List<KnownAgent> knownAgentList; private List<KnownAgent> knownAgentList;

@ -0,0 +1,39 @@
package com.bsmlab.dfx.agent.config;
import com.bsmlab.dfx.agent.config.datasource.DynamicDataSourceService;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxTaskExecutorService;
import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RequiredArgsConstructor
public class BeanInitializer implements SmartInitializingSingleton {
private final DfxAgentConfiguration dfxAgentConfiguration;
private final DynamicDataSourceService dynamicDataSourceService;
private final PostmanSchedulerService postmanSchedulerService;
private final DropBoxTaskExecutorService dropBoxTaskExecutorService;
@Override
public void afterSingletonsInstantiated() {
System.out.println("🔥 BeanInitializer afterSingletonsInstantiated() 진입!");
log.info("✅ BeanInitializer 작동 확인");
/*
// DfxAgentConfiguration 에서 생성한 빈 중 DataSource 관련 설정을 마무리한다.
dynamicDataSourceService.setSqlSessionFactoryMap(dfxAgentConfiguration.getTemporarySqlSessionFactoryMap());
dynamicDataSourceService.setTransactionManagerMap(dfxAgentConfiguration.getTemporaryTransactionManagerMap());
// PostmanSchedulerService, DropBoxTaskExecutorService 는 @RequiredArgsConstructor 이기 때문에 자동으로 injection 된다
// 그 후 @PostConstruct 로직이 실행될 것이다.
log.debug("BeanInitializer afterSingletonsInstantiated [run]");
log.debug("{} ready", postmanSchedulerService.getClass().getName());
log.debug("{} ready", dropBoxTaskExecutorService.getClass().getName());
//TODO 4. Worker 쓰레드 생성
*/
}
}

@ -2,7 +2,9 @@ package com.bsmlab.dfx.agent.config;
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 com.bsmlab.dfx.agent.config.datasource.RefreshableSqlSessionFactoryBean;
import io.micrometer.common.util.StringUtils; import io.micrometer.common.util.StringUtils;
import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.dbcp2.BasicDataSource; import org.apache.commons.dbcp2.BasicDataSource;
@ -13,24 +15,24 @@ import org.mybatis.spring.annotation.MapperScans;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.HashMap; import java.io.IOException;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
@Slf4j @Slf4j
@Getter
@Configuration @Configuration
@RequiredArgsConstructor @RequiredArgsConstructor
@MapperScans({ @MapperScans({
@MapperScan("com.bsmlab.dfx.agent") @MapperScan("com.bsmlab.dfx.agent")
}) })
public class DfxAgentConfiguration { public class DfxAgentConfiguration {
private static final String DB_SOURCE_FILE_PATH = "./storages/dfxagent.mv.db";
// gradle bootRun 실행 설정 // gradle bootRun 실행 설정
// bootRun --args=" --setting.file=D:\projects\bsm-lab\dfx\dfxagent\src\docs\settings-examples\dfxagent.json" // bootRun --args=" --setting.file=D:\projects\bsm-lab\dfx\dfxagent\src\docs\settings-examples\dfxagent.json"
// command line java 실행 설정 // command line java 실행 설정
@ -58,16 +60,25 @@ public class DfxAgentConfiguration {
// 다중 데이터 소스 생성 // 다중 데이터 소스 생성
@Bean(name = "dynamicRoutingDataSource") @Bean(name = "dynamicRoutingDataSource")
public DynamicRoutingDataSource dynamicRoutingDataSource(AgentConfigReader agentConfigReader) { // 실행확인됨 public DynamicRoutingDataSource dynamicRoutingDataSource(AgentConfigReader agentConfigReader) throws IOException { // 실행확인됨
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<>();
List<String> xmlPathList = agentConfigReader.getAgentConfigDto().getSqlMapperLocations();
List<Resource> resourceList = new ArrayList<>();
PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
for(String pathString : xmlPathList) {
Resource[] resourceArray = pathMatchingResourcePatternResolver.getResources("file:" + pathString);
resourceList.addAll(Arrays.asList(resourceArray));
}
List<AgentConfigDto.DataSourceConfig> dataSourceConfigList = agentConfigReader.getAgentConfigDto().getDataSourceConfig(); List<AgentConfigDto.DataSourceConfig> dataSourceConfigList = agentConfigReader.getAgentConfigDto().getDataSourceConfig();
for(AgentConfigDto.DataSourceConfig dataSourceConfig : dataSourceConfigList) { for(AgentConfigDto.DataSourceConfig dataSourceConfig : dataSourceConfigList) {
BasicDataSource dataSource = createBasicDataSource(dataSourceConfig); BasicDataSource dataSource = createBasicDataSource(dataSourceConfig);
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); SqlSessionFactoryBean sqlSessionFactoryBean = new RefreshableSqlSessionFactoryBean();//new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource); sqlSessionFactoryBean.setDataSource(dataSource);
sqlSessionFactoryBean.setMapperLocations(resourceList.toArray(new Resource[0]));
try { try {
sqlSessionFactoryMap.put(dataSourceConfig.getDataSourceId(), sqlSessionFactoryBean.getObject()); sqlSessionFactoryMap.put(dataSourceConfig.getDataSourceId(), sqlSessionFactoryBean.getObject());
} catch (Exception e) { } catch (Exception e) {

@ -1,5 +1,6 @@
package com.bsmlab.dfx.agent.config; package com.bsmlab.dfx.agent.config;
import com.bsmlab.dfx.agent.config.datasource.DynamicDataSourceService;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxTaskExecutorService; import com.bsmlab.dfx.agent.task.dropbox.DropBoxTaskExecutorService;
import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService; import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -12,16 +13,25 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor @RequiredArgsConstructor
@Component @Component
public class StartupRunner implements ApplicationRunner { public class StartupRunner implements ApplicationRunner {
private final DfxAgentConfiguration dfxAgentConfiguration;
private final DynamicDataSourceService dynamicDataSourceService;
private final PostmanSchedulerService postmanSchedulerService; private final PostmanSchedulerService postmanSchedulerService;
private final DropBoxTaskExecutorService dropBoxTaskExecutorService; private final DropBoxTaskExecutorService dropBoxTaskExecutorService;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
System.out.println("✅ StartupRunner.run() 호출됨");
// DfxAgentConfiguration 에서 생성한 빈 중 DataSource 관련 설정을 마무리한다.
dynamicDataSourceService.setSqlSessionFactoryMap(dfxAgentConfiguration.getTemporarySqlSessionFactoryMap());
dynamicDataSourceService.setTransactionManagerMap(dfxAgentConfiguration.getTemporaryTransactionManagerMap());
// PostmanSchedulerService, DropBoxTaskExecutorService 는 @RequiredArgsConstructor 이기 때문에 자동으로 injection 된다 // PostmanSchedulerService, DropBoxTaskExecutorService 는 @RequiredArgsConstructor 이기 때문에 자동으로 injection 된다
// 그 후 @PostConstruct 로직이 실행될 것이다. // 그 후 @PostConstruct 로직이 실행될 것이다.
log.debug("StartupRunner start [run]"); log.debug("StartupRunner start [run]");
log.debug("{} ready", postmanSchedulerService.getClass().getName()); log.debug("{} ready", postmanSchedulerService.getClass().getName());
log.debug("{} ready", dropBoxTaskExecutorService.getClass().getName()); log.debug("{} ready", dropBoxTaskExecutorService.getClass().getName());
//TODO 4. Worker 쓰레드 생성 //TODO 4. Worker 쓰레드 생성
postmanSchedulerService.launch();
dropBoxTaskExecutorService.launch();
} }
} }

@ -0,0 +1,46 @@
package com.bsmlab.dfx.agent.event;
import com.bsmlab.dfx.agent.config.DfxAgentConfiguration;
import com.bsmlab.dfx.agent.config.datasource.DynamicDataSourceService;
import com.bsmlab.dfx.agent.task.dropbox.DropBoxTaskExecutorService;
import com.bsmlab.dfx.agent.task.postman.PostmanSchedulerService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RequiredArgsConstructor
public class ContextReadyListener implements ApplicationListener<ContextRefreshedEvent> {
private final DfxAgentConfiguration dfxAgentConfiguration;
private final DynamicDataSourceService dynamicDataSourceService;
private final PostmanSchedulerService postmanSchedulerService;
private final DropBoxTaskExecutorService dropBoxTaskExecutorService;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("🔥 ContextReadyListener onApplicationEvent() 진입!");
log.info("✅ ContextReadyListener 작동 확인");
/*
// DfxAgentConfiguration 에서 생성한 빈 중 DataSource 관련 설정을 마무리한다.
dynamicDataSourceService.setSqlSessionFactoryMap(dfxAgentConfiguration.getTemporarySqlSessionFactoryMap());
dynamicDataSourceService.setTransactionManagerMap(dfxAgentConfiguration.getTemporaryTransactionManagerMap());
// PostmanSchedulerService, DropBoxTaskExecutorService 는 @RequiredArgsConstructor 이기 때문에 자동으로 injection 된다
// 그 후 @PostConstruct 로직이 실행될 것이다.
log.debug("ContextReadyListener onApplicationEvent [run]");
log.debug("{} ready", postmanSchedulerService.getClass().getName());
log.debug("{} ready", dropBoxTaskExecutorService.getClass().getName());
//TODO 4. Worker 쓰레드 생성
*/
}
@Override
public boolean supportsAsyncExecution() {
return ApplicationListener.super.supportsAsyncExecution();
}
}

@ -21,7 +21,7 @@ public class ReceiveMessageDto implements Serializable {
private String recipientHostId; private String recipientHostId;
private String recipientDropBoxId; private String recipientDropBoxId;
private String data; private String data;
private List<String> attachFileList = new ArrayList<>(); private List<String> attachFileList;// = new ArrayList<>();
private ProcessStatus processStatus; private ProcessStatus processStatus;
public static enum ProcessStatus { public static enum ProcessStatus {

@ -8,8 +8,6 @@ import com.bsmlab.dfx.agent.listener.dto.ReceiveMessageDto;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.micrometer.common.util.StringUtils; import io.micrometer.common.util.StringUtils;
import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.EnumUtils;
@ -34,29 +32,28 @@ public class DropBoxTaskExecutorService {
private final AgentConfigReader agentConfigReader; private final AgentConfigReader agentConfigReader;
private final SqlExecuteService sqlExecuteService; private final SqlExecuteService sqlExecuteService;
private final DropBoxService dropBoxService; private final DropBoxService dropBoxService;
@Getter
private List<AgentConfigDto.Postman> scheduledTypePostmanList;
/** /**
* *
* DB + * DB +
* @param messageFilePath * @param messageFilePath
*/ */
@SuppressWarnings("unchecked")
@Async("dropBoxProcessorThreadPoolTaskExecutor") @Async("dropBoxProcessorThreadPoolTaskExecutor")
public void processDropBox(String messageFilePath) { public void processDropBox(String messageFilePath) {
ReceiveMessageDto receiveMessageDto = ReceiveMessageDto.builder().build(); ReceiveMessageDto receiveMessageDto = ReceiveMessageDto.builder().build();
ReceiveMessageDto.ProcessStatus processStatus = null; ReceiveMessageDto.ProcessStatus processStatus;
String processMessage = ""; String processMessage = "";
String messageUuid = ""; String messageUuid;
try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(messageFilePath))) { try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(messageFilePath))) {
receiveMessageDto = (ReceiveMessageDto)objectInputStream.readObject(); receiveMessageDto = (ReceiveMessageDto)objectInputStream.readObject();
messageUuid = receiveMessageDto.getMessageUuid(); messageUuid = receiveMessageDto.getMessageUuid();
AgentConfigDto.DropBox dropBox = agentConfigReader.getDropBox(receiveMessageDto.getRecipientDropBoxId()); AgentConfigDto.DropBox dropBox = agentConfigReader.getDropBox(receiveMessageDto.getRecipientDropBoxId());
log.info("process messageUuid:{} dropBoxId: {}", receiveMessageDto.getMessageUuid(), dropBox.getDropBoxId()); log.info("process messageUuid:{} dropBoxId: {}", messageUuid, dropBox.getDropBoxId());
//1. DB 저장 메시지 처리 //1. DB 저장 메시지 처리
if(dropBox.getTaskType() == AgentConfigDto.TaskType.RECEIVE_DB_TO_DB_SAVE) { if(dropBox.getTaskType() == AgentConfigDto.TaskType.RECEIVE_DB_TO_DB_SAVE) {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, Object>> dataMapList = null; List<Map<String, Object>> dataMapList;
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(dropBox.getDataSourceId(), dropBox.getSqlId(), dataMap); sqlExecuteService.insert(dropBox.getDataSourceId(), dropBox.getSqlId(), dataMap);
@ -66,7 +63,7 @@ public class DropBoxTaskExecutorService {
// 1.2 파일 수신 메시지 처리 // 1.2 파일 수신 메시지 처리
// 파일은 ListenService 에서 이미 저장하였음. meta-data 가 있는 경우 DB 저장 // 파일은 ListenService 에서 이미 저장하였음. meta-data 가 있는 경우 DB 저장
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
List<Map<String, Object>> dataMapList = null; List<Map<String, Object>> dataMapList;
dataMapList = (List<Map<String, Object>>) objectMapper.readValue(receiveMessageDto.getData(), List.class); dataMapList = (List<Map<String, Object>>) objectMapper.readValue(receiveMessageDto.getData(), List.class);
for(String attachFilePath : receiveMessageDto.getAttachFileList()) { for(String attachFilePath : receiveMessageDto.getAttachFileList()) {
String fileName = attachFilePath.substring(attachFilePath.lastIndexOf("/") + 1); String fileName = attachFilePath.substring(attachFilePath.lastIndexOf("/") + 1);
@ -140,7 +137,7 @@ public class DropBoxTaskExecutorService {
String url = "https://" + knownAgent.getHostName() + ":" + knownAgent.getListenPort() + "/telegram"; String url = "https://" + knownAgent.getHostName() + ":" + knownAgent.getListenPort() + "/telegram";
String response = restTemplate.postForObject(url, bodyEntity, String.class); String response = restTemplate.postForObject(url, bodyEntity, String.class);
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
AckDto responseAckDto = null; AckDto responseAckDto;
try { try {
responseAckDto = objectMapper.readValue(response, AckDto.class); responseAckDto = objectMapper.readValue(response, AckDto.class);
log.info("message processing is done. {}", receiveMessageDto.getMessageUuid()); log.info("message processing is done. {}", receiveMessageDto.getMessageUuid());
@ -151,8 +148,7 @@ public class DropBoxTaskExecutorService {
} }
} }
@PostConstruct public void launch() { // 실행확인됨
public void run() { // 실행확인됨
log.debug("{} @PostConstruct Run", this.getClass().getName()); log.debug("{} @PostConstruct Run", this.getClass().getName());
while(true) { while(true) {
try { try {

@ -9,7 +9,6 @@ import com.bsmlab.dfx.agent.support.exception.DfxException;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@ -36,7 +35,7 @@ import java.util.concurrent.ScheduledFuture;
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public class PostmanSchedulerService { public class PostmanSchedulerService {
private final ThreadPoolTaskScheduler threadPoolTaskScheduler; private final ThreadPoolTaskScheduler scheduledPostmanThreadPoolTaskScheduler;
private final AgentConfigReader agentConfigReader; private final AgentConfigReader agentConfigReader;
private final SqlExecuteService sqlExecuteService; private final SqlExecuteService sqlExecuteService;
private Map<String, ScheduledFuture<?>> scheduledFutureMap = new HashMap<>(); private Map<String, ScheduledFuture<?>> scheduledFutureMap = new HashMap<>();
@ -46,7 +45,7 @@ public class PostmanSchedulerService {
AgentConfigDto.Postman postman = this.postmanMap.get(postmanId); AgentConfigDto.Postman postman = this.postmanMap.get(postmanId);
this.stop(postmanId); this.stop(postmanId);
String cron = postman.getAction().getCron(); String cron = postman.getAction().getCron();
ScheduledFuture<?> scheduledFuture = threadPoolTaskScheduler.schedule(() -> run(postman), new CronTrigger(cron)); ScheduledFuture<?> scheduledFuture = scheduledPostmanThreadPoolTaskScheduler.schedule(() -> run(postman), new CronTrigger(cron));
scheduledFutureMap.put(postmanId, scheduledFuture); scheduledFutureMap.put(postmanId, scheduledFuture);
} }
@ -58,15 +57,16 @@ public class PostmanSchedulerService {
} }
} }
@PostConstruct
public void launch() { // 실행확인됨 public void launch() { // 실행확인됨
log.debug("{} @PostConstruct Run", this.getClass().getName()); log.debug("{} @PostConstruct Run", this.getClass().getName());
List<AgentConfigDto.Postman> postmanList = agentConfigReader.getScheduledTypePostmanList(); List<AgentConfigDto.Postman> postmanList = agentConfigReader.getScheduledTypePostmanList();
if(postmanList != null) {
for(AgentConfigDto.Postman postman : postmanList) { for(AgentConfigDto.Postman postman : postmanList) {
this.postmanMap.put(postman.getPostmanId(), postman); this.postmanMap.put(postman.getPostmanId(), postman);
this.startPostman(postman.getPostmanId()); this.startPostman(postman.getPostmanId());
} }
} }
}
public void run(AgentConfigDto.Postman postman) { public void run(AgentConfigDto.Postman postman) {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();

@ -1,6 +1,10 @@
spring: spring:
application: application:
name: DFX Agent name: DFX Agent
servlet:
multipart:
max-file-size: 1GB
max-request-size: 1GB
logging: logging:
level: level:
com.bsmlab.dfx.agent: DEBUG com.bsmlab.dfx.agent: DEBUG

Loading…
Cancel
Save