🐥
ActiveMQによるJMS通信を実装する
はじめに
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のインストール
- Apache ActiveMQの公式サイトからダウンロードします。
- ダウンロードしたファイルを任意のフォルダにインストール(解凍)します。
- インストールしたフォルダに移動して下記のコマンドを実行し、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