[java] JMS를 사용하여 메시지를 다중 수신하는 방법

Java Message Service (JMS)는 메시지 기반 애플리케이션 간 통신을 위한 표준 API입니다. JMS를 사용하면 메시지를 전송하고 수신하는 애플리케이션을 쉽게 구현할 수 있습니다. 이번 포스트에서는 JMS를 사용하여 메시지를 다중 수신하는 방법에 대해 알아보겠습니다.

JMS Queue 구성하기

첫 번째로, JMS Queue를 구성해야 합니다. JMS Queue는 메시지를 보내고 받는 대기열입니다. 다음은 JMS Queue를 구성하는 예제입니다.

import javax.jms.*;

public class JMSQueueConfig {

    public static void main(String[] args) {
        try {
            // JNDI를 사용하여 InitialContext 생성
            InitialContext initialContext = new InitialContext();

            // ConnectionFactory를 Lookup하여 얻기
            QueueConnectionFactory connectionFactory = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");

            // Connection 생성
            QueueConnection connection = connectionFactory.createQueueConnection();

            // Session 생성
            QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            // Queue를 Lookup하여 얻기
            Queue queue = (Queue) initialContext.lookup("MyQueue");

            // MessageProducer 생성
            QueueSender sender = session.createSender(queue);

            // MessageConsumer 생성 (아래 내용으로 다중 수신 가능)
            QueueReceiver receiver1 = session.createReceiver(queue);
            QueueReceiver receiver2 = session.createReceiver(queue);
            
            // Connection 시작
            connection.start();

            // ...
            
            // 필요한 작업 수행
            
            // ...

            // Connection 닫기
            connection.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

위의 예제에서는 QueueReceiver를 생성하여 동일한 Queue에서 메시지를 다중으로 수신할 수 있습니다.

받은 메시지 처리하기

다음은 QueueReceiver를 사용하여 받은 메시지를 처리하는 예제입니다.

import javax.jms.*;

public class MessageHandler implements MessageListener {

    @Override
    public void onMessage(Message message) {
        try {
            if (message instanceof TextMessage) {
                TextMessage textMessage = (TextMessage) message;
                String text = textMessage.getText();
                // 받은 메시지 처리하기
                System.out.println("Received message: " + text);
            }
        } catch (JMSException ex) {
            ex.printStackTrace();
        }
    }
}

위의 예제에서는 MessageListener 인터페이스를 구현하여 메시지를 비동기적으로 수신합니다. 수신한 메시지는 onMessage() 메소드를 통해 처리할 수 있습니다. 이 메소드를 필요에 따라 구현하여 원하는 작업을 수행할 수 있습니다.

Listener 등록하기

마지막으로, QueueReceiverMessageListener를 등록하여 메시지 수신을 시작해야 합니다. 다음은 QueueReceiverMessageListener를 등록하는 예제입니다.

import javax.jms.*;

public class JMSMessageListenerConfig {

    public static void main(String[] args) {
        try {
            // JNDI를 사용하여 InitialContext 생성
            InitialContext initialContext = new InitialContext();

            // ConnectionFactory를 Lookup하여 얻기
            QueueConnectionFactory connectionFactory = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");

            // Connection 생성
            QueueConnection connection = connectionFactory.createQueueConnection();

            // Session 생성
            QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            // Queue를 Lookup하여 얻기
            Queue queue = (Queue) initialContext.lookup("MyQueue");

            // MessageConsumer 생성
            QueueReceiver receiver = session.createReceiver(queue);

            // MessageListener 등록
            receiver.setMessageListener(new MessageHandler());

            // Connection 시작
            connection.start();

            // ...
            
            // 필요한 작업 수행
            
            // ...

            // Connection 닫기
            connection.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

위의 예제에서는 QueueReceiverMessageHandler를 등록하여 메시지를 처리할 준비를 합니다. 등록된 MessageListenerQueueReceiver로부터 메시지를 비동기적으로 받게 됩니다.

결론

JMS를 사용하여 메시지를 다중 수신하는 방법에 대해 알아보았습니다. JMS Queue를 구성하고 QueueReceiver를 생성하여 동일한 Queue에서 메시지를 다중으로 수신하는 방법을 살펴보았습니다. 또한, MessageListener를 구현하여 받은 메시지를 처리하는 방법을 알아보았습니다. 이를 통해 복잡한 메시지 기반 애플리케이션을 간편하게 구현할 수 있습니다.

참고 자료