[java] Quartz Scheduler와 웹 소켓 서버 연동하기

웹 애플리케이션에서 주기적으로 작업을 실행하고 결과를 웹 소켓으로 전송하기 위해 Quartz Scheduler와 웹 소켓 서버를 연동할 수 있습니다. 이를 통해 실시간으로 작업 진행 상황을 웹 화면에 표시할 수 있습니다.

1. Quartz Scheduler 설정

먼저, Quartz Scheduler를 설정합니다. 이를 위해 quartz.properties 파일을 생성하고 다음과 같이 설정합니다.

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.threadPool.threadCount = 5

위 설정은 메모리 기반의 JobStore를 사용하고, 스레드 풀의 크기를 5로 설정한 예입니다. 필요에 따라 설정을 변경할 수 있습니다.

2. Quartz Job 생성

다음으로, Quartz Job을 생성합니다. Quartz Job은 주기적으로 실행하고자 하는 작업을 정의하는 클래스입니다. 아래는 예시로 “MyJob”이라는 Quartz Job 클래스입니다.

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 작업 실행 내용을 여기에 작성합니다.
        // 웹 소켓으로 작업 진행 상황 전송 등의 로직을 구현합니다.
    }
}

위 예시에서는 Job 인터페이스를 구현하고 execute() 메소드에서 작업 실행 내용을 작성합니다.

3. Quartz Job 스케줄링

Quartz Job을 스케줄링하기 위해 스케줄러를 생성하고 작업을 예약해야 합니다. 이때, SchedulerFactory 클래스를 사용하여 스케줄러를 생성합니다. 아래는 예시 코드입니다.

import org.quartz.JobBuilder;
import org.quartz.CronScheduleBuilder;
import org.quartz.TriggerBuilder;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

public class SchedulerExample {
    public static void main(String[] args) {
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            
            // Quartz Job 생성
            JobDetail job = JobBuilder.newJob(MyJob.class).build();
            
            // 스케줄러에 작업 예약
            Trigger trigger = TriggerBuilder.newTrigger()
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 * * * ?")) // 5분마다 실행 예약
                .build();
            
            scheduler.scheduleJob(job, trigger);
            
            // 스케줄러 시작
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }
    }
}

위 예시에서는 SchedulerFactory를 이용하여 스케줄러를 생성하고, JobBuilderTriggerBuilder를 사용하여 Quartz Job과 Trigger를 생성합니다. 예제에서는 5분마다 작업을 실행하도록 스케줄링하였습니다.

4. 웹 소켓 서버 연동

마지막으로, Quartz Job 내에서 웹 소켓 서버와 연동하여 작업 진행 상황을 전송합니다. 웹 소켓 서버에 데이터를 전송하는 방법은 다양하므로, 해당 환경에 맞게 구현하면 됩니다.

import javax.websocket.Session;

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // 웹 소켓 세션을 얻어옴
        Session session = // 세션 얻어오는 로직
        
        // 작업 진행 상황 데이터를 생성
        String progressData = "작업이 진행 중입니다.";
        
        // 웹 소켓으로 데이터 전송
        session.getBasicRemote().sendText(progressData);
    }
}

위 예시에서는 execute() 메소드 내에서 웹 소켓 세션을 얻어온 후, 작업 진행 상황 데이터를 생성하여 웹 소켓으로 전송하는 로직을 작성하였습니다.

이제, Quartz Scheduler와 웹 소켓 서버를 연동하여 작업을 주기적으로 실행하고, 작업 진행 상황을 실시간으로 웹으로 전송할 수 있습니다. 필요에 따라 Quartz Job의 로직과 웹 소켓 서버의 로직을 추가로 구현하여 원하는 기능을 구현할 수 있습니다.

참고 자료