ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic ServerメッセージドリブンBeanのプログラミング
11g リリース1 (10.3.6)
B61425-04
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

10 JMSトピックを使用したMDBの構成とデプロイ

この章では、JMSトピックのサブスクリプションを自動的に設定し、サブスクリプション・メッセージを処理するMDBを開発する方法を説明します。JMSトピックにパブリッシュされるメッセージは、一致するセレクタ・フィルタを持つすべてのサブスクリプションにレプリケートされます。デプロイされた単一のMDBは複数のトピック・サブスクリプションを作成し、ホストWebLogic Serverインスタンスごとに1つ以上のフリー・プールを持つことが可能です。この動作は、MDB属性設定、トピック・タイプ、および同一のクラスタまたはJVMでトピックとしてMDBが実行されているかどうかによって制御されます。(MDBフリー・プールの詳細は、「MDBおよび同時実行処理」を参照してください。)

また、この章では、トピックMDBとWebLogic JMS分散トピックを併用する方法も説明します。WebLogic JMS分散トピックとは、複数の物理的なトピックから構成される論理トピックであり、各物理トピックは異なるJMSサーバー・インスタンス上でホストされます。この分散トピックの機能は、拡張性と高可用性を向上するためにWebLogic Server 10.3.4で飛躍的に強化されました。この機能拡張には、リモートでホストされる分散トピック、複数の物理的なサブスクリプション全体に渡る単一の論理サブスクリプションの完全分散処理、および同一の物理的なサブスクリプションからメッセージを処理するための複数のJVMなどに関する直接サポートが含まれます。

この章は次のように構成されます。

JMSトピックの詳細は、次を参照してください。

この章をお読みになる前にこのマニュアルの前の章を見直すことをお薦めします。

サポートされるトピック・タイプ

WebLogic MDBは次の種類のトピックをサポートします。

分散トピック・タイプを構成するには、PartitionedまたはReplicatedをJMS分散トピック構成属性のJMS転送ポリシーの値として設定します。詳細は、『Oracle WebLogic Server JMSの構成と管理』のパーティション化された分散トピックの構成に関する項を参照してください。

最もよく使用されるMDB属性

最もよく使用されるトピックMDB属性は次のとおりです。

他の役に立つトピックMDB属性は次のとおりです。

メッセージ分散チューニング設定には、topicMessagesDistributionModedistributedDestinationConnection、およびgenerate-unique-client-id属性が含まれます。

大半の属性は、アノテーションを使用するか、または記述子のXMLスタンザを介するかのいずれかの方法で構成できます。なお、記述子のXMLスタンザおよびアノテーションの固有の属性名は、第11章「MDBのデプロイメント要素およびアノテーション」の表でまとめられています。

JMS宛先、宛先タイプ、および接続ファクトリの設定

トピックMDBの構成は、構成のJMS接続ファクトリ、宛先、および宛先タイプの場所を適切に指定する必要があります。通常、次の操作を実行すると指定できます。

  1. トピック・タイプの指定。ejb-jar.xmlmessage-driven-destination要素では、destination-typejavax.jms.Topicに設定します。あるいは、アノテーションを使用する場合、ActivationConfigPropertypropertyName = "destinationType"およびpropertyValue = "javax.jms.Topic"と共に指定します。

  2. 接続ファクトリのJNDI名および宛先JNDI名の指定。接続ファクトリのJNDI名の指定は通常、接続ファクトリが同一のクラスタまたはサーバー上でMDBとしてホストされている場合には必要ではありません。通常はデフォルトで十分です。

  3. 宛先がMDBプールとして同一クラスタまたはサーバーで存在していない場合、管理上、リモート宛先および接続ファクトリのJNDIエントリからのマッピングを、前述の#2で指定されたエントリに一致するローカルJNDIエントリに構成します。リモート・リソースを参照する方法には別の選択肢がありますが、オラクル社がお薦めするベスト・プラクティスはマッピングする方法です。

各フリー・プールでは、MDBコンテナが指定した接続ファクトリを使用して接続を作成し、接続を使用してその宛先上の1つ以上のサブスクリプションを検索または作成して、最後に接続を使用してサブスクリプションからメッセージを受信するJMSコンシューマを作成します。

接続ファクトリと宛先MDB属性の固有名、およびお薦めのJNDIマッピング構成については、「宛先用のMDBの構成」を参照してください。

サブスクリプション永続性の設定

MDBは、JMSトピック上でサブスクリプションを自動作成します。JMSトピックは、恒久および非恒久の2種類のサブスクリプションをサポートします。

  • 非恒久サブスクリプションは、サブスクライバの存続期間中のみ存在します。サブスクリプションにこれ以上サブスクライバが含まれないとき、そのサブスクリプションは自動的に削除されます。非恒久サブスクリプションに保存されるメッセージは、JMSサーバーが停止またはクラッシュすると絶対に復元されません。

  • 恒久サブスクリプションを使用すると、サブスクライバ・アプリケーションが使用できない期間にパブリッシュされるメッセージをサブスクライバが受信できるようになります。トピック上の各恒久サブスクリプションでは、メッセージの送信時にサブスクリプション上でアクティブなサブスクライバが存在しない場合でも、JMSは送信されるまで(または期限が切れるまで)ファイルまたはデータベース内のパブリッシュされた永続メッセージのそれぞれのコピーを保存します。また、JMSは各恒久サブスクリプション内の非永続メッセージそれぞれのコピーも保存しますが、JMSサーバーが停止またはクラッシュするとそのようなメッセージは復元されません。

    非恒久サブスクリプションはデフォルトです。恒久サブスクリプションを指定するには、ejb-jar.xmlmessage-driven-destination要素で、subscription-durabilityDurableに設定します。あるいは、アノテーションを使用する場合、ActivationConfigPropertypropertyName = "subscriptionDurability"およびpropertyValue = "Durable"と共に指定します。

恒久サブスクリプションの自動検出の設定

MDBのデプロイが解除されるか、またはMDBがサーバーから削除されたとき、恒久トピック・サブスクリプションを自動削除するようにMDBを構成できます。恒久トピック・サブスクリプションを自動削除するようにMDBを構成するには、durable-subscription-deletionTrueに設定します。デフォルトでは、durable-subscription-deletionFalseに設定されています。

コンテナ管理対象トランザクションの設定

「MDBのトランザクション管理戦略の構成」を参照してください。

メッセージ・フィルタリング(JMSセレクタ)の設定

JMSは、標準的なJMSメッセージ・ヘッダー・フィールドとメッセージ・プロパティに基づいてメッセージをフィルタリングするためのSQLスタイルの構文を提供します。また、WebLogic JMSはセレクタ構文への拡張機能をサポートします。これを使用すると、XMLコンテンツに基づいたXMLメッセージのフィルタリングに使用されるXMLの「xpath」式を含むセレクタを指定できます。

メッセージ・セレクタを指定するには、propertyName = "messageSelector"を持つActivationConfigPropertypropertyValueとしてセレクタを指定します。

JMSセレクタの構文は、javax.jms.MessageクラスのJavadocで詳細に説明されています。WebLogicのxpathセレクタ拡張構文は、『Oracle WebLogic Server JMSのプログラミング』のメッセージのフィルタリングに関する項で説明されています。

MDB同時実行性の制御

付録A「トピック・デプロイメント・シナリオ」で説明されているように、MDBデプロイメントは1つ以上のMDBフリー・プールを作成できます。max-beans-in-free-poolおよびdispatch-policy descriptor属性が共に機能し、次に示すようにMDBフリー・プール内でMDBスレッドの同時実行性を制御します。

  • 同時実行性MDBの数を決定する方法の説明は、『Oracle WebLogic Serverパフォーマンスおよびチューニング』の同時実行性MDBの数の決定に関する項を参照してください。

  • MDBのtopicMessagesDistributionModeCompatibilityに設定され、MDBがコンテナ管理対象トランザクションを使用するとき、同時実行性MDBの呼出しは妨害されます。また、max-beans-in-free-poolは、外部(WebLogic以外の)トピックによって主導されるBean管理対象トランザクションMDB用に明示的に1に設定する必要があります。


    警告:

    非トランザクション外部トピック: 外部(WebLogic以外の)トピックと共に機能する非トランザクションMDBには、明示的にmax-beans-in-free-pool1に設定することをお薦めします。この設定に不具合があると、MDBアプリケーションがRuntimeまたはErrorの例外をスローするなど、特定の失敗がある場合にメッセージの損失につながる可能性があります。

    順序単位: WebLogic JMSトピックから消費してWebLogic JMSの「順序単位」値を持つメッセージを処理する非トランザクション「互換性」モードのMDBには、明示的にmax-beans-in-free-pool1に設定することをお薦めします。このユース・ケースのような「順序単位」メッセージは、max-beans-in-free-pool1に設定しない場合、順序通りに処理されない可能性があります。


詳細は、『Oracle WebLogic Serverパフォーマンスおよびチューニング』のメッセージ・ドリブンBeanのチューニングに関する項を参照してください。

サブスクリプション識別子の設定

各JMSトピック・サブスクリプションは、MDB構成設定の数に基づいてMDBが生成する、それぞれの「サブスクリプション識別子」に基づいて作成および参照されます。生成されたサブスクリプション識別子の構文の説明は、付録B「トピック・サブスクリプション識別子」を参照してください。

メッセージ分散チューニングの設定

この項では、メッセージ分散チューニングの設定に関する方法と時期について説明します。これには、すべてのトピック・タイプ(シングルトン、外部、および分散)に適用される情報が含まれます。この設定には、topicMessagesDistributionModedistributedDestinationConnection、およびgenerate-unique-client-id属性が含まれます。これらの属性によって、トピック・サブスクリプションが作成される場所、サブスクリプション識別子の種類、パブリッシュされたトピック・メッセージそれぞれに対してMDBが1回のみ処理するか、あるいはサーバーごとに1回のみ処理するかどうかが制御されます。

結果的に自動生成されるサブスクリプションID、サブスクリプションの場所、およびデプロイされたMDBフリー・プールの場所の詳細と図解は、付録A「トピック・デプロイメント・シナリオ」および付録B「トピック・サブスクリプション識別子」を参照してください。

topicMessagesDistributionModeの設定

topicMessagesDistributionMode設定をdistributedDestinationConnection設定またはgenerate-unique-client-id設定と組み合せて使用し、トピック・メッセージ処理動作を制御します。topicMessagesDistributionModeを設定するには、同じ名前を持つ@ActivationConfigPropertyアノテーションを使用するか、またはejb-jar.xmlデプロイメント記述子で<activation-config-property>を指定します。

topicMessagesDistributionModeの有効な値は次のとおりです。

  • One-Copy-Per-Application: アプリケーションをホストするサーバーの数に関係なく、MDBアプリケーションが分散トピックに1度パブリッシュされた各メッセージを全体的に受信するように指定します。このモードは、WebLogic Server 10.3.4以降のWebLogic JMSシングルトンおよび分散トピックで機能します。

  • One-Copy-Per-Server: MDBアプリケーションの各デプロイメント・インスタンスが、分散トピックにパブリッシュされたすべてのメッセージを受信するように指定します。このモードは、WebLogic Server 10.3.4以降のWebLogic JMSシングルトンおよび分散トピックで機能します。

  • 互換性: (デフォルト) MDBアプリケーションが、10.3.4以前のWebLogic Serverリリースで処理されたのと同じ方法で、分散トピックからのメッセージを処理するよう指定します。このモードは、外部(WebLogic以外の)トピック、ローカルでレプリケートされた分散トピック(RDT) 、およびシングルトンWebLogicトピックを使用する恒久/非恒久サブスクリプションをサポートします。また、リモートRDTを使用する非恒久サブスクリプションもサポートします。詳細は、下記の互換性に関する注意事項を参照してください。


    注意:

    最新のアプリケーションには、One-Copy-Per-ApplicationおよびOne-Copy-Per-Serverモードを使用することをお薦めします。ただし、WebLogic Server 10.3.4以前のバージョンにおけるWebLogic JMSトピックまたは外部(WebLogic以外の)トピックから消費する必要があるアプリケーションは除きます。

    トピック分散モードは、次の制約を持つ様々なトピック・タイプおよびバージョンをサポートします。

    • One-Copy-Per-ApplicationおよびOne-Copy-Per-Serverモードは、WebLogicシングルトンおよびWebLogic Server 10.3.4以降の分散トピックを使用する場合のみ機能します。WebLogicのMDBは、外部(WebLogic以外の)トピック使用時またはWebLogic Serverリリース10.3.4以前からのWebLogicトピックの使用時には警告を記録し、前述のモードを使用するメッセージを処理しません。

    • One-Copy-Per-ApplicationトピックMDBの内、恒久的かつ、ローカル RDTをサブスクライブし、distributedDestinationConnection属性にデフォルトのLocalOnly値を使用するものは、サービスの移行をサポートせず、WebLogic Serverインスタンスごとに1つのトピック・メンバーのみを構成するように求めます。サービスの移行が実行される場合、ローカル・トピック・メンバーが構成される場合、またはサーバーごとに1つ以上のトピック・メンバーがデプロイされる場合、アプリケーションではメッセージの重複または損失が発生し、未処理のメッセージを蓄積する中止サブスクリプションも作成する場合があります。サービスの移行が必要な場合、distributedDestinationConnection属性にデフォルトのLocalOnlyではなく、EveryMemberオプションを使用します。

    • 互換性モードは、外部(WebLogic以外の)トピック、ローカルでレプリケートされた分散トピック(RDT) (後述する制限を持つ)、およびシングルトンWebLogicトピックを使用する恒久/非恒久サブスクリプションをサポートします。また、互換性モードはリモートRDTを使用する非恒久サブスクリプションもサポートします。リモートRDTの論理JNDI名をサブスクライブする恒久的なMDBのデプロイメントは正常に実行されますが、MDBデプロイメントは接続に失敗し、警告ログ・メッセージが表示されます。同様に、WebLogic PDTをサブスクライブするMDBのデプロイメントは正常に実行されますが、MDBデプロイメントは接続に失敗し、警告ログ・メッセージが表示されます。詳細は、下記の「topicMessagesDistributionModeの互換性モードについての注意点」を参照してください。

    • ローカルRDTをサブスクライブする恒久的なMDBの互換性モードは、「topicMessagesDistributionModeの互換性モードについての注意点」を参照してください。

    MDBが生成したサブスクリプション、サブスクリプションID、およびフリー・プールの場所の詳細と図解は、付録A「トピック・デプロイメント・シナリオ」および付録B「トピック・サブスクリプション識別子」を参照してください。

distributedDestinationConnectionの設定

ローカル分散トピックについてtopicMessagesDistributionModeOne-Copy-Per-ApplicationおよびOne-Copy-Per-Serverモードの動作を任意で詳細にチューニングするには、distributedDestinationConnectionアクティブ化構成プロパティを使用できます。あるいは、weblogic-ejb-jar.xmlデプロイメント記述子のdistributed-destination-connection要素を使用できます。有効な値は、LocalOnlyおよびEveryMemberです。

distributedDestinationConnection設定は、WebLogic Server MDBコンテナがクラスタ全体の各サブスクリプションに対してローカルMDBフリー・プールを設定するか(EveryMember)、あるいは現在のWebLogic Serverにローカルなメンバー上のサブスクリプションに対してのみローカル・フリー・プールを設定するかどうかを指定します(LocalOnly: デフォルト)。

distributedDestinationConnectionの使用は次のように制限されます: リモート・クラスタをサブスクライブするMDBに対して指定する場合は、警告メッセージが表示されてオプションが無視されます。互換性モードで使用する場合、警告メッセージが表示されてオプションが無視されます。

EveryMemberを使用する理由の1つは、恒久的なMDBのLocalOnlyには、One-Copy-Per-Serverモード時のローカルRDTに関する制限があるからです。「恒久的なMDBとローカルRDTを併用する際の警告」を参照してください。

EveryMemberを使用するもう1つの理由は、不均一なメッセージ・ロードまたはメッセージ処理の遅延を最適に処理するためです。詳細は、「不均一なメッセージ・ロードおよび/またはメッセージ処理の遅延の処理方法」を参照してください。

topicMessagesDistributionModeの互換性モードについての注意点

  • サポートされるトピック・タイプとバージョンの説明は、前述の「topicMessagesDistributionModeの設定」を参照してください。

  • topicMessagesDistributionMode互換性を非トランザクションMDBと組み合せて使用しており、トピックが外部(WebLogic以外の)宛先であるか、またはトピックが順序単位(UOO)メッセージを使用するWebLogic宛先の場合、警告については、「MDB同時実行性の制御」を参照してください。

  • 動作を変更するには、generate-unique-client-id属性を設定します。

    • generate-unique-client-idがtrueに設定されている場合、恒久的なMDBフリー・プールはそれぞれ固有のサブスクライバIDを生成します。それぞれのMDBフリー・プールは、パブリッシュされたメッセージそれぞれのコピーを受信します。詳細は、付録B「トピック・サブスクリプション識別子」を参照してください。フリー・プールの詳細は、「MDBおよび同時実行性処理」および付録A「トピック・デプロイメント・シナリオ」を参照してください。

    • generate-unique-client-idがfalse (デフォルト)に設定されている場合、恒久的なMDBによってサブスクリプションが1つのみ作成され、1つのMDBフリー・プールのみが恒久サブスクリプションに正常に接続されます(残りのMDBプールは接続に失敗し、警告を記録して再試行を続けます)。

  • ローカルでレプリケートされた分散トピック(ローカルRDT)の論理名をサブスクライブする恒久サブスクリプションMDBの場合、後述の「恒久的なMDBとローカルRDTを併用する際の警告」で説明される構成のみがサポートされます。

  • リモートでレプリケートされたトピック(リモートRDT)の論理名をサブスクライブする恒久サブスクリプションMDBの場合、次のようになります。

    • RDTの論理JNDI名をサブスクライブする恒久的なMDBのデプロイメントは正常に実行されますが、MDBデプロイメントは接続に失敗し、警告ログが表示されます。

  • リモートでレプリケートされたトピックの特定のメンバー宛先をサブスクライブする恒久サブスクリプションMDBの場合、次のようになります。

    • RDTメンバーを直接サブスクライブする恒久MDBのデプロイメントは正常に実行されますが、後続の動作は前述のとおりにgenerate-unique-client-id設定によって決定されます。共通分散宛先の場合、特定のメンバーのJNDI名は"jms-server-name@udd-jndi-name"となります。

  • ローカルでレプリケートされた分散トピック(ローカルRDT)の論理名、リモートでレプリケートされたトピック(リモートRDT)、外部トピック、またはシングルトン・トピックの論理名をサブスクライブする非恒久サブスクリプションMDBの場合、各サーバーはトピックに送信された各メンバーのコピーを受信します。

  • distributedDestinationConnectionオプションは、互換性モードには適用されません。設定すると、警告メッセージが表示され、オプションは無視されます。

ベスト・プラクティス

MDBの構成に役立てるため、次の項の情報を検討します。

互換性モード使用時の非トランザクションMDBについての警告

topicMessagesDistributionMode互換性モードを非トランザクションMDBと組み合せて使用しており、トピックが外部(WebLogic以外の)宛先であるか、またはトピックが順序単位(UOO)メッセージを使用するWebLogic宛先の場合、警告については、「MDB同時実行性の制御」を参照してください。

恒久的なMDBとローカルRDTを併用する際の警告

互換性モードでは、ローカルでレプリケートされた分散トピック(ローカルRDT)の論理名をサブスクライブする恒久サブスクリプションMDBの場合、次の構成のみがサポートされます。

  • 常にgenerate-unique-client-idをtrueに設定します。

  • クラスタ内の各WebLogic ServerがRDTのメンバーのみをホストしていることを確認します。

  • WebLogic JMS service-migrationは使用しないでください。このユース・ケースには対応していません。ただし、「サーバー全体の移行」を使用できます。

  • 各サーバーは、トピックに送信された各メッセージのコピーを受信することに注意します。メッセージがRDTの物理的なトピック・メンバーのいずれかに着信すると、メッセージのコピーが他のトピック・メンバーそれぞれに転送されることをRDTが自動的に確認します。

同様に、distributedDestinationConnectionLocalOnlyに設定されているときにOne-Copy-Per-Applicationモードでは、ローカルでレプリケートされた分散トピック(ローカルRDT)の論理名をサブスクライブする恒久サブスクリプションMDBの場合、次の構成のみがサポートされます。

  • 使用中の構成が前述のお薦め構成と一致しない場合、メッセージの損失、メッセージの重複、メッセージのスタックなどの非確定的動作が発生する可能性があります。別の選択肢を含む詳細は、前述の「topicMessagesDistributionModeの設定」を参照してください。

恒久的なMDB属性、トピック・タイプ、EJB名の変更についての警告

MDBまたはJMS設定を変更すると、恒久サブスクリプション上の現在のメッセージが削除されたり、新規の恒久サブスクリプションに従って既存の恒久サブスクリプションが中止、削除、または置換されたりする可能性があります。このような設定には、トピック・タイプ、JMSセレクタ、分散チューニング、サブスクリプション永続性、ejb-name、およびclient-idが含まれます。

中止された恒久サブスクリプションは、MDBがメッセージを処理していない場合でもメッセージを蓄積し続けます。これによって、割当の例外やJVMメモリー不足エラーが発生し、これ以上メッセージがトピックにパブリッシュされなくなってしまう可能性があります。

中止サブスクリプションの検索および削除の説明は、『Oracle WebLogic Server JMSのプログラミング』の恒久サブスクリプションの管理に関する項を参照してください。サブスクリプションIDおよび場所の説明は、付録B「トピック・サブスクリプション識別子」を参照してください。

パーティション化されたトピックとレプリケートされたトピックのどちらを選択するか

前述の「サポートされるトピック・タイプ」では、2種類のWebLogic分散トピック(パーティション化されたトピックとレプリケートされたトピック)を説明しています。一般的に、次の2つの使用事例を除き、使用できる場合はパーティション化されたトピック(PDT)の使用をお薦めします。

  • 従来のアプリケーションまたはMDB以外のアプリケーションと同時に使用するために、レプリケートされたトピック(RDT)の動作が必要な場合。

  • 特定のメッセージ・ロードの下、One-Copy-Per-Server LocalOnlyのローカルRDTの場合。メッセージ・ロードは、PDTのOne-Copy-Per-Serverモードにおいて完全に接続されたトポロジに必要なネットワーク・トラフィックの増加と比較して、RDTに組み込まれた転送オーバーヘッドの負荷のコストが低くなっているかどうかを判定します。一般的に、非永続性または「軽量の」永続性メッセージ・ロードには、PDTを使用する方が無難です。

分散トピック・タイプを構成するには、PartitionedまたはReplicatedをWebLogic JMS分散トピック構成属性のJMS転送ポリシーの値として設定します。詳細は、『Oracle WebLogic Server JMSの構成と管理』のパーティション化された分散トピックの構成に関する項を参照してください。

MDBトピック・メッセージ分散モードの選択

最新のアプリケーションには、One-Copy-Per-ApplicationおよびOne-Copy-Per-Serverモードを使用することをお薦めします。ただし、WebLogic Server 10.3.4以前のバージョンにおけるWebLogic JMSトピックまたは外部(WebLogic以外の)トピックから消費する必要があるアプリケーションは除きます。これら2つのモードは、WebLogic Server 10.3.4以降のWebLogic JMSトピックを使用する場合にのみ機能します。

サブスクリプションの管理と表示

サブスクリプションの名前と場所の説明は、付録A「トピック・デプロイメント・シナリオ」および付録B「トピック・サブスクリプション識別子」を参照してください。

『Oracle WebLogic Server JMSのプログラミング』の恒久サブスクリプションの管理に関する項も参照してください。

不均等なメッセージ負荷および/またはメッセージ処理の遅延の処理方法

不均等なメッセージ負荷または予期しないメッセージ処理の遅延が発生したアプリケーションでは、次の事項を検討する必要があります。

  • ローカル分散トピックの場合、トピック分散モードがOne-Copy-Per-ServerまたはOne-Copy-Per-Applicationのとき、distributedDestinationConnectionEveryMemberにチューニングします。LocalOnlyオプションは、不要なネットワーク・トラフィックを回避するため、極めて良好なパフォーマンスを発揮できますが、ユース・ケースによっては、LocalOnly最適化のネットワークの節約よりも、バランシングされていないキューの負荷のためにクラスタ内のすべてのJVM間でメッセージ処理をできるかぎり均等に分散するメリットのほうが勝ります。これは特に、メッセージのバックログがクラスタ全体で不均等に生じ、メッセージ処理にコストがかかる場合に問題になる可能性があります。このようなユース・ケースでは、恒久サブスクリプションを使用するEveryMemberシナリオを採用し、LocalOnly構成は避けるべきです。

  • 各プロデューサのメッセージがクラスタ全体でラウンドロビン方式に基づいて均一に処理されるように、RDTのかわりにPDTを使用して、プロデューサの接続ファクトリでプロデューサのロード・バランシングをチューニングします。受信メッセージは、WebLogic JMS接続ファクトリの「サーバー・アフィニティの有効化」および「ロード・バランシングの有効化」属性を使用して、分散トピック・メンバー間でロード・バランシングされます。アフィニティを無効化すると、ネットワーク・オーバーヘッドが増加しますが、メッセージはクラスタ全体に渡って均一にロード・バランシングされることが保証されます。アフィニティ設定はRDTに何の影響を及ぼしません。『Oracle WebLogic Server JMSの構成と管理』の分散宛先全体に渡るメッセージのロード・バランシングに関する項を参照してください。

  • WebLogic JMS非同期メッセージ・パイプラインのサイズを1まで下げ、前のメッセージ処理ですでにブロックされているMDBスレッドにこれ以上メッセージがプッシュされないようにします。この設定のデフォルトは10です。この値は、(a) 「最大メッセージ数」属性が 1にチューニングされ「XA有効化」が「true」に設定されたカスタムWebLogic接続ファクトリを構成する、(b) 接続ファクトリを分散トピックをホストする同一のクラスタにターゲット指定する、および(c) カスタム接続ファクトリを参照するようにMDBを変更することで構成できます。

サービス移行用の構成

恒久サブスクリプションの場合、JMSサービス移行(自動または手動)は、LocalOnlyがローカルでレプリケートされたトピックで適用されるとサポートされません。通常、LocalOnlyとは、分散トピック・メンバーが別のサーバーに移行されると、MDBデプロイメント・インスタンスがローカル分散トピック・メンバーに固定されることを示します。MDBデプロイメント・インスタンスは、再起動後に同一の元の分散メンバーをサブスクライブできません。実行した場合は、警告メッセージが表示される可能性があります。つまり、JMSサービス移行を使用するには、EveryMemberとして構成する必要があります。サーバー全体の移行は両クラスでサポートされています。

以前のリリースからのアプリケーションのアップグレード

この章全体を通して説明しているように、緩和されたクライアントID、共有可能なサブスクリプション、およびパーティション化された恒久トピックなどのWebLogic Server 10.3.4の新しいJMS機能を使用すると、拡張性と高可用性の拡張を提供するMDBを実装してデプロイできるようになります。これらの機能を活用するには、WebLogic Server 10.3.4以前のリリース用に記述されたMDBアプリケーションをアップグレードする必要があります。

WebLogic Server 10.3.4以前のリリースで実行するために記述されたアプリケーションは、互換性モードを使用すると変更せずに実行を継続できます。これは、「topicMessagesDistributionModeの設定」で説明したように、topicMessagesDistributionModeのデフォルト設定です。

以前のリリースからアプリケーションをアップグレードするには、次の手順を実行します。

  1. パーティション化された分散トピックへの変更を検討します。前述の「パーティション化されたトピックとレプリケートされたトピックのどちらを選択するか」を参照してください。

  2. topicMessagesDistributionModeOne-Copy-Per-ServerまたはOne-Copy-Per-Applicationに設定し、distributedDestinationConnectionオプションをチューニングします。前述の「メッセージ分散チューニングの設定」を参照してください。


警告:

互換性モードから変更すると、現在のメッセージは保存されません。「恒久的なMDB属性、トピック・タイプ、EJB名の変更についての警告」を参照してください。

トピックMDBのサンプル

例10-1はWebLogic MDBを示します。これは、(WebLogic Server 10.3.4以降の) JMSトピックへの恒久サブスクリプションを使用し、メッセージ・トランザクションを処理してターゲットの宛先にメッセージを転送します。

JMS接続ファクトリMyCFを使用してMDBは接続し、トピックMyTopicから受信します。そして、接続ファクトリMyTargetCFから生成された接続を使用して、メッセージをMyTargetDestに転送します。

リソース参照プーリング・ノート: MDBは、リソース参照を使用してMyTargetCFにアクセスします。リソース参照は、『Oracle WebLogic Server JMSのプログラミング』のWebLogic JMSをEJBおよびサーブレットと併用するための拡張サポートに関する項で説明されているように、自動的にJMSプロデューサ・プーリングを有効化します。

トピックではなくキューを使用する同様のサンプルは、例7-3「分散キューを使用するMDBのサンプル」を参照してください。

例10-1 分散トピックを使用するMDBのサンプル

package test;
import javax.annotation.Resources;
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.jms.*;
 
@MessageDriven(
  name = "MyMDB",
  activationConfig = {
    @ActivationConfigProperty(propertyName  = "destinationType", 
                              propertyValue = "javax.jms.Topic"),
 
    @ActivationConfigProperty(propertyName  = "subscriptionDurability",
                              propertyValue = "Durable"),
 
    @ActivationConfigProperty(propertyName  = "connectionFactoryJndiName",
                              propertyValue = "MyCF"), // External JNDI Name
 
    @ActivationConfigProperty(propertyName  = "destinationJndiName",
                              propertyValue = "MyTopic"), // Ext. JNDI Name
 
    @ActivationConfigProperty(propertyName  = "topicMessagesDistributionMode",
                              propertyValue = "One-Copy-Per-Application") 
  }
)
 
@Resources ({
  @Resource(name="targetCFRef",        
            mappedName="MyTargetCF",   // External JNDI name 
            type=javax.jms.ConnectionFactory.class),
 
  @Resource(name="targetDestRef", 
            mappedName="MyTargetDest", // External JNDI name
            type=javax.jms.Destination.class)
})

public class MyMDB implements MessageListener {

  // inject a reference to the MDB context

  @Resource
  private MessageDrivenContext mdctx;  

  // cache targetCF and targetDest for re-use (performance) 

  private ConnectionFactory targetCF;
  private Destination targetDest;

  @TransactionAttribute(value = TransactionAttributeType.REQUIRED)
  public void onMessage(Message message) {

    System.out.println("My MDB got message: " + message);

    // Forward the message to "MyTargetDest" using "MyTargetCF"

    Connection jmsConnection = null;

    try {
      if (targetCF == null) 
        targetCF = (javax.jms.ConnectionFactory)mdctx.lookup("targetCFRef");

      if (targetDest == null)
        targetDest = (javax.jms.Destination)mdctx.lookup("targetDestRef");

      jmsConnection = targetCF.createConnection();
      Session s = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
      MessageProducer mp = s.createProducer(null);

      mp.send(targetDest, message);

    } catch (JMSException e) {

      System.out.println("Forcing rollback due to exception " + e);
      e.printStackTrace();
      mdctx.setRollbackOnly();

    } finally {

      // Closing a connection automatically returns the connection and
      // its session plus producer to the resource reference pool.

      try { if (jmsConnection != null) jmsConnection.close(); }
      catch (JMSException ignored) {};
    }
 
    // emulate 1 second of "think" time
 
    try { Thread.currentThread().sleep(1000); }
    catch (InterruptedException ie) {
      Thread.currentThread().interrupt(); // Restore the interrupted status
    }
  }
 
}