[java] ActiveMQ와 스케줄링된 메시지

ActiveMQ는 오픈 소스 메시지 브로커 소프트웨어로, 메시지 기반 애플리케이션을 구축하는 데 널리 사용됩니다. 이 글에서는 ActiveMQ를 사용하여 스케줄링된 메시지를 처리하는 방법에 대해 소개하겠습니다.

스케줄링된 메시지란?

스케줄링된 메시지는 특정 일정에 따라 메시지가 전송되도록 예약된 메시지입니다. 예를 들어, 특정 이벤트가 발생하는 시간이 정해져 있거나 주기적으로 메시지를 전송해야 하는 경우에 사용됩니다. ActiveMQ는 이러한 스케줄링된 메시지를 쉽게 구현할 수 있는 기능을 제공합니다.

ActiveMQ 스케줄링된 메시지 설정

ActiveMQ에서 스케줄링된 메시지를 사용하기 위해서는 다음과 같은 단계를 따라야 합니다:

  1. ActiveMQ 브로커를 설치하고 실행합니다.
  2. Java 코드에서 ActiveMQ를 사용하기 위해 필요한 라이브러리를 추가합니다. (예: https://mvnrepository.com/artifact/org.apache.activemq/activemq-all)
  3. 스케줄링된 메시지를 보낼 대상 큐를 설정합니다.

    <!-- ActiveMQ의 스케줄링된 메시지를 보낼 큐 설정 -->
    <bean id="schedulerDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="SCHEDULER.QUEUE" />
    </bean>
    
  4. 메시지 브로커에 접속하여 스케줄링된 메시지를 보내는 코드를 작성합니다.

    import javax.jms.*;
    import org.apache.activemq.ActiveMQConnectionFactory;
    
    public class ScheduledMessageProducer {
        public static void main(String[] args) {
            Connection connection = null;
            try {
                // ActiveMQ에 접속하기 위한 커넥션 팩토리 생성
                ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
    
                // 커넥션 생성
                connection = connectionFactory.createConnection();
                connection.start();
    
                // 세션 생성
                Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    
                // 메시지 보낼 대상 큐 지정
                Queue destination = session.createQueue("SCHEDULER.QUEUE");
    
                // 메시지 프로듀서 생성
                MessageProducer producer = session.createProducer(destination);
    
                // 스케줄링된 메시지 생성 및 전송
                Message message = session.createTextMessage("Scheduled Message");
                long delay = 5000; // 5초 후에 메시지 전송
                producer.send(message, DeliveryMode.PERSISTENT, Message.DEFAULT_PRIORITY, delay);
    
                // 세션 및 커넥션 종료
                session.close();
                connection.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
    

위의 코드에서는 ActiveMQ에 접속하여 “SCHEDULER.QUEUE”라는 큐로 스케줄링된 메시지를 전송하는 예제입니다.

스케줄링된 메시지 수신

메시지를 수신하기 위해서는 스케줄링된 메시지 큐에 메시지를 Listener로 등록해야 합니다. 다음은 스케줄링된 메시지를 수신하는 코드의 예입니다.

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

public class ScheduledMessageConsumer {
   public static void main(String[] args) {
      Connection connection = null;
      try {
          // ActiveMQ에 접속하기 위한 커넥션 팩토리 생성
          ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

          // 커넥션 생성
          connection = connectionFactory.createConnection();
          connection.start();

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

          // 메시지 수신할 대상 큐 지정
          Queue destination = session.createQueue("SCHEDULER.QUEUE");

          // 메시지 컨슈머 생성
          MessageConsumer consumer = session.createConsumer(destination);

          // Listener 등록하여 메시지 수신
          consumer.setMessageListener(new MessageListener() {
              public void onMessage(Message message) {
                  if(message instanceof TextMessage) {
                      TextMessage textMessage = (TextMessage) message;
                      try {
                          System.out.println("Received Scheduled Message: " + textMessage.getText());
                      } catch (JMSException e) {
                          e.printStackTrace();
                      }
                  }
             }
         });

         // 일정 시간 대기 후에 종료
         Thread.sleep(60000);

         // 세션 및 커넥션 종료
         session.close();
         connection.close();
      } catch (JMSException | InterruptedException e) {
          e.printStackTrace();
      }
   }
}

위의 코드에서는 “SCHEDULER.QUEUE” 큐에서 스케줄링된 메시지를 수신하여 로그로 출력하는 예제입니다.

결론

ActiveMQ를 사용하여 스케줄링된 메시지를 처리하는 방법에 대해 알아보았습니다. ActiveMQ의 유연한 기능을 사용하여 메시지를 예약하고 전송할 수 있으며, 메시지를 수신하여 필요한 작업을 수행할 수도 있습니다. 이를 통해 애플리케이션의 복잡성을 낮추고 메시지 기반 아키텍처를 효과적으로 구현할 수 있습니다.

참고 자료