[java] JMS를 사용하여 메시지를 비동기적으로 처리하는 방법

Java Message Service (JMS)는 메시지 지향 미들웨어 (MOM)를 구현하기 위한 자바 API입니다. JMS를 사용하면 애플리케이션 간에 비동기적으로 메시지를 주고받을 수 있습니다. 이 글에서는 JMS를 사용하여 메시지를 비동기적으로 처리하는 방법에 대해 알아보겠습니다.

1. JMS 연결 설정

먼저 JMS 연결을 설정해야 합니다. JMS 연결은 JMS provider에 연결하는 작업으로, JMS provider에 따라 다를 수 있습니다. 아래는 ActiveMQ를 사용한 JMS 연결 설정 예시입니다.

import javax.jms.*;

public class JMSApp {
  private static final String BROKER_URL = "tcp://localhost:61616";
  private static final String QUEUE_NAME = "myQueue";

  public static void main(String[] args) throws JMSException {
    // JMS 연결 설정
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
    Connection connection = connectionFactory.createConnection();
    connection.start();

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

    // 대상 큐 설정
    Queue queue = session.createQueue(QUEUE_NAME);

    // 송신자 생성
    MessageProducer producer = session.createProducer(queue);

    // 메시지 생성
    TextMessage message = session.createTextMessage("Hello, JMS!");

    // 메시지 송신
    producer.send(message);

    System.out.println("메시지를 송신했습니다.");

    // 연결 종료
    connection.close();
  }
}

위의 예시는 ActiveMQ를 사용하여 JMS 연결을 설정하는 방법을 보여줍니다. BROKER_URL은 JMS provider의 URL이며, QUEUE_NAME은 메시지를 보낼 대상 큐의 이름입니다.

2. 메시지 수신 처리

JMS를 사용하여 메시지를 비동기적으로 처리하려면 메시지 수신 처리를 구현해야 합니다. 아래는 메시지 수신 처리를 구현하는 예시입니다.

import javax.jms.*;

public class JMSApp {
  private static final String BROKER_URL = "tcp://localhost:61616";
  private static final String QUEUE_NAME = "myQueue";

  public static void main(String[] args) throws JMSException {
    // JMS 연결 설정 생략

    // 소비자 생성
    MessageConsumer consumer = session.createConsumer(queue);

    // 메시지 수신 및 처리
    consumer.setMessageListener(message -> {
      try {
        if (message instanceof TextMessage) {
          TextMessage textMessage = (TextMessage) message;
          System.out.println("메시지를 수신했습니다: " + textMessage.getText());
        }
      } catch (JMSException e) {
        e.printStackTrace();
      }
    });

    // 연결 종료 생략
  }
}

위의 예시는 JMS 소비자를 생성하고, setMessageListener() 메서드를 통해 메시지를 비동기적으로 처리하는 방법을 보여줍니다. 수신한 메시지가 TextMessage 인스턴스인 경우, getText() 메서드를 통해 메시지의 내용을 얻을 수 있습니다.

3. 마무리

JMS를 사용하여 메시지를 비동기적으로 처리하는 방법에 대해 알아보았습니다. JMS를 사용하면 애플리케이션 간에 메시지를 비동기적으로 주고받을 수 있어서 시스템의 확장성과 유연성을 향상시킬 수 있습니다. JMS의 다양한 기능과 설정에는 추가적인 학습이 필요하며, 각 JMS provider의 문서를 참조하는 것이 좋습니다.

참고 자료