[java] JMS를 사용하여 메시지를 시간별로 스케줄링하는 방법

JMS(Java Message Service)는 자바 애플리케이션 간에 메시지를 교환하기 위한 API입니다. JMS를 사용하면 메시지 기반의 비동기 통신을 구현할 수 있습니다. 이번 포스트에서는 JMS를 사용하여 메시지를 시간별로 스케줄링하는 방법에 대해 알아보겠습니다.

1. JMS 프로젝트 설정

JMS를 사용하기 위해 먼저 프로젝트에 필요한 라이브러리를 추가해야 합니다. 일반적으로 JMS를 사용하기 위해선 Apache ActiveMQ, RabbitMQ 등의 메시징 시스템이 필요합니다. 이들 중에 원하는 메시징 시스템을 선택하여 프로젝트에 라이브러리를 추가하세요.

2. Producer 작성

메시지를 생성하고 스케줄링하려면 Producer(메시지 발신자)를 작성해야 합니다. 아래는 예시 코드입니다.

import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class MessageProducer {

    public static void main(String[] args) throws Exception {
        // ConnectionFactory 생성
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        
        // Connection 생성
        Connection connection = connectionFactory.createConnection();
        connection.start();

        // Session 생성
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // Destination 생성 (큐 or 토픽)
        Destination destination = session.createQueue("myQueue");

        // MessageProducer 생성
        MessageProducer producer = session.createProducer(destination);

        // Message 생성
        Message message = session.createTextMessage("Hello, World!");

        // 메시지를 5초 후에 전송
        long delay = 5000;
        producer.setDeliveryDelay(delay);
        producer.send(message);

        // 자원 해제
        producer.close();
        session.close();
        connection.close();
    }
}

위 코드에서는 ActiveMQ를 사용하여 메시징 시스템을 설정합니다. ConnectionFactory를 생성하고, Connection을 생성한 후에 Session, Destination, MessageProducer 등의 객체를 생성하여 메시지 발신 작업을 진행합니다. setDeliveryDelay() 메소드를 사용하여 메시지를 스케줄링할 수 있습니다. 이 예제에서는 5초 후에 메시지를 전송하도록 설정되어 있습니다.

3. Consumer 작성

메시지를 받기 위해 Consumer(메시지 수신자)를 작성해야 합니다. 아래는 예시 코드입니다.

import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class MessageConsumer implements MessageListener {

    public static void main(String[] args) throws Exception {
        // ConnectionFactory 생성
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

        // Connection 생성
        Connection connection = connectionFactory.createConnection();
        connection.start();

        // Session 생성
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // Destination 생성 (큐 or 토픽)
        Destination destination = session.createQueue("myQueue");

        // MessageConsumer 생성
        MessageConsumer consumer = session.createConsumer(destination);
        consumer.setMessageListener(new MessageConsumer());

        // 메시지를 수신 대기
        Thread.sleep(6000);

        // 자원 해제
        consumer.close();
        session.close();
        connection.close();
    }

    @Override
    public void onMessage(Message message) {
        // 메시지 처리 로직
        if (message instanceof TextMessage) {
            try {
                TextMessage textMessage = (TextMessage) message;
                String text = textMessage.getText();
                System.out.println("Received message: " + text);
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

위 코드에서도 ActiveMQ를 사용하여 메시징 시스템을 설정합니다. Producer와 마찬가지로 ConnectionFactory를 생성하고, Connection, Session, Destination, MessageConsumer 등의 객체를 생성하여 메시지 수신 작업을 진행합니다. setMessageListener() 메소드를 사용하여 메시지가 도착했을 때 호출되는 onMessage() 메소드를 설정합니다.

4. 실행 및 확인

Producer와 Consumer를 각각 실행하여 메시지를 스케줄링하고 전송하는지 확인해보세요. Producer가 메시지를 스케줄링하면 Consumer는 정해진 시간이 지난 후 해당 메시지를 수신할 수 있어야 합니다.

결론

JMS를 사용하여 메시지를 시간별로 스케줄링하는 방법에 대해 알아보았습니다. JMS를 적절히 활용하면 애플리케이션 간에 비동기적으로 통신하고 일정한 시간에 메시지를 전송할 수 있습니다. 프로젝트에 맞는 메시징 시스템을 선택하여 JMS를 적용해보세요.

참고 자료