EJB 3.1 セッション Bean メソッドを非同期に構成する
このタスクを使用して、Enterprise JavaBeans (EJB) 3.1 セッション Bean メソッドを、非同期に実行するように構成します。 一部またはすべての Bean メソッドを非同期に設定できます。
始める前に
重要: EJB 3.1 モジュールでは、1 つ以上のセッション Bean メソッドを非同期に設定することができ、アプリケーション内での並列処理の範囲が広がります。
- EJB 3.1 非同期メソッドにまだ精通していない場合は、EJB 3.1 非同期メソッド、EJB 非同期メソッドのクライアント・プログラミング・モデル、EJB 非同期メソッドの Bean 実装プログラミング・モデル、および非同期メソッドの EJB コンテナー作業マネージャーを参照してください。 これらのトピックでは、EJB 3.1 非同期メソッドの概要を示し、クライアントおよび Bean 実装プログラミング・モデルについて説明し、EJB コンテナーが非同期メソッドをディスパッチするために使用する作業マネージャーについて述べています。
- アプリケーション用の新しい EJB 3.1 セッション Bean を開発するか、既存のセッション Bean を、非同期メソッドの EJB 3.1 プログラミング・モデル要件に適合するように変更します。 一般的な情報については、エンタープライズ Bean の開発に関する情報を参照してください。
このタスクについて
手順
- Bean 実装クラスの 1 つ以上のメソッドを非同期として指定します。
これは、Bean ソース・コードに @Asynchronous アノテーションを追加するか、モジュール・デプロイメント記述子に <async-method> スタンザを追加するか、またはアノテーションとデプロイメント記述子スタンザの両方の組み合わせを追加することによって達成することができます。 @Asynchronous アノテーションまたはそのスーパークラスは、Bean 実装クラスにのみ適用できます。
インターフェース・クラスに適用することはできません。
また、このアノテーションがクラス・レベルで適用されると、そのクラスのメソッドはすべて非同期となります。
同様に、デプロイメント記述子で「*」を <method-name> として適用することによって、Bean のすべてのメソッドを非同期として構成することができます。
以下に示す @Asynchronous アノテーションの適用例を参照してください。
- @Asynchronous アノテーションを、非インターフェース・ビューを持つ Bean の 1 つのメソッドに適用します。
この例では、m1 メソッドを同期に、m2 メソッドを非同期にします。
@Stateless @LocalBean public class MyLocalBean { public void m1() { // method code } @Asynchronous public Future<String> m2() { // method code return new javax.ejb.AsyncResult("Hello, Async World!"); } }
重要: javax.ejb.AsyncResult<V> オブジェクトは、Future<V> インターフェースの便宜的実装です。 詳しくは、API の資料を参照してください。 - @Asynchronous アノテーションを Bean クラスのクラス・レベルに適用します。
この例では、この非インターフェース・ビュー Bean の m1 メソッドと m2 メソッドの両方が非同期になります。
@Stateless @LocalBean @Asynchronouspublic class MyLocalBean { public void m1() { // method code } public Future<String> m2() { // method code return new javax.ejb.AsyncResult("Hello, Async World!"); } }
- @Asynchronous アノテーションを Bean 実装クラスの 1 つのメソッドに適用します。
この例では、m1 メソッドを同期に、m2 メソッドを非同期にします。この例はまた、戻りの型がビジネス・インターフェースと実装クラスでどのように異なることがあるかも示しています。
public interface MyIntf { public void m1(); public Future<Integer> m2(); }
@Stateless @Local(MyIntf.class) public class MyBean { public void m1() { // method code } @Asynchronous public Integer m2() { // method code return new Integer(3); } }
- @Asynchronous アノテーションを Bean 実装クラスのクラス・レベルに適用します。
この例では、m1 メソッドと m2 メソッドの両方を非同期にします。
@Stateless @Local(MyIntf.class) @Asynchronous public class MyBean { public void m1() { // method code } public Integer m2() { // method code return new Integer(8); } }
以下に示す EJB モジュール・デプロイメント記述子 ejb-jar.xml の変更例を参照してください。- この例では、FullAyncBean Bean 実装クラスおよびそのスーパークラスのすべてのビジネス・メソッドが、ワイルドカード (*) メソッド名エレメントを持つ非同期として構成されています。
<session> <display-name>FullAsyncEJB</display-name> <ejb-name>FullAsyncBean</ejb-name> <business-local>com.ibm.sample.async.ejb.FullAsyncIntf</business-local> <ejb-class>com.ibm.sample.async.ejb.FullAsyncBean</ejb-class> <session-type>Stateless</session-type> <async-method> <method-name>*</method-name> </async-method> </session>
- この例では、指定されたメソッドとシグニチャーのみ (m1 という名前のすべてのメソッドおよび単一のストリング・パラメーターを持つメソッド m2) が PartiallyAsyncBean Bean 実装クラスで非同期として構成されています。
<session> <display-name>PartiallyAsyncEJB</display-name> <ejb-name>PartiallyAsyncEJB</ejb-name> <business-local>com.ibm.sample.async.ejb.PartiallyAsyncIntf</business-local> <ejb-class>com.ibm.sample.async.ejb.PartiallyAsyncBean</ejb-class> <session-type>Stateless</session-type> <async-method> <method-name>m1</method-name> </async-method> <async-method> <method-name>m2</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </async-method> </session>
以下に示す Bean ソース・コード内での @Asynchronous アノテーションの組み合わせの適用例および EJB モジュール・デプロイメント記述子 ejb-jar.xml の変更例を参照してください。- この例では、@Asynchronous アノテーションがメソッド m2 を非同期メソッドとして構成し、デプロイメント記述子がメソッド m1 をやはり非同期メソッドとして構成しています。
@Stateless @LocalBean public class MyLocalBean { public void m1() { // method code } @Asynchronous public Future<String> m2() { // method code return new javax.ejb.AsyncResult("Hello, Async World!"); } } <session> <display-name>MyLocalEJB</display-name> <ejb-name>MyLocalEJB</ejb-name> <local-bean/> <ejb-class>com.ibm.sample.async.ejb.MyLocalBean</ejb-class> <session-type>Stateless</session-type> <async-method> <method-name>m1</method-name> </async-method> </session>
- この例では、デプロイメント記述子ヘッダーが metadata-complete="true" フラグを含んでいるため、メソッド m2 の @Asynchronous アノテーションは無視されます。
このフラグがあるため、構成情報はデプロイメント記述子エレメントからのみ取得されます。
その結果、MyLocalBean 実装のメソッド m1 のみが非同期メソッドとして構成されます。
@Stateless @LocalBean public class MyLocalBean { public void m1() { // method code } @Asynchronous public Future<String> m2() { // method code return new javax.ejb.AsyncResult("Hello, Async World!"); } } <ejb-jar id="ejb-jar_ID" ... metadata-complete="true" version="3.1"> ... <session> <display-name>MyLocalEJB</display-name> <ejb-name>MyLocalEJB</ejb-name> <local-bean/> <ejb-class>com.ibm.sample.async.ejb.MyLocalBean</ejb-class> <session-type>Stateless</session-type> <async-method> <method-name>m1</method-name> </async-method> </session> ... </ejb-jar>
- @Asynchronous アノテーションを、非インターフェース・ビューを持つ Bean の 1 つのメソッドに適用します。
この例では、m1 メソッドを同期に、m2 メソッドを非同期にします。
- すべての非同期メソッドに適用されたトランザクション属性が REQUIRED、REQUIRES_NEW、NOT_SUPPORTED のいずれかであることを検証します。 非同期メソッドでサポートされるのは、これらのトランザクション属性タイプのみです。
このアクションを実行するには、@TransactionAttribute アノテーションを Bean ソース・コード内で適用するか、<container-transaction> スタンザを ejb-jar.xml ファイルに追加するか、またはアノテーションと <container-transaction> スタンザの両方の組み合わせをデプロイメント記述子に追加します。
次に示す、アノテーションを使用して非同期メソッドのトランザクション属性を設定する例を参照してください。
@Singleton @LocalBean public class FullAsyncBean { @Asynchronous @TransactionAttribute(REQUIRED) // the default; specified for illustration public void m1() { // ... } @Asynchronous @TransactionAttribute(NOT_SUPPORTED) public void m2() { // ... } @Asynchronous @TransactionAttribute(REQUIRES_NEW) public void m3() { // ... } // ... }
次に示す、XML デプロイメント記述子を使用して非同期メソッドのトランザクション属性を設定する例を参照してください。<assembly-descriptor> <container-transaction> <method> <ejb-name>FullAsyncBean</ejb-name> <method-name>m1</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> <container-transaction> <method> <ejb-name>FullAsyncBean</ejb-name> <method-name>m2</method-name> </method> <trans-attribute>NotSupported</trans-attribute> </container-transaction> <container-transaction> <method> <ejb-name>FullAsyncBean</ejb-name> <method-name>m3</method-name> </method> <trans-attribute>RequiresNew</trans-attribute> </container-transaction> </assembly-descriptor>
次に示す、アノテーションと XML デプロイメント記述子の両方の組み合わせを使用して Bean のトランザクション属性を構成する例を参照してください。 この例では、メソッド m3 のデプロイメント記述子スタンザがクラス・レベル・アノテーションをオーバーライドします。 その結果、メソッド m3 は REQUIRES_NEW として構成されますが、メソッド m1 および m2 は REQUIRED として構成されます。@Singleton @LocalBean @Asynchronous @TransactionAttribute(REQUIRED) // the default; specified for illustration public class FullAsyncBean { public void m1() { // ... } public void m2() { // ... } public void m3() { // ... } // ... } <assembly-descriptor> <container-transaction> <method> <ejb-name>FullAsyncBean</ejb-name> <method-name>m3</method-name> </method> <trans-attribute>RequiresNew</trans-attribute> </container-transaction> </assembly-descriptor>
次のタスク
アプリケーションを実行すると、そのアプリケーションが非同期メソッドを含むセッション Bean の使用を初めて試みて失敗したときに、構成エラーが検出されることがあります。システム・ログ・ファイルに構成エラー・メッセージがないかを確認します。
トレース・データを分析するか、または分析を行う組織に転送します。EJB 非同期メソッドのスケジューリングおよび呼び出しは、EJB コンテナー・トレースによってトレースされます。このトレースを使用可能にする方法については、稼働中のサーバーでのトレースの使用可能化に関する情報を参照してください。 トレース・データを分析するには、トレース出力に関する情報を参照してください。
サブトピック
リモート非同期 EJB メソッドの結果の構成
このタスクを行って、リモートの非同期 Enterprise JavaBeans (EJB) メソッド呼び出しでの要求されない結果の最大数を設定します。スクリプトを使用した EJB 非同期メソッドの構成
wsadmin スクリプトを使用すると、Enterprise JavaBeans (EJB) 非同期メソッドを構成できます。EJB 3.1 非同期メソッド
Enterprise JavaBeans™ (EJB) 3.1 仕様には、アプリケーション開発者が、呼び出し元スレッドとは別のスレッドで実行される EJB 非同期メソッドを構成する場合に使用できる機能が含まれています。EJB 非同期メソッドを呼び出すクライアント・コードの開発
このトピックにあるサンプル・コードを使用して、EJB 非同期メソッドを呼び出すクライアント・コードを開発することができます。EJB 非同期メソッドの Bean 実装プログラミング・モデル
セッション Bean で非同期メソッドを構成できます。ただし、Enterprise JavaBeans (EJB) 3.1 仕様に規定されているように、非同期メソッドは、エンティティー Bean またはメッセージ駆動型 Bean で構成することはできません。非同期メソッドの EJB コンテナー作業マネージャー
非同期メソッドをディスパッチするために Enterprise JavaBeans (EJB) コンテナーによって使用されるデフォルトの作業マネージャーは、構成可能ではありません。 この作業マネージャーによって課される制限を理解する参考として、次の構成情報を参照してください。 アプリケーション・サーバー・プロセス内で実行されているすべての非同期メソッドに対して、1 つの EJB コンテナー作業マネージャーが存在することに注意してください。EJB 非同期メソッド設定
Enterprise JavaBeans 非同期メソッドのサポートにより使用される作業マネージャーの設定を変更するには、このページを使用します。リモート非同期 EJB メソッドの結果の構成
このタスクを行って、リモートの非同期 Enterprise JavaBeans (EJB) メソッド呼び出しでの要求されない結果の最大数を設定します。スクリプトを使用した EJB 非同期メソッドの構成
wsadmin スクリプトを使用すると、Enterprise JavaBeans (EJB) 非同期メソッドを構成できます。EJB 3.1 非同期メソッド
Enterprise JavaBeans™ (EJB) 3.1 仕様には、アプリケーション開発者が、呼び出し元スレッドとは別のスレッドで実行される EJB 非同期メソッドを構成する場合に使用できる機能が含まれています。EJB 非同期メソッドを呼び出すクライアント・コードの開発
このトピックにあるサンプル・コードを使用して、EJB 非同期メソッドを呼び出すクライアント・コードを開発することができます。EJB 非同期メソッドの Bean 実装プログラミング・モデル
セッション Bean で非同期メソッドを構成できます。ただし、Enterprise JavaBeans (EJB) 3.1 仕様に規定されているように、非同期メソッドは、エンティティー Bean またはメッセージ駆動型 Bean で構成することはできません。非同期メソッドの EJB コンテナー作業マネージャー
非同期メソッドをディスパッチするために Enterprise JavaBeans (EJB) コンテナーによって使用されるデフォルトの作業マネージャーは、構成可能ではありません。 この作業マネージャーによって課される制限を理解する参考として、次の構成情報を参照してください。 アプリケーション・サーバー・プロセス内で実行されているすべての非同期メソッドに対して、1 つの EJB コンテナー作業マネージャーが存在することに注意してください。EJB 非同期メソッド設定
Enterprise JavaBeans 非同期メソッドのサポートにより使用される作業マネージャーの設定を変更するには、このページを使用します。
関連概念:


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_dvamethods
ファイル名:tejb_dvamethods.html