この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)
出典検索?: "Java Message Service"
Java Message Service (JMS) とはJavaプログラムにネットワークを介してデータを送受信させるためのAPIである。
Java EE 1.3 以降に標準で含まれている。データを1つずつバラバラに扱うのではなく、メッセージと呼ばれる塊にまとめて送信するメッセージングを行う。1対1のキューと1対多のトピックが使える。受信は、MessageConsumer.receive() による同期受信のほか、MessageListener を使った非同期受信もできる。 メッセージングとは、疎結合分散通信形式のひとつの形式である。この文脈上での"通信"とはソフトウェアコンポーネント間のメッセージ交換である。 メッセージ指向技術は、キューのような仲介役のコンポーネントの導入によって密結合通信(TCPネットワークソケット、CORBA、RMIのような)を緩和する。このアプローチによって、ソフトウェアコンポーネントがお互いに"間接的に"通信するようになる。このメリットは、キューを使用して通信する場合に、メッセージ送信者が正確に受信者を知る必要がないということも含んでいる。 JMS API は二つのモデルをサポートする。 ポイント・ツー・ポイントにおいて、送信者は特定のキューにメッセージを送信し受信者はそのキューからメッセージを読み込む。ここで送信者は、メッセージの宛先を知っていて、受信者のキューに対して直接メッセージを送信している。これは、次のことを特色づける。 出版-購読型モデルでは、特定のメッセージトピックに対してメッセージを出版することができる。購読者は、受信対象のメッセージトピックに対して購読要求を行う。このモデルでは、出版者と購読者がお互いに知ることがない。比喩として掲示板が挙げられる。 このモデルの特徴を以下に挙げる。 出版者は、クライアントが購読可能になるためにサブスクリプションを生成しなくてはいけない。購読者は、持続的なサブスクリプションが確立されている間、継続的に受信し続ける。 JMSは、アプリケーションをデータの転送レイヤから切り離す方法を提供する。同じくJavaクラスは、プロバイダを要求するJNDIを使用することによって、異なるJMSプロバイダを通信を行うために利用することができる。始めに、キューかトピックに接続するためにconnection factoryを使用し、そしてメッセージを送信、もしくは出版する。受信者側では、メッセージを受信、もしくは購読する。 メッセージは本文・ヘッダー・プロパティの3要素からなる。 メッセージ本文には以下の5種類を利用できる。 プロパティの値としては String もしくは各種プリミティブ型の値が利用できる。プロパティに基づいてメッセージセレクタが利用できる。メッセージセレクタの構文は SQL92 条件式構文のサブセット。LIKE 演算子や中間一致も利用可能。 ヘッダーにはいろいろな項目がある。 コネクション確立は以下のようにして行う。最初の1行目は、Apache ActiveMQ の場合であり、実装によって異なる。ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");Connection connection = connectionFactory.createConnection();// ここでメッセージの受信のリスナーの登録を行うconnection.start();// ここでメッセージの送信を行うconnection.close(); 出版-購読型モデルは以下のようにして行う。以下、送信側の例。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);Topic testTopic = session.createTopic("testTopic");MessageProducer producer = session.createProducer(testTopic);producer.send(session.createTextMessage("Hello JMS")); 以下、受信側の例。Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);Topic testTopic = session.createTopic("testTopic");MessageConsumer consumer = session.createConsumer(testTopic);consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { try { System.out.println(((TextMessage) message).getText()); } catch (JMSException e) { } }}); ブローカーの起動方法は実装によってまちまちである。別プロセスとして動作させることもできるし、Java VM 内に埋め込む(共存させる)事もできる。例えば、Apache ActiveMQ の場合、new BrokerService().start(); で埋め込みブローカーが起動でき、埋め込みブローカーに対しては vm://localhost で通信できる。 以下のソフトウェアで実装されている。
メッセージングの一般的な概念
モデル
1対1:ポイント・ツー・ポイント(キュー)
1対多:出版-購読型モデル(トピック)
ポイント・ツー・ポイント
ただ一人だけの消費者がメッセージを取得できる。
生産者は、消費者がメッセージを消費するときに、稼働していなくてもよい。また、消費者もメッセージが送信されたときに稼働していなくてもよい。
出版-購読型モデル
複数の購読者が、メッセージを取得できる。
出版者と購読者は同時に稼働しないといけない。
コネクション確立
メッセージ
テキスト
マップ (Map)
オブジェクト (Serializable)
ストリーム (Stream)
バイト配列
JMSReplyTo ヘッダーでは、返信して欲しいキューもしくはトピックスを指定して、メッセージを処理した後、返信メッセージを送って欲しい送り先を指定することができる。
JMSCorrelationID ヘッダーでどのメッセージに対する返信かというのを表現できる。
JMSPriority ヘッダーで配信の優先順位を指定できる。
JMSDeliveryMode ヘッダーで、メッセージをストレージに永続化するかどうか指定できる。
利用例
コネクション確立
出版-購読型モデル
ブローカーの起動
実装
Apache ActiveMQ
Apache Qpid
EMS - TIBCO Software
FioranoMQ - フィオラノ ソフトウェア
OpenJMS
JBoss Messaging
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 リリース
関連項目.mw-parser-output .side-box{margin:4px 0;box-sizing:border-box;border:1px solid #aaa;font-size:88%;line-height:1.25em;background-color:#f9f9f9;display:flow-root}.mw-parser-output .side-box-abovebelow,.mw-parser-output .side-box-text{padding:0.25em 0.9em}.mw-parser-output .side-box-image{padding:2px 0 2px 0.9em;text-align:center}.mw-parser-output .side-box-imageright{padding:2px 0.9em 2px 0;text-align:center}@media(min-width:500px){.mw-parser-output .side-box-flex{display:flex;align-items:center}.mw-parser-output .side-box-text{flex:1}}@media(min-width:720px){.mw-parser-output .side-box{width:238px}.mw-parser-output .side-box-right{clear:right;float:right;margin-left:1em}.mw-parser-output .side-box-left{margin-right:1em}}ウィキブックスにJava関連の解説書・教科書があります。
Java Transaction API
メッセージ指向ミドルウェア
外部リンク
⇒Java Message Service (JMS) (英語)
⇒Java Message Service API (英語)
⇒The Java EE 6 Tutorial - Java Message Service (英語)