Java Message Service (JMS) とは
Java Message Service (JMS) は、
Javaプログラムがネットワークを介してデータを送受信するためのAPIです。
Java EE 1.3 以降に標準で含まれており、メッセージングという通信方式を
Javaで実現するための仕様を定めています。JMSでは、データを個別に扱うのではなく、メッセージと呼ばれる塊にまとめて送受信します。これにより、システム間の疎結合性を高め、柔軟な連携を可能にします。
メッセージングの一般的な概念
メッセージングとは、ソフトウェアコンポーネント間でメッセージを交換する、疎結合な分散通信の一形態です。メッセージ指向技術では、キューのような仲介役を導入することで、密結合な通信(TCPソケット、CORBA、RMIなど)を緩和します。これにより、コンポーネントは「間接的に」通信するようになり、送信側が受信側を意識する必要がなくなります。
JMSのモデル
JMS APIは、主に以下の2つのモデルをサポートしています。
ポイント・ツー・ポイント(キュー): 1対1の通信モデル
出版-購読型モデル(トピック): 1対多の通信モデル
ポイント・ツー・ポイント(キュー)
ポイント・ツー・ポイントでは、送信者は特定のキューにメッセージを送信し、受信者はそのキューからメッセージを読み取ります。
メッセージはただ1つの受信者によってのみ消費されます。
送信者と受信者は、メッセージの送受信時に同時に稼働している必要はありません。
出版-購読型モデル(トピック)
出版-購読型モデルでは、送信者は特定のトピックにメッセージを「出版」し、受信者はそのトピックを「購読」することでメッセージを受信します。出版者と購読者は互いを意識する必要はありません。これは掲示板のようなイメージです。
複数の購読者が、同一のメッセージを受信できます。
出版者と購読者は、同時に稼働している必要があります。
購読者は、持続的なサブスクリプションを確立することで、継続的にメッセージを受信できます。
コネクション確立
JMSは、アプリケーションをデータ転送レイヤから切り離す手段を提供します。JNDIを利用することで、異なるJMSプロバイダを切り替えて利用できます。接続には、まずコネクションファクトリを使用してキューまたはトピックに接続し、メッセージの送受信を開始します。
メッセージ
JMSのメッセージは、ヘッダー、プロパティ、本文の3つの要素で構成されます。メッセージ本文には、以下の5つの形式があります。
テキスト
マップ (Map)
オブジェクト (Serializable)
ストリーム (Stream)
バイト配列
プロパティには、Stringや各種プリミティブ型が利用でき、メッセージセレクタで使用できます。メッセージセレクタは
SQL92条件式構文のサブセットをサポートしています。
ヘッダーには、以下の様な項目があります。
JMSReplyTo: 返信先を指定するキューまたはトピック
JMSCorrelationID: 返信メッセージと対応するメッセージを関連付けるID
JMSPriority: メッセージの優先度
JMSDeliveryMode: メッセージの永続化設定
利用例
コネクション確立
コネクションの確立は、以下の様に行います(例: Apache ActiveMQ)。実装によって異なります。
java
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
出版-購読型モデルの例
送信側:
java
// Topicの作成
Topic topic = session.createTopic("myTopic");
// MessageProducerの作成
MessageProducer producer = session.createProducer(topic);
// メッセージの作成
TextMessage message = session.createTextMessage("Hello, world!");
// メッセージの送信
producer.send(message);
受信側:
java
// Topicの作成
Topic topic = session.createTopic("myTopic");
// MessageConsumerの作成
MessageConsumer consumer = session.createConsumer(topic);
// メッセージの受信
TextMessage message = (TextMessage) consumer.receive();
System.out.println("Received message: " + message.getText());
ブローカーの起動
JMSブローカーの起動方法は実装によって異なります。別プロセスとして動作させることも、
Java VM内に埋め込むことも可能です。例として、Apache ActiveMQでは`new BrokerService().start();`で埋め込みブローカーを起動できます。
実装
JMSは様々なソフトウェアで実装されています。
Apache ActiveMQ
Apache Qpid (AMQPを使用)
EMS (TIBCO Software)
FioranoMQ (フィオラノ ソフトウェア)
OpenJMS (OpenJMS Group)
JBoss Messaging, HornetQ (
レッドハット (JBoss))
JORAM (OW2 Consortium)
OpenMQ (オラクル(
サン・マイクロシステムズ))
Oracle WebLogic Server, Oracle AQ (オラクル)
RabbitMQ (AMQPを使用)
Solace JMS (Solace Systems)
SonicMQ (Progress Software)
StormMQ (AMQPを使用)
SwiftMQ
WebSphere Application Server (IBM)
WebSphere MQ (
IBM)
歴史
2001年6月25日 - 1.0.2b リリース
2002年3月18日 - 1.1 リリース
2013年5月21日 - 2.0 リリース
関連項目
Java Transaction API
メッセージ指向ミドルウェア
外部リンク
Java Message Service (JMS) (英語)
Java Message Service API (英語)
The Java EE 6 Tutorial -
Java Message Service (英語)