ナビゲーションをスキップ

WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

メッセージ駆動型 EJB

以下の節では、メッセージ駆動型 Bean (MDB) のライフサイクル、設計上の考慮事項、および主要な実装タスクの手順について説明します。EJB 開発の全体的なプロセスについては、「エンタープライズ JavaBean の実装」を参照してください。

MDB の概要およびアプリケーションでの典型的な使われ方については、「メッセージ駆動型 Bean による疎結合ビジネス ロジックの実装」および「メッセージ駆動型 Bean の機能」を参照してください。WebLogic JMS については、『WebLogic JMS プログラマーズ ガイド』を参照してください。

 


メッセージ駆動型 Bean のライフサイクルとフリー プール

この章では、メッセージ駆動型 Bean インスタンスのライフサイクルのフェーズと MDB をコンフィグレーションしてライフサイクルを制御する方法について説明します。図 7-1 は、MDB のライフサイクルにおける主要なイベントと状態を示しています。

図 7-1 MDB のライフサイクル

MDB のライフサイクル


 

MDB とフリー プール

WebLogic Server は、現在リクエストを処理していない MDB インスタンスが配置されるフリー プールを保持します。最高の応答時間とスループットを実現するために、weblogic-ejb-jar.xml の Bean の initial-beans-in-free-pool 要素で目的の量を指定することで起動時にプールにインスタンスを配置するよう WebLogic Server をコンフィグレーションできます。デフォルトでは、initial-beans-in-free-pool は 0 です。

フリー プールの MDB インスタンスの数は、weblogic-ejb-jar.xmlmax-beans-in-free-pool 要素の値 (デフォルトでは 1,000)、MDB の実行キューのスレッド数、および利用可能なメモリの量によって制限されます。スレッド プールのサイズが持つフリー プールの MDB インスタンスの最大数に対する影響は、MDB がデフォルトの実行キューを使用するのか、それとも別の実行キューを使用するようにコンフィグレーションされているのかによって異なります。詳細については、「dispatch-policy」を参照してください。

MDB は、JMS 送り先からのメッセージを処理します。メッセージを受信すると、EJB コンテナは MDB の onMessage() メソッドを呼び出します。このメソッドには、EJB が実行するビジネス ロジックが含まれています。MDB の onMessage メソッドが呼び出されたときには、以下のアクションがとられます。

MDB インスタンスの onMessage() メソッドが復帰した後、リクエストは完了し、インスタンスは再利用できるようにフリー プールに配置されます (そうしても max-beans-in-free-pool の数を超えないと想定する)。

MDB と並行処理

MDB は、トピックとキューの両方で並行処理をサポートしています。トピックとキューの詳細については、「MDB とメッセージング モデル」を参照してください。

weblogic-ejb-jar.xmlmax-beans-in-free-pool 要素のデフォルト設定 (1,000) では、最高の並行処理が実現します。並行して実行されるコンシューマの数を制限する場合を除き、この値を変更しないでください。

サーバ インスタンスにデプロイされた各 MDB は、1 つの JMS 接続を作成します。

キューベースの JMS アプリケーション (ポイントツーポイント モデル) では、各 MDB インスタンスにそれ専用のセッションがあります。

トピックベースの JMS アプリケーション (パブリッシュ/サブスクライブ モデル) では、MDB のすべてのローカル インスタンスが JMS セッションを共有します。ある特定のメッセージは、複数の MDB に配信されます (サブスクライブしている各 MDB に 1 コピーずつ)。複数の MDB がデプロイされ、同じトピックをリスンする場合、各 MDB は各メッセージのコピーを受信します。メッセージは、トピックをリスンしている各 MDB の 1 つのインスタンスによって処理されます。

 


MDB とメッセージング モデル

WebLogic Server MDB は、ポイントツーポイント (キュー) またはパブリッシュ/サブスクライブ (トピック) メッセージング モデルのいずれかで使用できます。それらのモデルの詳細については、『WebLogic JMS プログラマーズ ガイド』の「WebLogic JMS の基礎」を参照してください。

以降の節では、ポイントツーポイント メッセージング アプリケーションとパブリッシュ/サブスクライブ メッセージング アプリケーションの主な違いを説明します。

ポイントツーポイント (キュー) モデル : リスナごとに 1 つのメッセージ

ポイントツーポイント モデルでは、JMS キューからのメッセージが 1 つの MDB リスナによって取り出され、処理されるまでキューに留まります。その MDB がダウンした場合、メッセージは MDB が再びアクティブになるのをキューの中で待ちます。

: ある売り場では、1 日を通して売れた品目を反映してバックエンドの在庫システムを更新する必要があります。在庫の値を減らす各メッセージは、必ず 1 度だけ処理されなければなりません。メッセージはそれが生成された直後に処理されたり、特定の順序で処理されたりする必要はないが、各メッセージが必ず処理されることが重要です。

図 7-2 は、ポイントツーポイント アプリケーションを示しています。各メッセージは、MDB_A の 1 つのインスタンスによって処理されます。メッセージ「M1」は MDB_A(1) で処理され、「M2」は MDB_A(2) で処理され、「M3」は MDB_A(3) で処理されます。

図 7-2 ポイントツーポイント モデル

ポイントツーポイント モデル


 

パブリッシュ/サブスクライブ (トピック) モデル

パブリッシュ/サブスクライブ モデルでは、JMS トピックがすべてのメッセージをすべてのサブスクライブ リスナにパブリッシュします。MDB リスナがダウンした場合、トピックが「恒久サブスクリプション」トピックでない限りその MDB はメッセージを逃します。

恒久サブスクリプションの詳細とコンフィグレーション手順については、『WebLogic JMS プログラマーズ ガイド』の「恒久サブスクリプションの設定」および「恒久トピック サブスクリプションのコンフィグレーション」を参照してください。

: 金融ニュース サービスは、株価と金融情報をサブスクライバ (ニュース配信サービスなど) にブロードキャストします。各メッセージは、各サブスクライバに配信されます。

図 7-3 は、パブリッシュ/サブスクライブ アプリケーションを示しています。ポイントツーポイント アプリケーションとは違って、パブリッシュ/サブスクライブ モデルでは、サブスクライブしている MDB それぞれの 1 つのインスタンスによって処理されます。メッセージ「M1」は、MDB_A のインスタンスと MDB_B のインスタンスで処理されます。同様に、「M2」もサブスクライブ MDB それぞれのインスタンスで処理されます。

図 7-3 パブリッシュ/サブスクライブ モデル

パブリッシュ/サブスクライブ モデル


 


 

正確に 1 度だけの処理

MDB プールは、各メッセージを少なくとも 1 度処理します。メッセージは、複数回処理される場合もあります。

メッセージが正確に 1 度処理されるようにするには、コンテナ管理によるトランザクションを使用します。そうすれば、障害が発生したときにトランザクション MDB の処理がロールバックされ、メッセージが強制的に再配信されます。

 


MDB のデプロイメント オプション

この節では、MDB をデプロイするためのさまざまな手法と MDB がリスンする JMS 送り先について説明します。

送り先と MDB : 連結と非連結

MDB は、リスン対象の JMS 送り先と同じサーバ インスタンスか、別のサーバ インスタンスにデプロイできます。それらの選択肢はそれぞれ、連結または非連結と呼ばれます。

連結された送り先と MDB

MDB とそのリスン対象の送り先を連結すると、メッセージ トラフィックが常にローカルになり、ネットワークの往復がなくなります。連結は、WebLogic Server JMS を使用し、メッセージ処理の待ち時間とネットワーク トラフィックを最小限に抑えたい場合に最適です。

MQ Series などの WebLogic Server で動作できないサードパーティ JMS プロバイダを使用する場合は、MDB と JMS 送り先を連結できません。

図 7-4図 7-5 は、関連付けられた JMS 送り先をホストするサーバ インスタンスに MDB アプリケーションがデプロイされるアーキテクチャを示しています。これらのアーキテクチャは、最初のには分散送り先があり 2 番目のにはないという点で異なります。分散送り先を使用するアプリケーションでは、MDB は分散送り先セットのメンバーをホストする各サーバ インスタンスにデプロイされます。分散送り先の詳細については、「JMS 分散送り先」を参照してください。図 7-4 で示されているように、メッセージ「M1」は分散送り先と MDB_A がデプロイされている各サーバ インスタンス上の MDB_A のインスタンスに配信されます。

図 7-4 連結された送り先と MDB、分散送り先

連結された送り先と MDB、分散送り先


 

図 7-5 連結された送り先と MDB、非分散送り先

連結された送り先と MDB、非分散送り先


 

連結されていない送り先と MDB

図 7-6 は、リスン対象の JMS 送り先とは別のサーバ インスタンスで MDB が動作するアーキテクチャを示しています。

図 7-6 連結されていないアプリケーション、非分散送り先

連結されていないアプリケーション、非分散送り先


 

リスン対象の JMS 送り先とは別のサーバ インスタンスで MDB を実行するのが適切なのは、以下の場合です。

JMS 送り先と MDB は、クラスタ化されていないサーバ、同じクラスタ内の複数のサーバ、または別々のクラスタのサーバにもデプロイできます。

JMS 分散送り先

MDB アプリケーションが WebLogic Server クラスタで動作している場合は、複数の物理的送り先 (キューまたはトピック) を、メッセージ プロデューサやコンシューマからは 1 つの送り先に見える分散送り先としてコンフィグレーションできます。

分散送り先をコンフィグレーションすると、WebLogic JMS はその分散送り先のメンバー間でメッセージングの負荷を分散します。サーバの障害が原因で送り先のメンバーがアクセス不能になると、メッセージ トラフィックは分散送り先セットのアクセス可能な他の物理的送り先にリダイレクトされます。

MDB とその関連する分散送り先を同じクラスタにデプロイすると、WebLogic Server は自動的に分散送り先メンバーを確認し、各メンバーで必ず MDB がリスンしているようにします。

MDB は、クラスタ化されている各サーバ インスタンスに均一にデプロイされます。メッセージは、複数のサーバ インスタンス上の物理的送り先間で分散され、並行して処理されます。1 つのサーバ インスタンスがダウンした場合は、クラスタの他のノードがメッセージの処理を続行できます。このアーキテクチャは、以下の場合に適切な選択肢です。

例については、図 7-4 を参照してください。分散送り先の追加情報については、『WebLogic JMS プログラマーズ ガイド』の「分散送り先の使用」を参照してください。

 


MDB のプログラミングとコンフィグレーション : 主な手順

この節では、MDB を実装する手順を説明します。

注意 : MDB の主要なデプロイメント要素の概要については、「要約 : MDB のデプロイメント要素」を参照してください。

必須の JMS コンフィグレーション

以下の節の手順は、以下の JMS コンポーネントが適切に作成されているものと想定しています。

注意 : JMS プロバイダがリモートの WebLogic Server JMS プロバイダか外部 JMS プロバイダであり、「ラッパーを使用するかどうか」で推奨されているラッパー手法を使用する場合は、ローカルではない JMS コンポーネントをコンフィグレーションするだけでなく、ローカルの JNDI ツリーで外部接続ファクトリと外部 JMS 送り先もコンフィグレーションする必要があります。

MDB クラスの作成とデプロイメント要素のコンフィグレーション

メッセージ駆動型 Bean を実装するには、次の手順を行います。

  1. javax.ejb.MessageDrivenBean インタフェースと javax.jms.MessageListener インタフェースの両方を実装するソース ファイル (メッセージ駆動型 Bean クラス) を作成します。
  2. MDB クラスでは、以下のメソッドを定義する必要があります。

  3. 次の例のように、ejb-jar.xml で MDB を宣言します。
  4. <ejb-jar>
       <enterprise-beans>
          <message-driven>
             <ejb-name>,,,</ejb-name>
             <ejb-class>...</ejb-class>
             <transaction-type>Container</transaction-type>
          <acknowledge-mode>auto_acknowledge</acknowledge-mode>
             <message-driven-destination>
                <destination-type>javax.jms.Topic</destination-type>
                <subscription-durability>Durable</subscription-durability>
             </message-driven-destination>
          </message-driven>
       </enterprise-beans>
    <assembly-descriptor>
       <container-transaction>
          <method>
             <ejb-name>...</ejb-name>
             <method-name>onMessage()</method-name>
          </method>
          <trans-attribute>Required</trans-attribute>
       </container-transaction>
    </assembly-descriptor>
    </ejb-jar>

    コンフィグレーションする主要な動作は以下のとおりです。

  5. weblogic-ejb-jar.xmlmessage-driven-descriptor 要素で MDB の WebLogic 固有の動作をコンフィグレーションします。
  6. <weblogic-ejb-jar>
       <weblogic-enterprise-bean>
          <ejb-name>exampleMessageDrivenA</ejb-name>
          <message-driven-descriptor>
             <pool>
               <max-beans-in-free-pool>...</max-beans-in-free-pool>
               <initial-beans-in-free-pool>...</initial-beans-in-free-pool>
             </pool>
             <destination-jndi-name>...</destination-jndi-name>
             <initial-context-factory>...</initial-context-factory>
             <provider-url> </provider-url>
             <connection-factory-jndi-name>..<connection-factory-jndi-name>
             <jms-client-id>....   </jms-client-id>
          </message-driven-descriptor>
          <jndi-name>someid</jndi-name>
          <dispatch-policy>custom_execute_queue</dispatch-policy>
       </weblogic-enterprise-bean>
    </weblogic-ejb-jar>

    コンフィグレーションする主要な要素は以下のとおりです。

  7. weblogic-application.xmlstart-mdbs-with-applicationfalse に設定します。このように設定することで、MDB は WebLogic Server が完全に起動するまでメッセージの処理を始めません。詳細については、「起動が完了するまでメッセージの処理を遅らせる」を参照してください。
  8. Java ソースをコンパイルする」の指示に従って MDB クラスをコンパイルおよび生成します。
  9. 『WebLogic Server アプリケーションのデプロイメント』の「デプロイメントのクイックスタート ガイド」の手順に従って、Bean を WebLogic Server にデプロイします。
  10. デプロイメント時に WebLogic Server で MDB の JMS 送り先を見つけることができない場合、デプロイメントは成功しますが、送り先が見つからなかったことを示すメッセージが WebLogic Server から出力されます。その場合、MDB は、JMS キューへの接続が成功するまで、定期的に接続を試行します。詳細については、「クラスタ化された MDB の移行と回復」を参照してください。

 


MDB のプログラミングとコンフィグレーション : 詳細情報

この節では、「MDB のプログラミングとコンフィグレーション : 主な手順」の手順を補足します。

注意 : MDB の主要なデプロイメント要素の概要については、「要約 : MDB のデプロイメント要素」を参照してください。

送り先タイプのコンフィグレーション

MDB がリスンする送り先のタイプは、ejb-jar.xmlmessage-driven-destination 要素の destination-type 要素でコンフィグレーションします。

トピックを指定するには、destination-typejavax.jms.Topic に設定します。

キューを指定するには、destination-typejavax.jms.Queue に設定します。送り先がトピックの場合は、subscription-durabilityDurable または NonDurable のいずれかで指定します。詳細については、「恒久トピック サブスクリプションのコンフィグレーション」を参照してください。

MDB のトランザクション管理方式のコンフィグレーション

MDB は独自にトランザクションを管理するか、トランザクション管理をコンテナに委ねることができます。

コンテナレベルのトランザクション管理をコンフィグレーションするには、次の手順を行います。

Bean レベルのトランザクション管理をコンフィグレーションするには、次の手順を行います。

送り先を考慮した MDB のコンフィグレーション

WebLogic Server MDB は、Weblogic JMS 送り先と外部 (非 BEA) JMS プロバイダの送り先をサポートしています。

ローカル送り先とは、MDB と同じマシンまたは同じクラスタで動作する送り先のことです。リモート送り先とは、別のマシンで動作しており、MDB と同じクラスタのメンバーではない送り先のことです。送り先がローカルであるかリモートであるかは、その送り先と MDB が同じ JNDI コンテキストを共有しているかどうかに依存します。

お互いがお互いをローカルと見なすようにするには、MDB とその関連する JMS 送り先が両方とも同じマシン上、または同じ WebLogic Server クラスタ内で動作する必要があります。同じ WebLogic Server クラスタ内のサーバ インスタンス上の MDB と JMS 送り先は、それらが別々のマシン上にあってもお互いにローカルな存在です。WebLogic Server クラスタ内のサーバ インスタンスはそれぞれ同じクラスタワイドの JNDI ツリーのコピーを所有しているからです。

非 BEA の JMS プロバイダで動作する送り先は、「外部」と表現されます。外部 JMS プロバイダにはそれ専用の JNDI プロバイダがあり、外部 JMS オブジェクトは WebLogic Server MDB と同じコンテキストを共有しません (外部 JMS オブジェクトがラッパーを使用して MDB の JNDI コンテキストに含まれるようにコンフィグレーションされていない限り)。その手法については、「ラッパーを使用するかどうか」を参照してください。

送り先の性質 (ローカルかリモートか、WebLogic JMS か非 BEA か) は利用可能なコンフィグレーション オプションを決め、weblogic-ejb-jar.xml の MDB の message-driven-descriptor の以下の主要な要素のコンフィグレーション方法をある程度まで決定します。

外部でリモートの送り先の場合、もっともシンプルなコンフィグレーション方式は WebLogic Server JMS ラッパーを使用することです。ラッパーを使用すると、サードパーティ JNDI プロバイダあるいは別の WebLogic Server クラスタまたはドメインの JMS オブジェクトとローカル WebLogic JNDI ツリーのオブジェクトの間に「シンボリック リンク」を作成できます。

ラッパーをいつ使うのか、および weblogic-ejb-jar.xmlmessage-driven-descriptor をコンフィグレーションするルールの詳細については、以下の節を参照してください。

特定のシナリオで message-driven-descriptor の要素をコンフィグレーションするには、「一般的な送り先のシナリオ : イラストと主な要素の設定」を参照してください。

ラッパーを使用するかどうか

ラッパーを使用するということは、リモート JMS オブジェクト (非 BEA または WebLogic JMS) に対応する外部接続ファクトリおよび外部送り先をローカル JNDI ツリーのエントリとしてコンフィグレーションするということです。

ラッパー クラスを使用するかどうかで、以下に説明するように initial-context-factorydestination-jndi-name のコンフィグレーション方法が決まります。

provider-url の設定方法

provider-url は、MDB がリスンする送り先の JMS プロバイダで使用される JNDI サービスの URL を指定します。

initial-context-factory の設定方法

initial-context-factory は、JMS プロバイダで使用される初期コンテキスト ファクトリを実装するクラスを指定します。

destination-jndi-name の設定方法

destination-jndi-name は、MDB がリスンする送り先の JNDI 名を指定します。

connection-factory-jndi-name の設定方法

connection-factory-jndi-name は、JMS プロバイダで使用される接続ファクトリの JNDI 名を指定します。

一般的な送り先のシナリオ : イラストと主な要素の設定

この節の図は、一般的な送り先のコンフィグレーションを示しています。リモートおよび外部の送り先については、ラッパー「あり」と「なし」のシナリオが用意されています。

表 7-1 は、各シナリオの weblogic-ejb-jar.xmlmessage-driven-descriptor スタンザ内の要素のコンフィグレーション方法を示しています。

図 7-7 A. ローカル WebLogic JMS サーバの送り先

A. ローカル WebLogic JMS サーバの送り先


 

図 7-8 B. リモート WebLogic JMS サーバの送り先 (ラッパーなし)

B. リモート WebLogic JMS サーバの送り先 (ラッパーなし)


 

図 7-9 C. 外部 JMS サーバの送り先 (ラッパーなし)

C. 外部 JMS サーバの送り先 (ラッパーなし)


 

図 7-10 D. リモート WebLogic Server または外部 JMS サーバの送り先 (ラッパーあり)

D. リモート WebLogic Server または外部 JMS サーバの送り先 (ラッパーあり)


 

表 7-1 一般的なコンフィグレーション シナリオ

送り先の場所

ラッパーのコンフィグレーション

destination-jndi-name

initial-
context-
factory

provider-
url

connection-
factory-jndi-
name

A

ローカル WebLogic JMS サーバ

ローカル WebLogic JMS サーバには関係がない。

ローカルの JNDI ツリーでバインドされている、ローカル送り先の名前。

指定しない。

指定しない。

カスタム接続ファクトリを使用する場合のみ指定する。

B

リモート WebLogic JMS サーバ

ラッパーはコンフィグレーションしない。

リモートの JNDI ツリーでバインドされている、リモート送り先の名前。

指定しない。

リモート WebLogic JMS サーバの URL またはクラスタ アドレス。

リモート プロバイダでカスタム接続ファクトリを使用する場合のみ指定する。

C

外部 JMS プロバイダ

ラッパーはコンフィグレーションしない。

リモートの JNDI ツリーでバインドされている、リモート送り先の名前。

リモートの JNDI ツリーでバインドされている、リモート初期コンテキスト ファクトリの名前。

外部 JMS プロバイダにアクセスするための URL。

外部接続ファクトリの JNDI 名。

D

リモート Weblogic JMS サーバ

または

外部 JMS サーバ

ラッパーをコンフィグレーションする。

リモートまたは外部送り先に対応する、ローカル JNDI ツリーでバインドされている外部送り先の名前。

指定しない。

指定しない。

リモートまたは外部接続ファクトリに対応する、ローカル JNDI ツリーでバインドされている外部接続ファクトリの名前。

恒久トピック サブスクリプションのコンフィグレーション

恒久サブスクリプションを使用すると、MDB はその MDB が接続されていないときにトピックに配信されたメッセージを受信できます。

クラスタ化されていないサーバで恒久トピック サブスクリプションをコンフィグレーションする

クラスタ化されていないサーバ インスタンスにデプロイされた MDB で恒久トピック サブスクリプションをコンフィグレーションするには、次の手順を行います。

  1. ejb-jar.xmldestination-typejavax.jms.Topic にコンフィグレーションします。
  2. ejb-jar.xmlmessage-driven-destination スタンザで、以下のように設定します。
  3. 必要に応じて、MDB の ClientId をコンフィグレーションします。
  4. Administration Console オンライン ヘルプの「JMS 接続ファクトリのコンフィグレーション」の説明にしたがって、アプリケーションの特定の要件に合わせて独自の接続ファクトリをコンフィグレーションする場合は、接続ファクトリをコンフィグレーションするときに MDB の ClientID を定義できます。

    接続ファクトリを設定してもそれに ClientID を割り当てないか、デフォルトの接続ファクトリを使用する場合 (Administration Console オンライン ヘルプの「デフォルト接続ファクトリの使い方」を参照)、MDB は weblogic-ejb-jar.xmljms-client-id の値をクライアント ID として使用します。jms-client-id が指定されていない場合、デフォルト値は MDB の ejb-name です。

クラスタで恒久トピック サブスクリプションをコンフィグレーションする

クラスタでは、JMS 恒久サブスクリプションは MDB の以下の ID の組み合わせでユニークに識別されます。

恒久サブスクライバ MDB をクラスタ内の複数のサーバ インスタンスで実行できるようにするには (各 MDB インスタンスが各トピック メッセージのコピーを受信する)、各 MDB インスタンスをユニークな jms-client-ID でデプロイする必要があります (jms-client-ID が指定されていない場合は ejb-name)。

恒久サブスクライバは WebLogic Server の分散送り先トピックを直接サブスクライブできませんが、代わりに送り先トピックの物理メンバーの JNDI 名をサブスクライブする必要があります。そのようにするには、以下の 2 通りの方法があります。

メッセージ処理動作のコンフィグレーション

以下のトピックでは、メッセージの配信に関連する動作のガイドラインを示します。

メッセージ受信順序の保証

MDB のビジネス ロジックが非同期のメッセージ処理に対応できるようにしておきます。MDB は必ずしも、クライアントが発行した順序でメッセージを受信するわけではありません。受信順序がクライアントのメッセージ送信順序と一致するようにするには、以下を行います。

トランザクションのロールバックと回復の時にメッセージの順序付けを守るには、カスタム接続ファクトリを値 1 の MessagesMaximum でコンフィグレーションし、再配信遅延がコンフィグレーションされないようにします。詳細については、『WebLogic JMS プログラマーズ ガイド』の「メッセージの再配信の順序付け」を参照してください。

詳細については、Interface MessageListener (javax.jms.MessageListener.onMessage()) に関する Sun のドキュメントを参照してください (http://java.sun.com/j2ee/sdk_1.2.1/techdocs/api/javax/jms/MessageListener.html/)。

重複メッセージの防止と処理

JMS プロバイダは、MDB が受信メッセージの確認応答をするのを待ち受けます。MDB がメッセージを受信したが、確認応答の送信に失敗した場合、JMS プロバイダは同じメッセージを再送信します。

MDB の設計は、重複メッセージの可能性を考慮に入れているはずです。重複メッセージは、特定の状況では有害になります。たとえば、MDB の onMessage() メソッドに銀行口座の借方に記入するコードが含まれている場合、そのメッセージを 2 回受信して処理すると借方への記入が 2 回行われることになります。また、メッセージが再送信されると、処理リソースがより多く消費されることになります。

重複メッセージの配信を防止する最適な方法は、コンテナ管理によるトランザクションを使用することです。コンテナ管理によるトランザクションでは、トランザクションの中でメッセージの受信と確認応答が行われます (つまり両方行われるか、両方とも行われない)。ただし、これは Bean 管理のトランザクションを使用するよりも信頼性が高くなりますが、パフォーマンスは犠牲になります。コンテナ管理によるトランザクションでは、より多くの CPU リソースとディスク リソースが使用されるからです。

MDB がそれ自身のトランザクションを管理する場合は、受信と確認応答がトランザクションの外で行われるので、onMessage() のコードで重複メッセージを処理する必要があります。一部のアプリケーションは、重複メッセージの受信と処理に対応しています。上の銀行口座のシナリオのような他のケースでは、トランザクションが Bean 管理の場合は、Bean のコードで重複メッセージの処理を防止する必要があります。たとえば、MDB ではデータベースですでに消費されているメッセージを追跡できます。

MDB の onMessage() メソッドが正常に完了する場合でも、OnMessage() の完了とコンテナによるメッセージ配信の確認応答の間にサーバがクラッシュすると、MDB は重複メッセージを受信することになります。図 7-11 は、そのシナリオを示しています。

図 7-11 onMessage() の完了とコンテナによる配信の確認応答の間のサーバ クラッシュ

onMessage() の完了とコンテナによる配信の確認応答の間のサーバ クラッシュ


 

再配信と例外処理

MDB がメッセージを消費している最中に予期しないエラーが発生した場合、MDB はシステム例外を送出できます。その例外により、JMS のコンフィグレーションに応じて JMS は再送信、遅延後に再送信、または放棄を行います。

トランザクション MDB でメッセージの再配信を強制するには、Bean のコンテキストを使用して setRollbackOnly() を使用します。

トランザクション対応かどうかに関係なく、MDB でメッセージの再配信を強制するには、MDB によって送出される RuntimeException または Error から派生した例外を送出できます。このようにすると、MDB インスタンスは破棄および再作成され、パフォーマンスの低下につながります。

再配信遅延は、MDB の onMessage() メソッドが実行するタスクの種類に基づいてコンフィグレーションします。場合によっては、たとえばニュース サービスに速報を流すアプリケーションなどで、再配信は即時に行うことが必要にあります。その他の場合、たとえばデータベースのダウンが原因で MDB が例外を送出する場合、再配信はデータベースが復帰した後でない限りすぐでなくてもかまいません。

注意 : 正確に順序付けされている MDB の場合は、再配信遅延を設定しないでください。

再配信遅延と、MDB で使用できる他の JMS 例外処理機能のコンフィグレーション手順については、『WebLogic JMS プログラマーズ ガイド』の「ロールバック、回復、再配信、または期限切れメッセージの管理」を参照してください。

メッセージ駆動型 Bean コンテキストの使用

WebLogic Server は、setMessageDrivenContext() を呼び出して MDB インスタンスとコンテナ コンテキストを関連付けます。これはクライアント コンテキストではありません。クライアント コンテキストは、JMS メッセージと一緒には渡されません。

MDB インスタンス内からコンテナ コンテキストのプロパティにアクセスするには、MessageDrivenContext インタフェースの以下のメソッドを使用します。

注意 : getEJBHome()MessageDrivenContext インタフェースの一部として継承されますが、メッセージ駆動型 Bean にはホーム インタフェースがありません。MDB のインスタンスから getEJBHome() を呼び出すと、IllegalStateException が送出されます。

起動が完了するまでメッセージの処理を遅らせる

デフォルトでは、対象の WebLogic Server インスタンスが完全に起動していなくても、MDB はそのデプロイメントと同時にメッセージの処理を開始します。このため、MDB アプリケーションは起動プロセスの途中で初期化されていないサービスやアプリケーションにアクセスし、失敗することがあります。この問題が起きないようにするには、weblogic-application.xmlstart-mdbs-with-applicationfalse に設定します。

start-mdbs-with-applicationfalse に設定すると、サーバの起動プロセスの終わり近く、サーバ インスタンスがそのリスン ポートを開いた後まで処理の開始が強制的に延期されます。

メッセージ駆動型 Bean のセキュリティ ID のコンフィギュレーション

メッセージ駆動型 Bean (MDB) が JMS キューまたはトピックからメッセージを受信すると、EJB コンテナは資格マッピング プロバイダおよび資格マップを使用して、JMS 接続の確立時に使用するセキュリティ ID (ユーザ名とパスワード) を取得します。この資格マッピングは、MDB の起動時に一度だけ行われます。

EJB コンテナが一度接続されると、JMS プロバイダは確立されたセキュリティ ID を使用してすべてのメッセージを受信します。

MDB のセキュリティ ID をコンフィグレーションするには、次の手順を行います。

  1. MDB の WebLogic ユーザを作成します。『WebLogic リソースのセキュリティ』の「ユーザとグループ」を参照してください。JMS 接続を確立するために BEA 以外の JMS プロバイダが要求するユーザ名とパスワードをユーザに割り当てます。
  2. ejb-jar.xml デプロイメント記述子で、次のように MDB の run-as ID を定義します。
  3. <security-identity>
         <run-as>
              <role-name>admin</role-name>
         </run-as>
    </security-identity>

  4. weblogic-ejb-jar.xml デプロイメント記述子で、次のように、前の手順で定義されたユーザに run-as ID をマップします。
  5. <security-role-assignment>
         <role-name>admin</role-name>
         <principal-name>
    username</principal-name>
    </security-role-assignment>

    username は、手順 1 で作成したユーザのユーザ名です。

  6. JMS プロバイダが WebLogic JMS でない場合は、資格マッパーをコンフィグレーションします。
  7. 注意 : JMS プロバイダが WebLogic JMS の場合は、資格マッパーをコンフィグレーションする必要はありません。

    資格マッパーをコンフィグレーションするには、次の手順に従います。

    1. WebLogic Server Administration Console の左ペインで [デプロイメント] を展開し、デプロイできる WebLogic リソースのタイプを表示します。
    2. [アプリケーション] フォルダまたは [EJB] フォルダを展開して、資格マップを作成する MDB が含まれているアプリケーションの場所に移動し、そのアプリケーションを右クリックして、[個別の Bean のポリシーとロールを定義...] オプションを選択します。
    3. [個別の Bean のポリシーとロールを定義...] ページには、選択されたアーカイブの Bean がリストされます。

    4. 資格マップを作成する MDB の [資格マッパーを定義] リンクをクリックします。
    5. 資格マッピング ページが表示されます。

    6. [新しい資格マッピングのコンフィグレーション] リンクをクリックします。
    7. [新しい Credential Mapping の作成] ページが表示されます。

    8. 手順 1 で作成したユーザの WebLogic Server ユーザ名と、リモート プロバイダのユーザ名を入力し、[適用] をクリックします。
    9. 資格マッピング ページに、新しい資格マップが表示されます。このマップは、WebLogic Server のユーザ名とリモート プロバイダのユーザ名 (ハイパーリンクとして表示される) を関連付けます。

    10. 資格マップ テーブルの [リモート ユーザ] ハイパーリンクをクリックします。
    11. [(レルム名)|(ユーザ名)] ページに、リモート プロバイダのユーザ名と、リモート パスワードを入力および確認するためのフィールドが表示されます。

    12. [リモート パスワード] フィールドと [リモートパスワードの確認] フィールドにユーザのパスワードを入力し、[適用] をクリックして変更を保存します。

 


クラスタ化された MDB の移行と回復

WebLogic Server は、クラスタ化されている MDB アプリケーションの移行と回復をサポートしています。障害が発生した場合には、JMS 送り先と MDB をオンラインに戻すことができます。アプリケーションは、サーバ インスタンスで障害が発生したときに、クラスタ内の障害の発生したサーバから利用可能なサーバ インスタンスへ自動的に JMS 送り先とその関連 MDB を移行するように設計する必要があります。

注意 : MDB は、クラスタ化されたサーバとの間でのみ移行可能サービスを使用できます。移行可能サービスは、複数のクラスタにまたがって使用することはできません。

別のサーバに移行した後、MDB アプリケーションは移行された JMS 送り先に再接続し、JMS 送り先から再びメッセージの受信を開始します。

MDB には、移行可能な対象はありません。代わりに、MDB はデプロイメント時に自動的に JMS サーバの移行先を検出し、それを移行可能の対象として利用します。MDB は、JMS サーバがデプロイされるすべての場所にデプロイされるようにする必要があります。それは、次の 2 つの方法で行うことができます。

図 7-12 で、管理対象サーバ 1、2、および 3 は同じクラスタの中にあります。管理対象サーバ 2 と管理対象サーバ 3 は、管理対象サーバ 1 の移行可能な対象としてコンフィグレーションされています。管理対象サーバ 1 で障害が発生すると、JMS 送り先と MDB が次に利用可能な管理対象サーバに移行します。対象リストの管理対象サーバが利用できない場合、送り先と MDB は対象リストの次に利用可能な管理対象サーバに移行します。たとえば、管理対象サーバ 2 が管理対象サーバ 1 の障害時に利用できない場合、JMS 送り先と MDB アプリケーションは管理対象サーバ 3 に移行します。

図 7-12 JMS 送り先の移行

JMS 送り先の移行


 

移行可能サービスの実装手順、およびクラスタ化されたアーキテクチャの WebLogic JMS の移行サービスおよび回復サービスの背景情報については、『WebLogic JMS プログラマーズ ガイド』の「クラスタ内での移行可能なサービスとしての JMS」を参照してください。

 


要約 : MDB のデプロイメント要素

この節では、MDB の動作に影響する主なデプロイメント要素をリストします。

表 7-2 は、weblogic-ejb-jar.xmlmessage-driven-descriptor スタンザのデプロイメント要素をまとめたものです。

表 7-3 は、weblogic-application.xmlejb スタンザの MDB の主なデプロイメント要素のリストです。

表 7-4 は、ejb-jar.xmlmessage-driven スタンザでコンフィグレーションする MDB の主な J2EE デプロイメント要素のリストです。

表 7-2 weblogic-ejb-jar.xml の MDB のデプロイメント要素

要素

説明

デフォルト

connection-factory-jndi-name

キューおよびトピックを作成するためにメッセージ駆動型 Bean がルックアップする JMS ConnectionFactory の JNDI 名。「connection-factory-jndi-name の設定方法」を参照。

weblogic.jms.
MessageDriven
BeanConnection
Factory

destination-jndi-name

WebLogic Server JNDI ツリーにデプロイされている実際の JMS キューまたはトピックに MDB を関連付けるために使用する JNDI 名。「destination-jndi-name の設定方法」を参照。

なし

dispatch-policy

この任意指定の要素では、Bean の特定の実行キューを指定できる。「MDB とフリー プール」を参照。


initial-beans-in-free-pool

起動時の WebLogic Server に存在する MDB の非アクティブなインスタンスの数。詳細については、「MDB とフリー プール」を参照。

0

initial-context-factory

接続ファクトリの作成に EJB コンテナが使用する初期 contextFactory。「initial-context-factory の設定方法」を参照。

weblogic.jndi.
WLInitialContext
Factory

jms-client-id

恒久サブスクライバ トピックと関連付けられたメッセージ駆動型 Bean のクライアント ID。『WebLogic JMS プログラマーズ ガイド』の「クライアント ID の定義」を参照。

ejb-name

jms-polling-interval-seconds

アクセスできなくなっている JMS 送り先に EJB コンテナが再接続しようとする試みの秒間隔。「クラスタ化された MDB の移行と回復」を参照。

10 秒おきに再接続が試行される。

max-beans-in-free-pool

非アクティブな MDB のフリー プールの最大サイズ。「MDB とフリー プール」を参照。

1000

provider-url

InitialContext で使用される URL プロバイダ。通常はホスト ポート。「provider-url の設定方法」を参照。

t3://localhost:7001

trans-timeout-seconds

EJB のコンテナで初期化されたトランザクションの最長継続時間。この時間を過ぎると、トランザクションはロールバックされる。「MDB のトランザクション管理方式のコンフィグレーション」を参照。

30 秒

表 7-3 weblogic-application.xml の MDB の要素

要素

説明

デフォルト値

start-mdbs-with-application

MDB がいつメッセージの処理を開始するのかを制御する。デフォルト設定の true では、WebLogic Server が完全に起動していなくても、MDB はそのデプロイメントと同時にメッセージの処理を開始する。このため、MDB アプリケーションは起動の途中で初期化されていないサービスやアプリケーションにアクセスし、失敗することがある。

false に設定すると、WebLogic Server がそのリスン ポートを開くまでメッセージの処理が延期される。

true

表 7-4 MDB の主要な J2EE デプロイメント要素

要素

説明

有効な値

acknowledge-mode

Bean 管理のトランザクションの境界設定を使用するメッセージ駆動型 Bean の onMessage メソッドの JMS メッセージ確認応答セマンティクスを指定する。

  • AUTO_ACKNOWLEDGE

  • DUPS_OK_ACKNOWLEDGE

destination-type

JMS 送り先のタイプ (送り先で実装される Java インタフェース) を指定する。

  • javax.jms.Queue

  • javax.jms.Topic

subscription-durability

JMS トピック サブスクリプションが恒久かそうでないかを指定する。

  • Durable

  • NonDurable

transaction-type

エンタープライズ Bean のトランザクションの管理タイプを指定する。

注意 : transaction-type が Container に設定されている場合、trans-attribute は Required に設定する必要がある。

  • Bean

  • Container

trans-attribute

メソッドの呼び出しをエンタープライズ Bean のビジネス メソッドに委託するときにコンテナがトランザクションの境界をどのように管理するのかを指定する。

コンテナ管理によるトランザクションでは、Required に設定する。詳細については、「MDB のトランザクション管理方式のコンフィグレーション」を参照してください。

  • NotSupported

  • Oracle

  • Required

  • RequiresNew

  • Mandatory

  • Never

 

フッタのナビゲーションのスキップ  ページの先頭 前 次