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 (英語)