次の各項では、インバウンド・メッセージに対して詳細なメッセージ処理を構成する方法について説明します。
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の実装を参照してください。