[java] JMS를 사용하여 비동기 메시지 송수신 구현

Java Message Service (JMS)는 Java 언어로 작성된 애플리케이션 간에 비동기 메시지를 송수신하기 위한 API입니다. JMS를 사용하면 메시지를 보내는 쪽과 받는 쪽이 서로 독립적으로 동작할 수 있으며, 시스템 간의 결합도를 낮출 수 있습니다. 이번 포스트에서는 JMS를 사용하여 비동기 메시지 송수신을 구현하는 방법에 대해 알아보겠습니다.

JMS 구성 요소

JMS는 크게 두 가지 구성 요소로 구성됩니다.

  1. Producer(생산자): 메시지를 생성하고 JMS 서버 또는 큐에 전송하는 역할을 합니다.
  2. Consumer(소비자): JMS 서버 또는 큐에서 메시지를 수신하고 처리하는 역할을 합니다.

JMS 구현 단계

JMS를 사용하여 비동기 메시지 송수신을 구현하는 단계는 다음과 같습니다.

  1. JMS Provider(예: Apache ActiveMQ)를 설치하고 구성합니다.
  2. JMS API를 사용하여 메시지 생성과 전송을 위한 Producer를 구현합니다.
  3. JMS API를 사용하여 메시지 수신 및 처리를 위한 Consumer를 구현합니다.

예제 코드

아래는 JMS를 사용하여 비동기 메시지 송수신을 구현하는 예제 코드입니다.

Producer.java

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

public class Producer {
    public static void main(String[] args) throws JMSException {
        // JMS 연결을 위한 ConnectionFactory 생성
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

        // ConnectionFactory를 사용하여 Connection 생성
        Connection connection = connectionFactory.createConnection();
        
        // JMS 세션 생성
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        
        // Destination(최종 목적지) 생성
        Destination destination = session.createQueue("myQueue");
        
        // MessageProducer 생성
        MessageProducer producer = session.createProducer(destination);

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

        // 메시지 전송
        producer.send(message);
        
        // 연결 및 리소스 해제
        producer.close();
        session.close();
        connection.close();
    }
}

Consumer.java

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

public class Consumer implements MessageListener {
    public static void main(String[] args) throws JMSException {
        // JMS 연결을 위한 ConnectionFactory 생성
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");

        // ConnectionFactory를 사용하여 Connection 생성
        Connection connection = connectionFactory.createConnection();

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

        // Destination(최종 목적지) 생성
        Destination destination = session.createQueue("myQueue");

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

        // MessageListener 등록
        consumer.setMessageListener(new Consumer());

        // Connection 시작
        connection.start();
    }

    @Override
    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                System.out.println("Received message: " + textMessage.getText());
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

위의 예제 코드에서는 Apache ActiveMQ를 JMS Provider로 사용하고 있습니다. ActiveMQ를 설치하고 실행한 후에 Producer와 Consumer를 실행하면 Producer가 메시지를 생성하여 Queue에 전송하고, Consumer가 Queue에서 메시지를 수신하여 처리하는 과정을 확인할 수 있습니다.

결론

JMS를 사용하여 비동기 메시지 송수신을 구현하면 애플리케이션 간의 결합도를 낮추고, 확장성과 유연성을 높일 수 있습니다. 이번 포스트에서는 JMS를 사용하여 비동기 메시지 송수신을 구현하는 방법에 대해 알아보았습니다. JMS를 사용하여 복잡한 시스템 아키텍처를 구현하는 데 도움이 될 것입니다.