728x90
반응형
여러개의 쓰레드를 만들고, 각각의 쓰레드에 스케쥴링을 한다고 할 때 다음과 같이 관리할 수 있다.
@Component
public class SchedulerServiceImpl implements SchedulerService {
private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
private static final Map<String, ThreadPoolTaskScheduler> scheduledMap = new HashMap<>();
private String cron = "*/10 * * * * *";
@Override
public void startScheduler(Sample sampleType) {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
// scheduler setting
scheduler.schedule(getRunnable(sampleType), getTrigger());
scheduledMap.put(sampleType.getSampleType(), scheduler);
}
@Override
public void setCron(String cron) { this.cron = cron; }
@Override
public void stopScheduler(Sample sampleType) { scheduledMap.get(sampleType.getSampleType()).shutdown(); }
private Runnable getRunnable(Sample sampleType) {
// do something
Runnable scheduleExecService;
switch (sampleType){
case APPLE:
scheduleExecService = new ScheduleExecAppleServiceImpl();
break;
case SAMSUNG:
scheduleExecService = new ScheduleExecSamsungServiceImpl();
break;
default:
scheduleExecService = new ScheduleExecSamsungServiceImpl();
break;
}
return scheduleExecService;
}
private Trigger getTrigger() {
// cronSetting
return new CronTrigger(cron);
}
}
클래스를 따로 만들지 않고 다음과 같이 구현할 수도 있다.
private static final Map<Long, ThreadPoolTaskScheduler> scheduledMap = new HashMap<>();
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.initialize();
scheduler.schedule(new Runnable() {
@Override
public void run() {
service.write(dto);
}
}, new CronTrigger("* * * * * *"));
쓰레드가 생성될 때에 맞춰 스케줄러를 생성해주고, 쓰레드가 종료될 때 같이 종료해주면 된다.
스케줄러들은 맵으로 관리한다.
스케줄러의 ThreadPool을 따로 관리하고 싶으면 다음을 추가하면 된다.
@Configuration
class SchedulerConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(5);
threadPoolTaskScheduler.setThreadGroupName("scheduler thread pool");
threadPoolTaskScheduler.setThreadNamePrefix("scheduler-thread-");
threadPoolTaskScheduler.initialize();
taskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
}
728x90
반응형
'Back-End > Spring Boot' 카테고리의 다른 글
Spring Boot | ManyToOne Fetch Join 으로 Object 불러오기 (0) | 2023.04.17 |
---|---|
Spring Boot | MultiModule build with Next.js (0) | 2023.03.30 |
Spring Boot | Thread ID 찾아서 interrupt 하기 (0) | 2023.03.14 |
Spring boot | Spring Apache Kafka 사용법 ( with Docker Container ) | Consumer (0) | 2023.03.02 |
Spring boot | Spring Apache Kafka 사용법 ( with Docker Container ) | Producer (0) | 2023.03.02 |