[java] Quartz Scheduler와 메시지 큐 연동하기

Quartz Scheduler는 스케줄링 작업을 관리하는 오픈 소스 라이브러리입니다. 메시지 큐는 비동기적으로 작업을 처리하기 위한 도구입니다. 이번 글에서는 Quartz Scheduler와 메시지 큐를 연동하는 방법에 대해 알아보겠습니다.

메시지 큐 설정하기

먼저 메시지 큐를 설정해야 합니다. 예를 들어, RabbitMQ를 사용한다고 가정해보겠습니다. RabbitMQ를 설치하고 호스트 이름, 포트 번호, 사용자 이름, 비밀번호를 알고 있다고 가정합니다.

import com.rabbitmq.client.ConnectionFactory;

public class RabbitMQConfig {

    public static ConnectionFactory getConnectionFactory() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        return factory;
    }
}

위의 코드는 RabbitMQ 연결을 위한 ConnectionFactory를 생성합니다. 호스트 이름, 포트 번호, 사용자 이름, 비밀번호는 자신의 RabbitMQ 설정에 맞게 수정해야 합니다.

Quartz Job 생성하기

Quartz Scheduler는 비동기적으로 실행될 Job을 생성해야 합니다. 아래는 예시로 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 실행할 내용 작성
        System.out.println("Hello, Quartz Scheduler!");
    }
}

위의 코드는 MyJob이라는 Quartz Job을 생성합니다. execute 메서드에는 Job이 실행될 내용을 작성하면 됩니다. 여기서는 간단히 “Hello, Quartz Scheduler!”를 출력하는 예시입니다.

Quartz Job과 메시지 큐 연결하기

이제 Quartz Job을 메시지 큐와 연결하는 방법을 알아보겠습니다. 아래 코드는 Quartz Job이 실행될 때 메시지를 RabbitMQ에 전송하는 예시입니다.

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.ConnectionFactory;

public class MyJob implements Job {

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        // RabbitMQ 연결 설정
        ConnectionFactory factory = RabbitMQConfig.getConnectionFactory();
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            // 큐에 메시지 전송
            String message = "Job 실행됨";
            channel.queueDeclare("myQueue", false, false, false, null);
            channel.basicPublish("", "myQueue", null, message.getBytes());
            System.out.println("메시지 전송: " + message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 코드에서는 RabbitMQ와 연결을 설정하고, 큐에 메시지를 전송합니다. 메시지는 “Job 실행됨”이라는 내용으로 전송됩니다. 메시지 전송 후에는 “메시지 전송: “과 해당 메시지를 출력합니다.

메시지 수신하기

마지막으로 메시지를 수신하는 코드를 작성해보겠습니다. 아래 코드는 RabbitMQ로부터 메시지를 받아와 출력하는 예시입니다.

import com.rabbitmq.client.*;

public class MessageConsumer {

    public static void main(String[] args) {
        // RabbitMQ 연결 설정
        ConnectionFactory factory = RabbitMQConfig.getConnectionFactory();
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
            // 큐에서 메시지 수신
            channel.queueDeclare("myQueue", false, false, false, null);
            channel.basicConsume("myQueue", true, (consumerTag, delivery) -> {
                String message = new String(delivery.getBody(), "UTF-8");
                System.out.println("메시지 수신: " + message);
            }, consumerTag -> {});
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 코드는 RabbitMQ로부터 “myQueue”라는 큐에서 메시지를 수신합니다. 수신한 메시지는 “메시지 수신: “과 함께 출력됩니다.

마무리

이번 글에서는 Quartz Scheduler와 메시지 큐를 연동하는 방법에 대해 알아보았습니다. Quartz Scheduler를 사용하여 비동기적으로 작업을 처리하고, 메시지 큐를 사용하여 작업 간의 통신을 보다 효율적으로 관리할 수 있습니다. 이를 활용하여 다양한 작업 조합과 스케줄링을 구현해보세요!

참고 자료: