[java] ActiveMQ와 토픽 기반 메시지 전송

ActiveMQ는 오픈 소스 메시징 브로커입니다. 토픽 기반 메시지 전송은 메시지를 여러 구독자에게 동시에 전송하는 방식입니다. 이 방식은 발행-구독 모델로 알려져 있으며, 다수의 구독자들이 동일한 메시지를 수신할 수 있습니다.

ActiveMQ 설치

ActiveMQ는 Apache ActiveMQ 웹 사이트에서 다운로드할 수 있습니다. 이후 압축을 푼 뒤 설치 디렉토리로 이동합니다.

ActiveMQ 설정

ActiveMQ를 실행하기 전에 먼저 [ActiveMQ 설치 디렉토리]/conf/activemq.xml 파일을 수정해야 합니다. 이 파일에서 다음 설정을 찾고 수정합니다.

<broker>
  ...
  <transportConnectors>
    ...
  </transportConnectors>
  ...
</broker>

여기서 <transportConnectors> 태그 안에 다음 내용을 추가합니다.

<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000"/> 

위 설정은 MQTT(MQ Telemetry Transport) 프로토콜을 위한 연결을 허용합니다.

Java 클라이언트

ActiveMQ 토픽을 사용하기 위해서는 Java 클라이언트를 구성해야 합니다. 다음은 간단한 Java 코드 예시입니다.

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

public class TopicPublisher {

    private static final String BROKER_URL = "tcp://localhost:61616";
    private static final String TOPIC_NAME = "myTopic";

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

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

            // 토픽 생성
            Destination destination = session.createTopic(TOPIC_NAME);

            // 발행자 생성
            MessageProducer producer = session.createProducer(destination);

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

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

            // 클로즈
            session.close();
            connection.close();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

위 코드는 ActiveMQ에 연결하여 “myTopic”이라는 토픽에 “Hello, ActiveMQ!”라는 메시지를 발송하는 간단한 예시입니다.

구독자 설정

토픽을 구독하기 위해서는 추가로 구독자를 설정해야 합니다. 다음은 구독자 코드 예시입니다.

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

public class TopicSubscriber {

    private static final String BROKER_URL = "tcp://localhost:61616";
    private static final String TOPIC_NAME = "myTopic";

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

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

            // 토픽 생성
            Destination destination = session.createTopic(TOPIC_NAME);

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

            // 메시지 수신
            MessageListener listener = 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();
                    }
                }
            };
            consumer.setMessageListener(listener);

            // 프로그램 종료 방지를 위한 대기
            Thread.sleep(100000);

            // 클로즈
            session.close();
            connection.close();
        } catch (JMSException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

위 코드는 “myTopic”이라는 토픽을 구독하고, 메시지가 도착할 때마다 해당 메시지를 출력하는 예시입니다.

결론

이제 ActiveMQ를 사용하여 토픽 기반 메시지 전송을 구현하는 방법에 대해 알아보았습니다. ActiveMQ를 활용하면 여러 구독자에게 동시에 메시지를 전송할 수 있어 실시간 통신에 유용합니다.

더 자세한 내용은 ActiveMQ 공식 문서를 참조하십시오.