🐥

ActiveMQによるJMS通信を実装する

2023/02/08に公開

はじめに

Apache ActiveMQは、JMS(Java Message Service)を実装したオープンソースのミドルウェアです。
JMSは、Javaでメッセージングサービスを利用するための標準APIです。
システム間で同期または非同期でメッセージオブジェクトの通信を行うことが可能です。
今回はActiveMQを使用したJMS通信の方法について紹介します。

JMSのメッセージモデル

JMSにはPoint-to-Point(PTP)と Publisher-Subscriber(Pub/Sub)の2つのメッセージモデルがあります。

Point-to-Point(PTP)

Point-to-Pointは送信者と受信者が1:1のモデルです。

Publish/Subscribe(Pub/Sub)

Publish/Subscribeは送信者から複数の受信者にメッセージを送信するモデルです。

Active MQのインストール

  1. Apache ActiveMQの公式サイトからダウンロードします。
  2. ダウンロードしたファイルを任意のフォルダにインストール(解凍)します。
  3. インストールしたフォルダに移動して下記のコマンドを実行し、ActiveMQを起動します。
./bin/activemq start

今回はサービスファイルによる起動については省略します。

JMS通信のサンプルプログラム

こちらはPublish/Subscribe方式で通信するプログラムです。

送信側のプログラム

import java.io.Serializable;
import javax.jms.Message;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JMSPublisher {
    public static void main(String[] args){
        try {
            // 送信するメッセージ
            TestJMSMessage tjm = new TestJMSMessage();
            tjm.setMsg_text(args[0]);

            // JMSサーバ接続情報
            String jmsServName = "x.x.x.x";
            String jmsServPort = "61616";
            String jmsTopicNm  = "TestJMSTopic";

            // JMSサーバのURLを生成
            String broker_url = "failover://tcp://" + jmsServName + ":" + jmsServPort;
            // JMSコネクションファクトリの取得
            TopicConnectionFactory factory = new ActiveMQConnectionFactory(broker_url);

            // JMSコネクションファクトリからJMSコネクションを取得
            TopicConnection connection = factory.createTopicConnection();
            // JMSセッションの生成
            TopicSession session = connection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);

            // コネクションの開始
            connection.start();

            // トピックの生成
            Topic topic = session.createTopic(jmsTopicNm);
            // メッセージプロデューサの生成
            TopicPublisher publisher = session.createPublisher(topic);

            // メッセージの生成
            Message msg = session.createObjectMessage((Serializable)tjm);

            // メッセージの送信
            publisher.publish(msg);

            // コネクションの終了
            publisher.close();
            session.close();
            connection.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

受信側のプログラム

import javax.jms.ObjectMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JMSSubscriber {
    public static void main(String[] args){
        try {
            // JMSサーバ接続情報
            String jmsServName = "x.x.x.x";
            String jmsServPort = "61616";
            String jmsTopicNm  = "TestJMSTopic";

            // JMSサーバのURLを生成
            String broker_url = "failover://tcp://" + jmsServName + ":" + jmsServPort;
            // JMSコネクションファクトリの取得
            TopicConnectionFactory factory = new ActiveMQConnectionFactory(broker_url);

            // JMSコネクションファクトリからJMSコネクションを取得
            TopicConnection connection = factory.createTopicConnection();
            // JMSセッションの生成
            TopicSession session = connection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);

            // トピックの生成
            Topic topic = session.createTopic(jmsTopicNm);
            // メッセージコンシューマの生成
            TopicSubscriber subscriber = session.createSubscriber(topic);

            // コネクションの開始
            connection.start();

            // メッセージの受信
            ObjectMessage msg = (ObjectMessage)subscriber.receive();

            // メッセージの取得
            TestJMSMessage tjm = (TestJMSMessage)msg.getObject();
            System.out.println(tjm.getMsg_text());

            // コネクションの終了
            subscriber.close();
            session.close();
            connection.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

送信するメッセージオブジェクト

import java.io.Serializable;

public class TestJMSMessage implements Serializable {
    private String msg_text;

    public String getMsg_text() {
        return msg_text;
    }

    public void setMsg_text(String msg_text) {
        this.msg_text = msg_text;
    }
}

受信側のプログラムを起動してから、送信側のプログラムを起動することで、送信側からのメッセージが受信側のプログラムに送られます。

まとめ

以上がActiveMQを使用したJMS通信の実行例になります。
比較的簡単に使用できると思いますので、気になった方は試してみてください。

レスキューナウテックブログ

Discussion