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
반응형

+ Recent posts