次の各項では、インバウンド・メッセージに対して詳細なメッセージ処理を構成する方法について説明します。
JMSリソース・アダプタは、インバウンド・メッセージの処理時に、構成済の接続ファクトリの設定をオーバーライドしてSHARABLE
サブスクリプション共有ポリシーとUNRESTRICTED
クライアントIDポリシーを使用します。JMSリソース・アダプタのMDBはサブスクリプション名を生成しないため、恒久サブスクリプションにはsubscriptionName
を指定する必要があります。サブスクリプションは、恒久または非恒久の場合に、次のように共有されます。
恒久: 同じ分散トピック上のコンシューマは、同じclientID
、メッセージ・セレクタおよびsubscriptionName
を持つ場合にのみ、恒久サブスクリプションを共有できます。
非恒久: 同じ分散トピック上のコンシューマは、同じclientID
とmessageSelector
を持つ場合にのみ、非恒久サブスクリプションを共有できます。
MDBが着信メッセージを消費していることを確認するために、常にclientId
を構成します。次に例を示します。
. . . <activation-config> <activation-config-property> <activation-config-property-name>clientId</activation-config-property-name> <activation-config-property-value>myMDB</activation-config-property-value> </activation-config-property> </activation-config> . . .
詳細は、Oracle WebLogic Server JMSリソースの管理.の共有サブスクリプションの構成を参照してください。
アプリケーションでサブスクリプション・メッセージの単一スレッド式処理が必要な場合は、WebLogic JMSの順序単位(UOO)処理を使用するようアプリケーションを構成する必要があります。
詳細は、Oracle WebLogic Server JMSアプリケーションの開発のメッセージ順序単位の使用を参照してください。
次の項では、分散トピックを使用して高可用性アプリケーションを開発する際に使用できる設計戦略について説明します。
レプリケートされた分散トピックとパーティション化された分散トピックは、インバウンド・メッセージの消費で次のようにサポートされています。
レプリケートされた分散トピック: すべての物理トピック・メンバーが送信された各メッセージを受信します。メッセージが物理的なトピック・メンバーのいずれかに着信すると、メッセージのコピーが内部で自動的に他のトピック・メンバーに転送されます。
パーティション化された分散トピック: メッセージを受信する分散トピック・メンバーは、メッセージを認識するメンバーのみです。メッセージは他のメンバーには転送されず、他のメンバーのサブスクライバはメッセージのコピーを受信しません。着信メッセージは、JMS Affinity
およびLoad Balance
属性を使用して、分散トピック・メンバー間でロード・バランシングできます。Oracle WebLogic Server JMSリソースの管理のパーティション化された分散トピックのロード・バランシングを参照してください。
One-Copy-Per-Application
は、使用可能なデフォルトの設計パターンで、次の特徴があります。
各アプリケーションが全体として(つまり、アプリケーションのすべてのインスタンスをあわせて)、分散トピックにパブリッシュされる各メッセージのコピーを1つ取得します。つまり、各インスタンスは分散トピックに送信されるメッセージのサブセットのみを取得します。
クライアントIDポリシーはUNRESTRICTED
です。
サブスクリプション共有ポリシーはSHARABLE
です。
サブスクライバが恒久の場合は、同一のサブスクリプションを使用します。
すべてのコンシューマが同じトピック・インスタンス(または分散トピックのメンバー)にサブスクライブします。
One-Copy-Per-Application
設計戦略を実装するには、activation-config
要素にTopicMessageDistributionMode=One-Copy-Per-Application
の値を持つ、ProviderProperties
プロパティをEJBで指定する必要があります。
詳細は、One-Copy-Per-ApplicationのEJB構成の例を参照してください。
注意:
TopicMessageDistributionMode=One-Copy-Per-Server
を指定しない場合は、JMSリソース・アダプタではメッセージの重複を避けるために、デフォルトでTopicMessageDistributionMode=One-Copy-Per-Application
に設定されます。
ejb-jar.xml
ファイルからの次のコード・スニペットは、One-Copy-Per-Application
メッセージ処理を実装しています。
. . . <mdb-resource-adapter> <resource-adapter-mid>wljmsra</resource-adapter-mid> <activation-config> <activation-config-property> <activation-config-property-name>ClientId</activation-config-property-name> <activation-config-property-value>RDT2MDB</activation-config-property-value> </activation-config-property> <activation-config-property> <activation-config-property-name>ProviderProperties</activation-config-property-name> <activation-config-property-value>TopicMessageDistributionMode=One-Copy-Per-Application</activation-config-property-value> </activation-config-property> </activation-config> </mdb-resource-adapter> <!-- Mapping a Queue admin-object to the Resource-Adapter name --> <resource-env-ref> <resource-env-ref-name>jms/ResultTopic</resource-env-ref-name> <jndi-name>wljmsra/rtopic1</jndi-name> </resource-env-ref> <!-- Mapping a Connection Factory to the Resource-Adapter name --> <resource-ref> <res-ref-name>jms/ResultXACFFactory</res-ref-name> <jndi-name>wljmsra/xacf</jndi-name> </resource-ref> . . .
One-Copy-Per-Server
は、アプリケーションの各インスタンスが、トピックにパブリッシュされた各メッセージのコピーを1つ受信する設計パターンです。
One-Copy-Per-Server
設計戦略を実装するには、次のことを行う必要があります。
外部サーバー・インスタンスの起動時に、weblogic.jms.ra.providers.wl.ServerID
プロパティを指定します。たとえば、-Dweblogic.jms.ra.providers.wl.ServerID=
aUniqueIdForTheServer
上のプロパティ仕様で、aUniqueIdForTheServer
は外部サーバーの一意の識別子を表します。
Oracle Glassfishの場合、asadmin
コマンドを使用して、次のようにこのプロパティを構成できます。
asadmin>
create-jvm-options --user
myUsername
--password
myPassword
--host localhost --port 4848 -Dweblogic.jms.ra.providers.wl.ServerID="
aUniqueIdForTheServer
"
activation-config
要素にTopicMessageDistributionMode=One-Copy-Per-Server
の値を持つ、ProviderProperties
プロパティをEJBで指定します。詳細は、One-Copy-Per-ApplicationのEJB構成の例を参照してください。
ejb-jar.xml
ファイルからの次のコード・スニペットは、One-Copy-Per-Server
メッセージ処理を実装しています。
. . . <mdb-resource-adapter> <resource-adapter-mid>wljmsra</resource-adapter-mid> <activation-config> <activation-config-property> <activation-config-property-name>ClientId</activation-config-property-name> <activation-config-property-value>RDTMDB</activation-config-property-value> </activation-config-property> <activation-config-property> <activation-config-property-name>ProviderProperties</activation-config-property-name> <activation-config-property-value>TopicMessageDistributionMode=One-Copy-Per-Server</activation-config-property-value> </activation-config-property> </activation-config> </mdb-resource-adapter> <!-- Mapping a Queue admin-object to the Resource-Adapter name --> <resource-env-ref> <resource-env-ref-name>jms/ResultTopic</resource-env-ref-name> <jndi-name>wljmsra/rtopic1</jndi-name> </resource-env-ref> <!-- Mapping a Connection Factory to the Resource-Adapter name --> <resource-ref> <res-ref-name>jms/ResultXACFFactory</res-ref-name> <jndi-name>wljmsra/xacf</jndi-name> </resource-ref> . . .
MDBアプリケーションをホストする各外部アプリケーション・サーバー・インスタンスでは、トピックが同じクラスタ内または異なるクラスタ内のどちらで実行されているかに関係なく、トピックに対してMDBプールが作成されます。N
個のノードのMDBクラスタでは、N
個のMDBプールが作成されます。各MDBプールはトピック上に個別のサブスクリプションを作成し、異なるMDBプールからのサブスクライバは同じサブスクリプションを共有しません。
詳細は、One-Copy-Per-Serverの実装を参照してください。