3.16.3 メッセージインフロー
メッセージインフローは,リソースアダプタとMessage-driven Bean間の規約です。Connector 1.5仕様のリソースアダプタは,EISなどのメッセージプロバイダからのメッセージを受け付けて,アプリケーションサーバ上のメッセージエンドポイント(Message-driven Bean)を動作させることができます。メッセージエンドポイントでは,メッセージプロバイダから送信されたメッセージを,非同期に処理します。
アプリケーションサーバでは,メッセージの配信方法として,次の2種類の方法を使用できます。
-
Non-Transacted Delivery
-
Transacted Delivery
これらは,呼び出し元のEISがトランザクションに参加するかどうかが異なります。
- 〈この項の構成〉
(1) 前提条件
メッセージインフローは,リソースアダプタおよびMessage-driven Beanが次の条件を満たす場合に有効になります。
-
メッセージインフローで呼び出されるMessage-driven Beanは,EJB 2.1以降に準拠している必要があります。
EJB 2.1以降では,Message-driven Beanはjavax.jms.MessageListenerだけではなく,任意のメッセージリスナを実装できます。メッセージリスナは,リソースアダプタとMessage-driven Bean間のメッセージ配送に使用するリスナです。リソースアダプタがサポートしているメッセージリスナをMessage-driven Beanに実装することで,汎用的なメッセージ受信を実現できます。
EJB 2.0のMessage-driven Beanでメッセージインフローを実行しようとした場合,アプリケーション開始時にエラーになり,開始に失敗します。この場合は,KDJE42088-Eのメッセージが出力されます。
-
メッセージインフローを実行する場合,リソースアダプタおよびMessage-driven Beanの属性として,次の設定が必要です。
-
管理対象オブジェクトに設定する情報(リソースアダプタ)
-
Message-driven Beanとリソースアダプタの対応づけ(Message-driven Beanおよびリソースアダプタ)
-
ActivationSpecに設定する情報(Message-driven Bean)
-
Message-driven Beanが使用するインタフェース(Message-driven Beanおよびリソースアダプタ)
メッセージインフローの処理を実行する場合のリソースアダプタとJ2EEアプリケーションの設定については,「3.16.8 Connector 1.5仕様に準拠したリソースアダプタを使用する場合の設定」を参照してください。
-
また,Transacted Deliveryは,次の表に示す条件を満たす場合に有効になります。
J2EEサーバの設定 |
Message-driven Beanの設定 |
|||
---|---|---|---|---|
トランザクション管理種別<transaction-type>がContainer |
トランザクション管理種別<transaction-type>がBean |
|||
トランザクション属性<trans-attribute>がRequired |
トランザクション属性<trans-attribute>がNotSupported |
|||
ejbserver.distributedtx.XATransaction.enabled |
true |
○ |
× |
× |
false |
△ |
× |
× |
また,Transacted Deliveryを使用する場合は,Connector 1.5仕様に準拠し,Transacted Deliveryに対応したリソースアダプタを使用する必要があります。設定の詳細については,ご使用のリソースアダプタのドキュメントを参照してください。
(2) メッセージインフローの制御の流れ(Non-Transacted Deliveryの場合)
Non-Transacted Deliveryとは,メッセージを配信するEISがトランザクションに参加しないメッセージ配信です。
Non-Transacted Deliveryでメッセージインフローを使用する場合の制御の流れを次の図に示します。
Non-Transacted Deliveryでメッセージインフローを使用した場合に実行される制御について説明します。なお,項番は図中の数字と対応しています。
-
アプリケーションの開始処理によって,リソースアダプタのActivationSpecJavaBeanにプロパティが設定されます。
Message-driven Beanの属性の<activation-config>に指定した内容が設定されます。
-
J2EEサーバからendpointActivationメソッドが呼び出されます。これによって,リソースアダプタにメッセージエンドポイントの開始が通知されます。
-
EISからメッセージが送信されます。
-
リソースアダプタからMessageEndpointFactoryに対して,createEndpointメッセージが呼び出されます。
-
MessageEndpointFactoryがエンドポイントのプロキシを生成します。
-
リソースアダプタからエンドポイントのプロキシに対して,onMessageメソッドなどのメッセージリスナのメソッドが呼び出されます。
-
エンドポイントのプロキシからMessage-driven Beanに対して,onMessageメソッドなどのメッセージリスナのメソッドが呼び出されます。
-
処理が完了したら,J2EEサーバからendpointDeactivationメソッドが呼び出されます。これによって,リソースアダプタにメッセージエンドポイントの停止が通知されます。
(3) メッセージインフローの制御の流れ(Transacted Deliveryの場合)
Transacted Deliveryとは,メッセージを配信するEISがトランザクションに参加するメッセージ配信です。
Transacted Deliveryでメッセージインフローを使用する場合の制御の流れを次の図に示します。
Transacted Deliveryでメッセージインフローを使用した場合に実行される制御について説明します。なお,項番は図中の数字と対応しています。
-
アプリケーションの開始処理によって,リソースアダプタのActivationSpecJavaBeanにプロパティが設定されます。
Message-driven Beanの属性の<activation-config>に指定した内容が設定されます。
-
J2EEサーバからendpointActivationメソッドが呼び出されます。これによって,リソースアダプタにメッセージエンドポイントの開始が通知されます。
-
EISからメッセージが送信されます。
-
リソースアダプタからMessageEndpointFactoryに対して,createEndpointメッセージが呼び出されます。
-
MessageEndpointFactoryがエンドポイントのプロキシを生成します。
-
リソースアダプタからエンドポイントのプロキシに対して,onMessageメソッドなどのメッセージリスナのメソッドが呼び出されます。
-
呼び出されたエンドポイントのプロキシからトランザクションマネージャに対して,トランザクションの開始指示が呼び出されます。
-
トランザクションマネージャによってstartメソッドが呼び出され,トランザクションが開始されます。
-
エンドポイントのプロキシからMessage-driven Beanに対して,onMessageメソッドなどのメッセージリスナのメソッドが呼び出されます。
-
エンドポイントのプロキシからトランザクションマネージャに対して,トランザクションの決着が指示されます。
-
トランザクションマネージャによってprepareメソッド,commitメソッドなどのトランザクション決着メソッドが呼び出され,トランザクションが決着します。
-
処理が完了したら,J2EEサーバからendpointDeactivationメソッドが呼び出されます。これによって,リソースアダプタにメッセージエンドポイントの停止が通知されます。
(4) メッセージエンドポイントのデプロイとアンデプロイ
ここでは,メッセージエンドポイントのデプロイとアンデプロイで実行される処理について説明します。
(a) メッセージエンドポイントのデプロイ
メッセージエンドポイントのデプロイ時に実行される処理について説明します。メッセージエンドポイントのデプロイは,リソースアダプタが開始済みの状態で,Message-driven Beanを含むアプリケーションを開始したときに実行されます。
メッセージエンドポイントのデプロイ時の処理を次の図に示します。
メッセージエンドポイントのデプロイで実行される処理について説明します。項番は図中の番号に対応しています。
-
リソースアダプタが開始済みの状態で,Message-driven Beanを含むJ2EEアプリケーションを開始します。
-
J2EEサーバが,MessageEndpointFactoryを生成します。
MessageEndpointFactoryは,J2EEサーバが提供するjavax.resource.spi.endpoint.MessageEndpointFactoryのインスタンスです。javax.resource.spi.endpoint.MessageEndpointFactoryはリソースアダプタにエンドポイントのインスタンスを提供するファクトリクラスです。
-
J2EEサーバが,ActivationSpecを生成します。
ActivationSpecは,Message-driven Bean(エンドポイント)の開始に必要な情報を設定するJavaBeanです。
-
J2EEサーバが,ActivationSpecのプロパティを設定します。
ActivationSpecのプロパティに設定する情報は,Message-driven Beanを含むアプリケーションの属性として設定した情報です。
-
J2EEサーバが,javax.resource.spi.ResourceAdapter#endpointActivation(MessageEndpointFactory, ActivationSpec)メソッドを呼び出します。
このとき,引数として,生成・設定したMessageEndpointFactoryとActivationSpecのインスタンスが指定されます。なお,endpointActivationメソッドの呼び出しで例外が発生した場合は,KDJE43174-Eのメッセージが出力され,アプリケーションの開始が中止されます。
-
リソースアダプタは,5.のメソッドが呼び出されると,メッセージプロバイダからのメッセージ受信に対する準備をします。
(b) メッセージエンドポイントのアンデプロイ
メッセージエンドポイントのアンデプロイ時に実行される処理について説明します。メッセージエンドポイントのアンデプロイは,Message-driven Beanを含むアプリケーションを停止したときに実行されます。
メッセージエンドポイントのアンデプロイ時の処理を次の図に示します。
メッセージエンドポイントのアンデプロイで実行される処理について説明します。項番は図中の番号に対応しています。
-
Message-driven Beanを含むJ2EEアプリケーションを停止します。
-
J2EEサーバが,javax.resource.spi.ResourceAdapter#endpointDeactivation(MessageEndpointFactory, ActivationSpec)を呼び出します。
このとき,引数として,デプロイ時に指定したMessageEndpointFactoryとActivationSpecと同じインスタンスが指定されます。なお,このメソッドの呼び出しで例外が発生した場合,メッセージKDJE43175-Wが出力されます。ただし,例外が発生した場合も,アプリケーションの停止処理は続行されます。
-
リソースアダプタは,2.のメソッドが呼び出されると,メッセージプロバイダからのメッセージ受信終了の処理をします。
(c) メッセージ配送をするときのリソースアダプタの処理
ここでは,メッセージ配送をするときのリソースアダプタの処理について説明します。
リソースアダプタからのメッセージエンドポイント(Message-driven Bean)の呼び出しは,メッセージエンドポイントのプロキシを使用して実行されます。このプロキシは,リソースアダプタからjavax.resource.spi.endpoint.MessageEndpointFactoryのcreateEndpointメソッドを呼び出すことで得られます。
- 注意事項
-
-
アプリケーションの停止後にMessageEndpointFactoryのメソッドを呼び出すと,javax.resource.spi.UnavailableException例外がスローされます。このとき,メッセージKDJE43177-Eが出力されます。また,メッセージエンドポイントのメソッドを呼び出した場合は,java.lang.IllegalStateException例外がスローされます。このとき,メッセージKDJE43177-Eが出力されます。
-
Transacted Deliveryの場合,メッセージ配信中にJ2EEアプリケーションを停止すると,トランザクションがロールバックされることがあります。その際にKDJE31011-EまたはKDJE31012-Eエラーが発生することがあります。J2EEサーバの停止時に動作するJ2EEアプリケーションの停止でも,これらのエラーが発生することがあります。
-