Oracle® Fusion Middleware Oracle WebLogic ServerメッセージドリブンBeanのプログラミング 11g リリース1 (10.3.6) B61425-04 |
|
前 |
次 |
この章では、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トピックの詳細は、次を参照してください。
『Oracle WebLogic Server JMSのプログラミング』の拡張パブリッシュ/サブスクライブ・アプリケーションの開発に関する項。
『Oracle WebLogic Serverパフォーマンスおよびチューニング』のWebLogic JMSのチューニングに関する項
『Oracle WebLogic Serverパフォーマンスおよびチューニング』のメッセージ・ドリブンBeanのチューニングに関する項。
この章をお読みになる前にこのマニュアルの前の章を見直すことをお薦めします。
WebLogic MDBは次の種類のトピックをサポートします。
シングルトン・トピック: シングルトン・トピックは、非分散WebLogic JMSトピック、またはWebLogic JMS分散トピックの特定メンバー・トピックへの参照のいずれかです。WebLogic JMSの共通分散トピック・メンバーのJNDI名構文は、jms-server-name
@
jndi-name-of-distributed-topic
メンバーをホストするJMSサーバー名に基づきます。
外部プロバイダ・トピック: WebLogic以外のJMSトピックは、外部プロバイダ・トピックと呼ばれます。MDBは、シングルトン・トピックと同様に外部プロバイダを処理します。このようなトピックは通常、リモートとみなされます。
レプリケートされた分散トピック: WebLogic JMS分散トピックは、複数の物理トピックで構成される論理トピックで、各物理トピックは同一クラスタ内の異なるJMSサーバー・インスタンス上でホストされます。WebLogic Server 10.3.4以前のリリースでは、分散トピックのメンバーに送信される各メッセージは常に、分散トピックのすべての他のメンバー上のすべてのサブスクリプションに自動的にレプリケーション(転送)されます。この種類の分散トピックは依然としてサポートされていますが、レプリケートされた分散トピック(短縮形はRDT)と呼ばれます。
パーティション化された分散トピック: WebLogic JMS分散トピックは、複数の物理トピックで構成される論理トピックで、各物理トピックは同一クラスタ内の異なるJMSサーバー・インスタンス上でホストされます。パーティション化された分散トピック(短縮形はPDT)は、メンバー間でメッセージを転送しません。PDTメンバーにパブリッシュされるメッセージは、該当メンバー上のサブスクリプションにのみコピーされます。パーティション化された分散トピックは、WebLogic Server 10.3.4以降でサポートされています。
分散トピック・タイプを構成するには、Partitioned
またはReplicated
をJMS分散トピック構成属性のJMS転送ポリシー
の値として設定します。詳細は、『Oracle WebLogic Server JMSの構成と管理』のパーティション化された分散トピックの構成に関する項を参照してください。
最もよく使用されるトピックMDB属性は次のとおりです。
JMS宛先と接続ファクトリ
サブスクリプション永続性
コンテナ管理対象トランザクション
メッセージ分散チューニング
他の役に立つトピックMDB属性は次のとおりです。
フリー・プール・サイズ
デプロイ解除時の自動検出
メッセージ・フィルタリング(JMSセレクタ)
サブスクリプション識別子
メッセージ分散チューニング設定には、topicMessagesDistributionMode
、distributedDestinationConnection
、およびgenerate-unique-client-id
属性が含まれます。
大半の属性は、アノテーションを使用するか、または記述子のXMLスタンザを介するかのいずれかの方法で構成できます。なお、記述子のXMLスタンザおよびアノテーションの固有の属性名は、第11章「MDBのデプロイメント要素およびアノテーション」の表でまとめられています。
トピックMDBの構成は、構成のJMS接続ファクトリ、宛先、および宛先タイプの場所を適切に指定する必要があります。通常、次の操作を実行すると指定できます。
トピック・タイプの指定。ejb-jar.xml
のmessage-driven-destination
要素では、destination-type
をjavax.jms.Topic
に設定します。あるいは、アノテーションを使用する場合、ActivationConfigProperty
をpropertyName = "destinationType"
およびpropertyValue = "javax.jms.Topic"
と共に指定します。
接続ファクトリのJNDI名および宛先JNDI名の指定。接続ファクトリのJNDI名の指定は通常、接続ファクトリが同一のクラスタまたはサーバー上でMDBとしてホストされている場合には必要ではありません。通常はデフォルトで十分です。
宛先がMDBプールとして同一クラスタまたはサーバーで存在していない場合、管理上、リモート宛先および接続ファクトリのJNDIエントリからのマッピングを、前述の#2で指定されたエントリに一致するローカルJNDIエントリに構成します。リモート・リソースを参照する方法には別の選択肢がありますが、オラクル社がお薦めするベスト・プラクティスはマッピングする方法です。
各フリー・プールでは、MDBコンテナが指定した接続ファクトリを使用して接続を作成し、接続を使用してその宛先上の1つ以上のサブスクリプションを検索または作成して、最後に接続を使用してサブスクリプションからメッセージを受信するJMSコンシューマを作成します。
接続ファクトリと宛先MDB属性の固有名、およびお薦めのJNDIマッピング構成については、「宛先用のMDBの構成」を参照してください。
MDBは、JMSトピック上でサブスクリプションを自動作成します。JMSトピックは、恒久および非恒久の2種類のサブスクリプションをサポートします。
非恒久サブスクリプションは、サブスクライバの存続期間中のみ存在します。サブスクリプションにこれ以上サブスクライバが含まれないとき、そのサブスクリプションは自動的に削除されます。非恒久サブスクリプションに保存されるメッセージは、JMSサーバーが停止またはクラッシュすると絶対に復元されません。
恒久サブスクリプションを使用すると、サブスクライバ・アプリケーションが使用できない期間にパブリッシュされるメッセージをサブスクライバが受信できるようになります。トピック上の各恒久サブスクリプションでは、メッセージの送信時にサブスクリプション上でアクティブなサブスクライバが存在しない場合でも、JMSは送信されるまで(または期限が切れるまで)ファイルまたはデータベース内のパブリッシュされた永続メッセージのそれぞれのコピーを保存します。また、JMSは各恒久サブスクリプション内の非永続メッセージそれぞれのコピーも保存しますが、JMSサーバーが停止またはクラッシュするとそのようなメッセージは復元されません。
非恒久サブスクリプションはデフォルトです。恒久サブスクリプションを指定するには、ejb-jar.xml
のmessage-driven-destination
要素で、subscription-durability
をDurable
に設定します。あるいは、アノテーションを使用する場合、ActivationConfigProperty
をpropertyName = "subscriptionDurability"
およびpropertyValue = "Durable"
と共に指定します。
MDBのデプロイが解除されるか、またはMDBがサーバーから削除されたとき、恒久トピック・サブスクリプションを自動削除するようにMDBを構成できます。恒久トピック・サブスクリプションを自動削除するようにMDBを構成するには、durable-subscription-deletion
をTrue
に設定します。デフォルトでは、durable-subscription-deletion
はFalse
に設定されています。
JMSは、標準的なJMSメッセージ・ヘッダー・フィールドとメッセージ・プロパティに基づいてメッセージをフィルタリングするためのSQLスタイルの構文を提供します。また、WebLogic JMSはセレクタ構文への拡張機能をサポートします。これを使用すると、XMLコンテンツに基づいたXMLメッセージのフィルタリングに使用されるXMLの「xpath」式を含むセレクタを指定できます。
メッセージ・セレクタを指定するには、propertyName = "messageSelector"
を持つActivationConfigProperty
のpropertyValue
としてセレクタを指定します。
JMSセレクタの構文は、javax.jms.Message
クラスのJavadocで詳細に説明されています。WebLogicのxpathセレクタ拡張構文は、『Oracle WebLogic Server JMSのプログラミング』のメッセージのフィルタリングに関する項で説明されています。
付録A「トピック・デプロイメント・シナリオ」で説明されているように、MDBデプロイメントは1つ以上のMDBフリー・プールを作成できます。max-beans-in-free-pool
およびdispatch-policy descriptor
属性が共に機能し、次に示すようにMDBフリー・プール内でMDBスレッドの同時実行性を制御します。
同時実行性MDBの数を決定する方法の説明は、『Oracle WebLogic Serverパフォーマンスおよびチューニング』の同時実行性MDBの数の決定に関する項を参照してください。
MDBのtopicMessagesDistributionMode
がCompatibility
に設定され、MDBがコンテナ管理対象トランザクションを使用するとき、同時実行性MDBの呼出しは妨害されます。また、max-beans-in-free-pool
は、外部(WebLogic以外の)トピックによって主導されるBean管理対象トランザクションMDB用に明示的に1
に設定する必要があります。
警告: 非トランザクション外部トピック: 外部(WebLogic以外の)トピックと共に機能する非トランザクションMDBには、明示的に 順序単位: WebLogic JMSトピックから消費してWebLogic JMSの「順序単位」値を持つメッセージを処理する非トランザクション |
詳細は、『Oracle WebLogic Serverパフォーマンスおよびチューニング』のメッセージ・ドリブンBeanのチューニングに関する項を参照してください。
各JMSトピック・サブスクリプションは、MDB構成設定の数に基づいてMDBが生成する、それぞれの「サブスクリプション識別子」に基づいて作成および参照されます。生成されたサブスクリプション識別子の構文の説明は、付録B「トピック・サブスクリプション識別子」を参照してください。
この項では、メッセージ分散チューニングの設定に関する方法と時期について説明します。これには、すべてのトピック・タイプ(シングルトン、外部、および分散)に適用される情報が含まれます。この設定には、topicMessagesDistributionMode
、distributedDestinationConnection
、およびgenerate-unique-client-id
属性が含まれます。これらの属性によって、トピック・サブスクリプションが作成される場所、サブスクリプション識別子の種類、パブリッシュされたトピック・メッセージそれぞれに対してMDBが1回のみ処理するか、あるいはサーバーごとに1回のみ処理するかどうかが制御されます。
結果的に自動生成されるサブスクリプションID、サブスクリプションの場所、およびデプロイされたMDBフリー・プールの場所の詳細と図解は、付録A「トピック・デプロイメント・シナリオ」および付録B「トピック・サブスクリプション識別子」を参照してください。
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「トピック・サブスクリプション識別子」を参照してください。
ローカル分散トピックについてtopicMessagesDistributionMode
のOne-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の構成に役立てるため、次の項の情報を検討します。
topicMessagesDistributionMode
の互換性
モードを非トランザクションMDBと組み合せて使用しており、トピックが外部(WebLogic以外の)宛先であるか、またはトピックが順序単位(UOO)メッセージを使用するWebLogic宛先の場合、警告については、「MDB同時実行性の制御」を参照してください。
互換性
モードでは、ローカルでレプリケートされた分散トピック(ローカルRDT)の論理名をサブスクライブする恒久サブスクリプションMDBの場合、次の構成のみがサポートされます。
常にgenerate-unique-client-id
をtrueに設定します。
クラスタ内の各WebLogic ServerがRDTのメンバーのみをホストしていることを確認します。
WebLogic JMS service-migration
は使用しないでください。このユース・ケースには対応していません。ただし、「サーバー全体の移行」を使用できます。
各サーバーは、トピックに送信された各メッセージのコピーを受信することに注意します。メッセージがRDTの物理的なトピック・メンバーのいずれかに着信すると、メッセージのコピーが他のトピック・メンバーそれぞれに転送されることをRDTが自動的に確認します。
同様に、distributedDestinationConnection
がLocalOnly
に設定されているときにOne-Copy-Per-Application
モードでは、ローカルでレプリケートされた分散トピック(ローカルRDT)の論理名をサブスクライブする恒久サブスクリプションMDBの場合、次の構成のみがサポートされます。
使用中の構成が前述のお薦め構成と一致しない場合、メッセージの損失、メッセージの重複、メッセージのスタックなどの非確定的動作が発生する可能性があります。別の選択肢を含む詳細は、前述の「topicMessagesDistributionModeの設定」を参照してください。
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の構成と管理』のパーティション化された分散トピックの構成に関する項を参照してください。
最新のアプリケーションには、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
のとき、distributedDestinationConnection
をEveryMember
にチューニングします。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
のデフォルト設定です。
以前のリリースからアプリケーションをアップグレードするには、次の手順を実行します。
パーティション化された分散トピックへの変更を検討します。前述の「パーティション化されたトピックとレプリケートされたトピックのどちらを選択するか」を参照してください。
topicMessagesDistributionMode
をOne-Copy-Per-Server
またはOne-Copy-Per-Application
に設定し、distributedDestinationConnection
オプションをチューニングします。前述の「メッセージ分散チューニングの設定」を参照してください。
例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 } } }