[java] Apache ActiveMQ와 프로듀서-컨슈머 패턴

Apache ActiveMQ는 오픈 소스 메시지 브로커로, 메시지 기반 애플리케이션을 개발하기 위한 강력한 도구입니다. 이번 글에서는 Apache ActiveMQ를 사용하여 프로듀서-컨슈머 패턴을 어떻게 구현할 수 있는지 알아보겠습니다.

프로듀서-컨슈머 패턴이란?

프로듀서-컨슈머 패턴은 메시지 큐를 사용하여 애플리케이션 간의 통신을 하는 패턴입니다. 프로듀서는 메시지를 생성하고 큐에 넣어두며, 컨슈머는 큐에서 메시지를 꺼내와 처리합니다. 이 패턴을 사용하면 비동기적으로 메시지를 주고받을 수 있으며, 메시지의 생산과 소비가 분리되기 때문에 애플리케이션 간의 결합도를 낮출 수 있습니다.

Apache ActiveMQ 설정

먼저, Apache ActiveMQ를 설치하고 설정해야합니다. ActiveMQ 홈페이지에서 최신 버전을 다운로드하고 압축을 푼 후에, conf/activemq.xml 파일을 열어 다음과 같이 수정합니다:

<transportConnectors>
  <transportConnector name="tcp" uri="tcp://localhost:61616"/>
</transportConnectors>

위 설정은 ActiveMQ가 tcp://localhost:61616 주소로 메시지를 수신할 수 있도록 설정하는 것입니다.

프로듀서 구현

프로듀서는 ActiveMQ 브로커에 연결하여 메시지를 큐에 넣어주는 역할을 합니다. 다음은 Java를 사용하여 프로듀서를 구현하는 예제 코드입니다:

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

public class Producer {
    public static void main(String[] args) {
        try {
            // ActiveMQ 연결 설정
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();

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

            // 큐 생성
            Destination destination = session.createQueue("myQueue");

            // 메시지 전송자 생성
            MessageProducer producer = session.createProducer(destination);

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

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

            // 리소스 해제
            producer.close();
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

위 코드는 ActiveMQ 브로커에 연결하여 myQueue라는 큐에 “Hello, ActiveMQ!”라는 메시지를 보내는 프로듀서를 생성합니다.

컨슈머 구현

컨슈머는 ActiveMQ 브로커에서 메시지를 수신하여 처리하는 역할을 합니다. 다음은 Java를 사용하여 컨슈머를 구현하는 예제 코드입니다:

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

public class Consumer {
    public static void main(String[] args) {
        try {
            // ActiveMQ 연결 설정
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = connectionFactory.createConnection();

            // 연결 시작
            connection.start();

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

            // 큐 생성
            Destination destination = session.createQueue("myQueue");

            // 메시지 수신자 생성
            MessageConsumer consumer = session.createConsumer(destination);

            // 메시지 수신 대기
            Message message = consumer.receive();

            if (message instanceof TextMessage) {
                // 텍스트 메시지 처리
                TextMessage textMessage = (TextMessage) message;
                System.out.println("Received message: " + textMessage.getText());
            }

            // 리소스 해제
            consumer.close();
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

위 코드는 ActiveMQ 브로커에서 myQueue라는 큐에서 메시지를 수신하여 출력하는 컨슈머를 생성합니다.

결론

Apache ActiveMQ를 사용하여 프로듀서-컨슈머 패턴을 구현하는 방법을 알아봤습니다. 이러한 패턴을 사용하면 애플리케이션 간의 비동기적인 통신을 쉽게 구현할 수 있고, 메시지 큐를 통해 느슨한 결합을 유지할 수 있습니다. ActiveMQ를 사용하면 신뢰성과 확장성이 뛰어난 메시지 시스템을 구축할 수 있습니다.

참고 자료