JMSの主な概念を次の図に示します。 左側はポイントツーポイント(P2P)モデルで、右側はパブリッシュ/サブスクライブ(Pub/Sub)モデルです。 P2Pでは、メッセージング送信者と受信者の間にキューがあります。 一方、Pub/Subメッセージングでは、パブリッシャとサブスクライバの間にトピックがあります。
図のボックス内の名前は、クライアントアプリケーションがJMSとの通信に使用する必要があるJavaインタフェースを示しています。 Pub/SubおよびP2Pメッセージングモデルは、概念的には異なりますが、共通する点が多くあります。JMSは、Pub/SubおよびP2Pのみが特殊な部分である一般的なメッセージングモデルの中心になります。
JMSアプリケーションは、複数のコンポーネントで構成されます。
コンポーネント | 機能 |
クライアント | メッセージを送受信できるユーザ。 JMSクライアントは、Javaアプリケーション間でメッセージを送受信します。 非JMSクライアントは、実行するメッセージングシステムに固有なクライアントAPIを使用します。 JMSが開発される前に作成された一部のメッセージングアプリケーションでは、JMSクライアントおよび非JMSクライアントの両方がサポートされています。 |
JMSプロバイダ | JMSアプリケーションが実行するホストアプリケーション。 JMSプロバイダはJMSアプリケーションと通信し、堅固なメッセージングアプリケーションに必要なコントロール、機能、および基礎となるメカニズムを提供します。 |
メッセージ | アプリケーション間で受け渡しされる情報。 各アプリケーションによりメッセージに含めることができる情報の種類が定義されます。 |
管理オブジェクト | 管理者により作成および構成され、クライアントにより使用されるJMSオブジェクト。 管理オブジェクトは、プロバイダ固有の状況に影響されないため、JMSクライアントはポータブルな状態でいられます。 |
通常、JMSアプリケーションは、メッセージの送受信を開始するために次の5つの手順を実行する必要があります。
上の図のデータベースでは、JMSにより回復目的のために、ある場所に持続メッセージが保存されることを示しています。 JMSベンダによっては、データベースではなくファイルベースの保存形式が使用されます。 通常、JMSでは、非持続メッセージを扱う場合データベースは使用されません。
JMSにより、パブリッシュ/サブスクライブ(Pub/Sub)およびポイントツーポイント(P2P)の2種類のメッセージモデルが定義されます。 JMS仕様では、実装で少なくともどちらかのモデルがサポートされている必要があります。 両方のモデルは、同じ共通フレームワークを共有するので、コンシューマアプリケーションに対してメッセージを同期または非同期のどちらででも配信できます。
Pub/Subモデルは、一対多、または多対多のいずれかでメッセージをパブリッシュ(配信)します。 次に例を示します。
メッセージは、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プロバイダにより提供されるアドレス名および構成情報が含まれます。 クライアントは、このオブジェクトを使用して、送信するメッセージの宛先、および受信するメッセージの送信元を指定します。
Destinationオブジェクトのインタフェースには、各メッセージモデルに1つずつ2種類あります。 宛先は、Pub/SubモデルではTopic (トピック)と呼ばれ、PTPモデルではQueue (キュー)と呼ばれます。
ConnectionFactory (接続ファクトリ)を使用すると、クライアントはJMSプロバイダとの接続を作成できます。 接続ファクトリは、管理者により定義されている接続構成情報を含み、JNDIを使用して取り出されます。
名前が示すとおり、接続ファクトリは、JMSプロバイダとの接続を作成できます。 Pub/Subモデルでは、接続はTopicConnectionFactory (トピック接続ファクトリ)と呼ばれ、PTPモデルでは、QueueConnectionFactory (キュー接続ファクトリ)と呼ばれます。
JMSは、接続を作成および管理するインタフェースを定義します。 使用するインタフェースのセットは、アプリケーションがPub/SubまたはPTPのどちらを使用するかで異なります。
ペアレントインタフェース | Pub/Subモデルインタフェース | PTPモデルインタフェース |
ConnectionFactory (接続ファクトリ) | TopicConnectionFactory (トピック接続ファクトリ) | QueueConnectionFactory (キュー接続ファクトリ) |
Connection (接続) | TopicConnection (トピック接続) | QueueConnection (キュー接続) |
Destination (宛先) | Topic (トピック) | Queue (キュー) |
Session (セッション) | TopicSession (トピックセッション) | QueueSession (キューセッション) |
MessageProducer (メッセージプロデューサ) | TopicPublisher (トピックパブリッシャ) | QueueSender (キュー送信者) |
MessageConsumer (メッセージコンシューマ) | TopicSubscriber (トピックサブスクライバ) | QueueReceiver (キュー受信者)、QueueBrowser (キューブラウザ) |
JMS仕様では、さらにこれらのインタフェースのほとんどについてXAのさまざまなバージョンが定義されており、トランザクションメッセージングに使用されます。
ペアレントインタフェース | Pub/Subモデルインタフェース | PTPモデルインタフェース |
XAConnectionFactory (XA接続ファクトリ) | XATopicConnectionFactory (XAトピック接続ファクトリ) | XAQueueConnectionFactory (XAキュー接続ファクトリ) |
XAConnection (XA接続) | XATopicConnection (XAトピック接続) | XAQueueConnection (XAキュー接続) |
XASession (XAセッション) | XATopicSession (XAトピックセッション) | XAQueueSession (XAキューセッション) |