[java] JMS를 사용하여 메시지 큐와 토픽을 함께 사용하는 방법

Java Message Service(JMS)는 메시지 기반의 통신을 위한 API이다. JMS를 통해 메시지 큐와 토픽을 함께 사용하는 것은 다양한 시스템 간의 실시간 통신을 구현하기 위해 중요하다. 이 글에서는 JMS를 사용하여 메시지 큐와 토픽을 동시에 사용하는 방법에 대해 알아보겠다.

JMS란 무엇인가?

JMS는 메시지 브로커에 연결하여 비동기식 메시지를 전달하는 자바 API이다. JMS의 주요 구성 요소는 메시지 프로듀서(메시지를 생성하고 전송하는 역할), 메시지 컨슈머(메시지를 수신하고 처리하는 역할), 메시지 대기열(메시지를 보관하는 공간), 토픽(메시지를 발행하고 구독하는 역할)이다.

메시지 큐와 토픽의 차이점

메시지 큐와 토픽은 JMS에서 메시지를 전달하는 방식에 차이가 있다. 메시지 큐는 메시지를 받은 순서대로 처리하고, 하나의 메시지를 여러 컨슈머가 독립적으로 처리할 수 있다. 반면에 토픽은 메시지를 발행한 순서대로 처리하며, 여러 구독자가 동일한 메시지를 동시에 처리할 수 있다.

메시지 큐와 토픽을 함께 사용하는 방법

메시지 큐와 토픽을 함께 사용하기 위해서는 다음의 단계를 따라야 한다.

1. JMS 연결 설정

JMS 연결을 위해 JMS 프로바이더에 액세스할 수 있는 URL, 사용자 인증 정보 등을 설정해야 한다.

// JNDI를 사용하여 JMS 연결 설정
Hashtable<String, String> properties = new Hashtable<>();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
properties.put(Context.PROVIDER_URL, "tcp://localhost:61616");

Context context = new InitialContext(properties);

// ConnectionFactory 및 Topic/Queue 가져오기
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ConnectionFactory");
Queue queue = (Queue) context.lookup("queue/MyQueue");
Topic topic = (Topic) context.lookup("topic/MyTopic");

2. 메시지 큐로 메시지 전송

메시지 큐로 메시지를 전송하기 위해서는 Connection 객체를 생성하고 Session을 만들어야 한다. 그리고 MessageProducer를 통해 메시지를 생성하고 전송한다.

Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(queue);

TextMessage message = session.createTextMessage("Hello, World!");
producer.send(message);

session.close();
connection.close();

3. 토픽으로 메시지 발행

토픽으로 메시지를 발행하기 위해서도 Connection 객체와 Session을 생성해야 한다. 그리고 TopicPublisher를 통해 메시지를 생성하고 발행한다.

Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
TopicPublisher publisher = session.createPublisher(topic);

TextMessage message = session.createTextMessage("Hello, World!");
publisher.publish(message);

session.close();
connection.close();

4. 메시지 큐와 토픽으로 메시지 수신

메시지 큐와 토픽에서 메시지를 수신하기 위해서는 MessageConsumer를 생성하고, MessageListener를 등록하여 비동기적으로 메시지를 수신한다.

Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumerQueue = session.createConsumer(queue);
MessageConsumer consumerTopic = session.createConsumer(topic);

// 메시지 큐에서 메시지 수신
consumerQueue.setMessageListener(new MessageListener() {
    @Override
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println("Received message from queue: " + textMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
});

// 토픽에서 메시지 수신
consumerTopic.setMessageListener(new MessageListener() {
    @Override
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println("Received message from topic: " + textMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
});

connection.start();

위의 예제 코드에서는 메시지 큐와 토픽을 함께 사용하기 위해 ActiveMQ를 사용했지만, 다른 JMS 프로바이더를 사용하는 경우에도 비슷한 방법으로 사용할 수 있다.

결론

JMS를 사용하여 메시지 큐와 토픽을 함께 사용하는 것은 시스템 간의 효율적인 통신을 구현하기 위해 중요하다. 위의 단계를 따라하는 것으로 메시지 큐와 토픽을 동시에 사용하는 코드를 작성할 수 있다. JMS를 활용하여 실시간 통신을 구현할 때 메시지 큐와 토픽을 적절히 조합하여 사용하면 원활한 메시지 전달을 보장할 수 있다.

참고 자료