diff --git a/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigReader.java b/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigReader.java index 7d3fb56..498b958 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigReader.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/AgentConfigReader.java @@ -8,6 +8,8 @@ import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; @Slf4j @Component @@ -49,4 +51,17 @@ public class AgentConfigReader { } return found; } + + public List getScheduledTypePostmanList() { + List postmanList = null; + for(AgentConfigDto.Postman postman : this.agentConfigDto.getPostman()) { + if(AgentConfigDto.ActionType.SCHEDULED == postman.getAction().getType()) { + if(postmanList == null) { + postmanList = new ArrayList<>(); + } + postmanList.add(postman); + } + } + return postmanList; + } } diff --git a/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java b/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java index 9f4e4d7..789f2e0 100644 --- a/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java +++ b/src/main/java/com/bsmlab/dfx/agent/config/DfxAgentConfiguration.java @@ -21,6 +21,7 @@ import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import javax.sql.DataSource; import java.io.File; @@ -189,15 +190,108 @@ public class DfxAgentConfiguration { return new DataSourceTransactionManager(dataSource); } - @Bean(name = "threadPoolTaskExecutor") - public Executor threadPoolTaskExecutor() { - ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); - threadPoolTaskExecutor.setCorePoolSize(30); // 최소 쓰레드 - threadPoolTaskExecutor.setMaxPoolSize(300); // 최대 쓰레드 - threadPoolTaskExecutor.setQueueCapacity(300); // 대기 큐 - threadPoolTaskExecutor.setThreadNamePrefix("dfxExecutor-"); - threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); // 종료 시 대기 여부 - threadPoolTaskExecutor.initialize(); - return threadPoolTaskExecutor; + @Bean(name = "dropBoxProcessorThreadPoolTaskExecutor") + public Executor dropBoxProcessorThreadPoolTaskExecutor() { + ThreadPoolTaskExecutor dropBoxProcessorThreadPoolTaskExecutor = new ThreadPoolTaskExecutor(); + dropBoxProcessorThreadPoolTaskExecutor.setCorePoolSize(30); // 최소 쓰레드 + dropBoxProcessorThreadPoolTaskExecutor.setMaxPoolSize(300); // 최대 쓰레드 + dropBoxProcessorThreadPoolTaskExecutor.setQueueCapacity(300); // 대기 큐 + dropBoxProcessorThreadPoolTaskExecutor.setThreadNamePrefix("dfxExecutor-"); + dropBoxProcessorThreadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); // 종료 시 대기 여부 + dropBoxProcessorThreadPoolTaskExecutor.initialize(); + return dropBoxProcessorThreadPoolTaskExecutor; + } + + @Bean(name = "scheduledPostmanThreadPoolTaskScheduler") + public ThreadPoolTaskScheduler scheduledPostmanThreadPoolTaskScheduler() { + ThreadPoolTaskScheduler scheduledPostmanThreadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + /** + import org.springframework.context.annotation.Bean; + import org.springframework.context.annotation.Configuration; + import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + + @Configuration + public class SchedulerConfig { + + @Bean + public ThreadPoolTaskScheduler taskScheduler() { + ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); + scheduler.setPoolSize(5); + scheduler.setThreadNamePrefix("dynamic-scheduler-"); + scheduler.initialize(); + return scheduler; + } + } + + import org.springframework.scheduling.Trigger; + import org.springframework.scheduling.TriggerContext; + import org.springframework.scheduling.support.CronTrigger; + import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; + import org.springframework.stereotype.Service; + + import java.util.Date; + import java.util.concurrent.ScheduledFuture; + + @Service + public class DynamicSchedulerService { + + private final ThreadPoolTaskScheduler taskScheduler; + private ScheduledFuture scheduledFuture; + private String currentCron = "0/10 * * * * *"; // 10초마다 + + public DynamicSchedulerService(ThreadPoolTaskScheduler taskScheduler) { + this.taskScheduler = taskScheduler; + } + + public void startDynamicTask() { + scheduledFuture = taskScheduler.schedule(this::runTask, new CronTrigger(currentCron)); + } + + public void updateCron(String newCron) { + stopTask(); + this.currentCron = newCron; + startDynamicTask(); + } + + public void stopTask() { + if (scheduledFuture != null) { + scheduledFuture.cancel(false); + } + } + + private void runTask() { + System.out.println("작업 실행: " + new Date()); + // 실제 작업 로직 + } + } + + @RestController + @RequiredArgsConstructor + public class ScheduleController { + + private final DynamicSchedulerService schedulerService; + + @PostMapping("/start") + public String start() { + schedulerService.startDynamicTask(); + return "스케줄 시작"; + } + + @PostMapping("/update") + public String update(@RequestParam String cron) { + schedulerService.updateCron(cron); + return "크론 변경됨: " + cron; + } + + @PostMapping("/stop") + public String stop() { + schedulerService.stopTask(); + return "스케줄 정지됨"; + } + } + + + */ + return scheduledPostmanThreadPoolTaskScheduler; } } diff --git a/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorService.java b/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorService.java index d4856f2..a0ea216 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorService.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorService.java @@ -9,6 +9,7 @@ import com.bsmlab.dfx.agent.task.dropbox.DropBoxService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.common.util.StringUtils; +import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.EnumUtils; @@ -33,8 +34,15 @@ public class TaskExecutorService { private final AgentConfigReader agentConfigReader; private final SqlExecuteService sqlExecuteService; private final DropBoxService dropBoxService; + @Getter + private List scheduledTypePostmanList; - @Async("threadPoolTaskExecutor") + /** + * 수신한 메시지를 처리하는 쓰레드 + * DB 저장 로직과 파일 또는 파일 + 메타데이터 저장 로직으로 구성됨 + * @param messageFilePath + */ + @Async("dropBoxProcessorThreadPoolTaskExecutor") public void processDropBox(String messageFilePath) { ReceiveMessageDto receiveMessageDto = ReceiveMessageDto.builder().build(); ReceiveMessageDto.ProcessStatus processStatus = null; @@ -121,8 +129,9 @@ public class TaskExecutorService { } } - @Async("threadPoolTaskExecutor") - public void processPostman() { + //@Async("threadPoolTaskExecutor") + public void processPostman(AgentConfigDto.Postman postman) { + } diff --git a/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorStarter.java b/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorStarter.java index 6ba4a10..423cc9d 100644 --- a/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorStarter.java +++ b/src/main/java/com/bsmlab/dfx/agent/task/TaskExecutorStarter.java @@ -1,5 +1,7 @@ package com.bsmlab.dfx.agent.task; +import com.bsmlab.dfx.agent.config.AgentConfigDto; +import com.bsmlab.dfx.agent.config.AgentConfigReader; import com.bsmlab.dfx.agent.task.dropbox.DropBoxService; import io.micrometer.common.util.StringUtils; import jakarta.annotation.PostConstruct; @@ -7,15 +9,23 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.List; + @Component @RequiredArgsConstructor @Slf4j public class TaskExecutorStarter { + private final AgentConfigReader agentConfigReader; private final DropBoxService dropBoxService; private final TaskExecutorService taskExecutorService; @PostConstruct public void run() { + List scheduledPostmanList = agentConfigReader.getScheduledTypePostmanList(); + for(AgentConfigDto.Postman postman : scheduledPostmanList) { + taskExecutorService.processPostman(postman); + } + while(true) { try { Thread.sleep(10);