JMSの主な概念を次の図に示します。 左側はポイントツーポイント(P2P)で、右側は発行/購読(Pub/Sub)モデルです。P2Pでは、メッセージング送信者と受信者がキューによって分断されています。一方、発行/購買メッセージングでは、パブリッシャとサブスクライバがトピックで分断されています。
図のボックス内の名前は、クライアントアプリケーションがJMSとの通信に使用する必要があるJavaインタフェースを示しています。発行/購買およびP2Pメッセージングモデルは概念的には異なりますが、共通する点が多くあります。JMSは、発行/購買およびP2Pのみが特殊である一般的なメッセージングモデルの中心になります。
JMSアプリケーションは、複数のコンポーネントで構成されます。
コンポーネント | 関数 |
クライアント | メッセージを送受信できるユーザ。JMSクライアントは、Javaアプリケーション間でメッセージを送受信します。非JMSクライアントは、実行するメッセージングシステム固有のクライアントAPIを使用します。JMSが開発される前に作成された一部のメッセージングアプリケーションでは、JMSクライアントおよび非JMSクライアントの両方がサポートされています。 |
JMSプロバイダ | JMSアプリケーションが実行するホストアプリケーション。JMSプロバイダはJMSアプリケーションと通信し、堅固なメッセージングアプリケーションに必要な制御、機能、および基礎となるメカニズムを提供します。 |
メッセージ | アプリケーション間で受け渡しされる情報。各アプリケーションによりメッセージに含めることができる情報の種類が定義されます。 |
管理オブジェクト | 管理者により作成および構成され、クライアントにより使用されるJMSオブジェクト。管理オブジェクトは、プロバイダ固有の状況に影響されないため、JMSクライアントは移植可能です。 |
通常、JMSアプリケーションは、メッセージの送受信を開始するために次の5つの手順を実行する必要があります。
上の図のデータベースでは、JMSにより回復目的のために、ある場所に持続メッセージが保存されることを示しています。JMSベンダによっては、データベースではなくファイルベースの保存形式が使用されます。通常、JMSでは、非持続メッセージを扱う場合データベースは使用されません。
JMSは次の2つのメッセージモデル、 発行/購買(Pub/Sub)およびポイントツーポイント(P2P)を定義します。JMS仕様では、実装で少なくともどちらかのモデルがサポートされている必要があります。両方のモデルは同じ共通フレームワークを共有するので、コンシューマアプリケーションに対してメッセージを同期または非同期のどちらででも配信できます。
発行/購買モデルは、一対多、または多対多のいずれかでメッセージを発行(配信)します。例:
メッセージは、1つまたは複数のトピックパブリッシャによりトピックに発行されます。該当するユーザは発行されたメッセージを受信するために、1つまたは複数のトピックにサブスクライブします。トピックへのサブスクライブは、永続的または一時的のいずれかです。
サブスクリプション | 説明 |
永続的 | サブスクライバは、オンライン時に指定のトピックからメッセージを受信します。永続的サブスクライバの場合メッセージが配信されるまで保存する必要があるため、さらに高いオーバーヘッドが必要になります。 |
一時的 | 指定のトピックにパブリッシュされたメッセージは、サブスクライバが期限切れになるまで存在します。サブスクライバがアクティブな限り、サブスクライブトピックからメッセージを受信します。メッセージを受信するトピックへのサブスクライバがオンラインでない場合、メッセージは破棄されます。 |
ポイントツーポイント(PTP)モデルは、メッセージを一対一で配信します。例:
メッセージは指定のキューに送信されます。キューのメッセージは、先入れ先出し(FIFO)方式で処理されます。1つのメッセージが複数のサブスクライバに配信されるPub/Subモデルとは異なり、PTPモデルでは、各メッセージは1人の受信者にのみ配信されます。
受信者は、キューから最初のメッセージを取り出し、次に2番目、3番目と続きます。また、受信者は、(たとえばメッセージの数を数えるために)キューのメッセージを参照できます。ただし、順序を無視してメッセージを取り出したり、メッセージを変更したりすることはできません。
メッセージ指向のミドルウェアおよびJMSでは、メッセージは従来の電子メールメッセージではありません。メッセージは、企業アプリケーション間で受け渡しされるフォーマット化されたデータ(要求、イベント、またはステータス)です。
JMSにより、単一の統一されたメッセージAPIが提供され、API以外に互換性のないアプリケーション間でのメッセージの受け渡しに使用されます。また、JMSアプリケーションは、シリアル化が可能なJavaオブジェクトを他のJavaベースのアプリケーションに渡すことができます。
JMSでは、メッセージ本文の形式が数種類提供されているため、Java以外のアプリケーションで使用されているメッセージ形式を複製して渡すことができます。JMSアプリケーションがこのアプリケーションにより渡されるメッセージのコンテキストを理解する必要はありません。
すべてのメッセージについて、ヘッダフィールドの同じセットがサポートされています。次の表では、これらのフィールドについていくつか説明します。完全なリストについては、JMS仕様を参照してください。
フィールド | 説明 |
Time to expire | 期限切れになりプロバイダにより破棄されるまで、メッセージが存在できる時間の長さ。期限にはゼロを設定できます。ゼロに設定すると、メッセージは期限切れになりません。 |
Persistent and non-persistent delivery |
持続(または保証)配信では、メッセージが確実に配信されます。メッセージを要求したすべてのサブスクライバにより受信されるまで、そのメッセージは持続します。メッセージは一度だけ配信されます。
一時(または信頼性のある)配信では、メッセージ配信にあたり妥当な試行が行われますが、システム障害の場合はメッセージを損失することもあります。これらのメッセージは、最大でも1回のみ配信されます。 一時配信は必要なオーバーヘッドが持続配信より低く、保証配信が必要でない場合に使用されます。 |
Priority | 優先度の高いメッセージは、優先度の低いメッセージよりも前に配信されますが、保証されている訳ではありません。優先度には、0(最低)から9(最高)まで10レベルあります。 |
Redelivered flag | クライアントに対し、メッセージがすでに受信されている可能性はあるものの、何らかの理由で受信がクライアントにより確認されていないことを通知します。このフラグは、通常、回復操作の結果として、JMSプロバイダアプリケーションにより設定されます。 |
Reply to | クライアントにより提供された宛先を含み、このメッセージの返信先を示します。このフィールドが入力されている場合、通常、応答が期待されます。 |
プロパティは、ヘッダフィールドに含まれる情報に追加したり、またはベンダやアプリケーションに固有な情報を伝えたりできる値です。JMSは、特定のプロパティを定義し、それらの名前ブロックを予約します。また、JMSは、プロバイダ固有のプロパティに対する命名規則を提供します。
プロパティは、メッセージの送信時に設定できますが、メッセージの受信時にはコンシューマにより設定できます。ヘッダフィールドとともに、プロパティは、指定した条件に基づいてメッセージをフィルタおよびルーティングする場合に、アプリケーションにより使用されます。
プロパティ値の型は、boolean、byte、short、int、long、float、double、およびStringです。JMSにより、すべてのプロパティ名の一覧を取り出すメソッド、および名前付きプロパティの値を取り出すメソッドが提供されます。
JMSでは、6つのメッセージのタイプが定義されています。
形式 | 内容 |
Message | 本文のない普通のメッセージ。このメッセージは、ヘッダとプロパティだけで構成されます。 |
ByteMessage | 解釈されないバイトのストリーム。このフォームは、情報を暗号化して、従来のメッセージングアプリケーションにより使用されるフォーマットに合わせるときに使用できます。 |
MapMessage | 名前と値で構成されるペアのセット。この名前はStringで、値はJavaプリミティブタイプです。 |
ObjectMessage | 単一のシリアル化Javaオブジェクト、またはオブジェクトのコレクション。 |
StreamMessage | 連続して入力され、読み取られるJavaプリミティブ値のストリーム。 |
TextMessage | java.lang.Stringとしてフォーマット化されるテキスト。この形式は、XMLデータを渡す場合に適しています。 |
管理オブジェクトは、JMSプロバイダアプリケーションの管理者により作成されるオブジェクトです。管理オブジェクトは、JNDIネームスペースに置かれ、共通の管理コンソールから管理できます。JMSには、Destination (宛先)およびConnectionFactory (接続ファクトリ)という2つの管理オブジェクトがあります。
Destinationオブジェクトには、JMSプロバイダにより提供されるアドレス名および構成情報が含まれます。クライアントは、このオブジェクトを使用して、送信するメッセージの宛先、および受信するメッセージの送信元を指定します。
各メッセージモデルに1つずつ、2種類のDestinationインタフェースがあります。 発行/購買モデルでは、宛先はTopic (トピック)と呼ばれ、PTPモデルでは、宛先はQueue (キュー)と呼ばれます。
ConnectionFactoryによりクライアントはJMSプロバイダとの接続を作成できます。接続ファクトリは、管理者により定義されている接続構成情報を含み、JNDIを使用して取り出されます。
名前が示すとおり、接続ファクトリは、JMSプロバイダとの接続を作成できます。 発行/購買モデルでは、接続ファクトリはTopicConnectionFactory (トピック接続ファクトリ)と呼ばれ、PTPモデルでは、QueueConnectionFactory (キュー接続ファクトリ)と呼ばれます。
JMSは、接続を作成および管理するインタフェースを定義します。使用するインタフェースのセットは、アプリケーションが発行/購買またはPTPのどちらを使用するかで異なります。
ペアレントインタフェース | 発行/購買モデルインタフェース | PTPモデルインタフェース |
ConnectionFactory (接続ファクトリ) | TopicConnectionFactory (トピック接続ファクトリ) | QueueConnectionFactory (キュー接続ファクトリ) |
Connection (接続) | TopicConnection (トピック接続) | QueueConnection (キュー接続) |
Destination (宛先) | Topic (トピック) | Queue (キュー) |
Session (セッション) | TopicSession (トピックセッション) | QueueSession (キューセッション) |
MessageProducer (メッセージプロデューサ) | TopicPublisher (トピックパブリッシャ) | QueueSender (キュー送信者) |
MessageConsumer (メッセージコンシューマ) | TopicSubscriber (トピックサブスクライバ) | QueueReceiver (キュー受信者)、QueueBrowser (キューブラウザ) |
JMS仕様では、さらにこれらのインタフェースのほとんどについてXAのさまざまなバージョンが定義されており、トランザクションメッセージングに使用されます。
ペアレントインタフェース | 発行/購買モデルインタフェース | PTPモデルインタフェース |
XAConnectionFactory (XA接続ファクトリ) | XATopicConnectionFactory (XAトピック接続ファクトリ) | XAQueueConnectionFactory (XAキュー接続ファクトリ) |
XAConnection (XA接続) | XATopicConnection (XAトピック接続) | XAQueueConnection (XAキュー接続) |
XASession (XAセッション) | XATopicSession (XAトピックセッション) | XAQueueSession (XAキューセッション) |