[java] JMS를 사용하여 게시-구독 메시지 패턴 구현 방법

Java Message Service (JMS)는 Java 애플리케이션 간에 비동기적으로 메시지를 주고받을 수 있는 API입니다. 이번 블로그에서는 JMS를 사용하여 게시-구독 메시지 패턴을 구현하는 방법을 알아보겠습니다.

1. JMS 시작하기

먼저 JMS를 사용하기 위해 다음 단계를 따라 시작해보겠습니다.

1.1 JMS Provider 설치

JMS를 사용하기 위해서는 JMS Provider를 설치해야 합니다. 대표적인 JMS Provider로는 Apache ActiveMQ, IBM MQ, RabbitMQ 등이 있습니다. 각 Provider의 공식 웹사이트에서 다운로드하여 설치합니다.

1.2 JMS Client 설정

JMS를 사용하기 위해 Java 애플리케이션에 JMS Client를 추가해야 합니다. 이를 위해 Maven이나 Gradle을 사용하여 필요한 의존성을 추가합니다. 아래는 Maven을 사용하는 경우의 예시입니다.

<dependency>
    <groupId>javax.jms</groupId>
    <artifactId>jms</artifactId>
    <version>1.1</version>
</dependency>

JMS Client를 추가한 후에는 JMS를 사용할 수 있는 준비가 끝납니다.

2. 게시-구독 메시지 패턴 구현하기

게시-구독 메시지 패턴은 메시지를 한 개 이상의 소비자에게 동시에 보내기 위해 사용됩니다. 이는 하나의 메시지를 여러 개의 큐 또는 토픽에 발행하여 여러 소비자가 메시지를 구독할 수 있도록 하는 것입니다.

2.1 게시자(Publisher) 구현

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

public class Publisher {
    private static final String BROKER_URL = "tcp://localhost:61616";
    private static final String TOPIC_NAME = "sampleTopic";

    public static void main(String[] args) {
        try {
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
            Connection connection = connectionFactory.createConnection();
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic topic = session.createTopic(TOPIC_NAME);
            MessageProducer producer = session.createProducer(topic);

            TextMessage message = session.createTextMessage();
            message.setText("Hello, subscribers!");

            producer.send(message);

            System.out.println("Message sent successfully");

            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

위 코드는 게시자(Publisher)를 구현한 예시입니다. ActiveMQ를 JMS Provider로 사용하며, 먼저 Connection을 생성한 뒤에 Session과 Topic을 생성합니다. 그리고 메시지를 생성하여 Topic에 발행(send)합니다.

2.2 구독자(Subscriber) 구현

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

public class Subscriber {
    private static final String BROKER_URL = "tcp://localhost:61616";
    private static final String TOPIC_NAME = "sampleTopic";

    public static void main(String[] args) {
        try {
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
            Connection connection = connectionFactory.createConnection();
            connection.start();

            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            Topic topic = session.createTopic(TOPIC_NAME);
            MessageConsumer consumer = session.createConsumer(topic);

            consumer.setMessageListener(new MessageListener() {
                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();
                    }
                }
            });

            System.out.println("Waiting for messages...");

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

            connection.close();
        } catch (JMSException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

위 코드는 구독자(Subscriber)를 구현한 예시입니다. 게시자와 마찬가지로 ActiveMQ를 JMS Provider로 사용하며, Connection을 생성한 뒤에 Session과 Topic을 생성합니다. 그리고 MessageConsumer를 생성하여 Topic을 구독하고, MessageListener를 등록하여 메시지를 수신하는 로직을 작성합니다.

3. 실행 및 결과 확인

위에서 구현한 게시자와 구독자 코드를 각각 별도의 Java 클래스로 저장하고, main 메소드를 실행합니다. 게시자가 메시지를 발행하면 구독자는 해당 메시지를 수신하여 콘솔에 출력할 것입니다.

이제 JMS를 사용하여 게시-구독 메시지 패턴을 구현하는 방법을 알게 되었습니다. 다양한 JMS Provider와 기능을 활용하여 실시간 메시지 전송 및 구독 애플리케이션을 구현할 수 있습니다.

참고 자료