[java] Quartz Scheduler에서 작업 간의 병렬 처리하기

Quartz Scheduler는 Java 기반의 작업 스케줄링 라이브러리로, 작업(Job)을 설정된 시간대나 주기에 따라 실행할 수 있습니다. 기본적으로 Quartz Scheduler는 작업을 순차적으로 처리하지만, 때로는 여러 작업을 동시에 병렬로 처리해야 할 수도 있습니다. 이러한 경우를 위해 Quartz Scheduler에서 작업 간의 병렬 처리를 설정하는 방법에 대해 알아보겠습니다.

1. 작업의 병렬 처리 설정

Quartz Scheduler에서 작업을 병렬로 처리하려면 JobDetail 객체의 JobBuilder를 사용하여 작업을 생성하는 과정에서 setJobData 메서드를 사용하여 concurrentExecutionDisallowerequestsRecovery 속성을 설정해야 합니다.

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class ParallelJob implements Job {
    
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 작업 내용
    }
    
    public static void main(String[] args) throws SchedulerException {
        JobDetail job = JobBuilder.newJob(ParallelJob.class)
                .withIdentity("parallelJob")
                .usingJobData("concurrentExecutionDisallowe", false)
                .usingJobData("requestsRecovery", true)
                .build();
                
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("parallelTrigger")
                .startNow()
                .build();
                
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }
}

concurrentExecutionDisallowe 속성을 true로 설정하면, 동일한 작업이 동시에 여러 번 실행되는 것을 방지할 수 있습니다. requestsRecovery 속성을 true로 설정하면, 작업이 실행 중인 서버가 중단되었다가 다시 시작될 경우에도 작업이 복구되어 중단된 지점부터 다시 실행됩니다.

2. 스레드 풀 설정

Quartz Scheduler는 내부적으로 작업을 처리하는 데에 스레드 풀(Thread Pool)을 사용합니다. 병렬 처리를 위해 사용되는 스레드 풀의 크기를 조정할 수 있습니다. 기본적으로 Quartz Scheduler는 org.quartz.threadPool.threadCount 속성을 사용하여 스레드 풀의 크기를 설정하며, 이 값을 조정하여 병렬 처리의 정도를 조절할 수 있습니다.

quartz.properties 파일에 다음과 같이 스레드 풀의 크기를 설정할 수 있습니다.

org.quartz.threadPool.threadCount = 10

위의 예시에서는 스레드 풀의 크기를 10으로 설정하였습니다. 작업의 복잡도나 실행 시간에 따라 적절한 스레드 풀의 크기를 설정해야 합니다.

참고 자료