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 メソッドを非同期にします。

手順

  1. 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>
  2. すべての非同期メソッドに適用されたトランザクション属性が 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>

次のタスク

続けてアプリケーションの追加コンポーネントを開発します。アプリケーションに必要なすべてのコンポーネントを開発したら、アプリケーションをアセンブルしてデプロイします。EJB モジュールのアセンブルおよび EJB モジュールのデプロイに関する情報を参照してください。

アプリケーションを実行すると、そのアプリケーションが非同期メソッドを含むセッション Bean の使用を初めて試みて失敗したときに、構成エラーが検出されることがあります。システム・ログ・ファイルに構成エラー・メッセージがないかを確認します。

トレース・データを分析するか、または分析を行う組織に転送します。EJB 非同期メソッドのスケジューリングおよび呼び出しは、EJB コンテナー・トレースによってトレースされます。このトレースを使用可能にする方法については、稼働中のサーバーでのトレースの使用可能化に関する情報を参照してください。 トレース・データを分析するには、トレース出力に関する情報を参照してください。


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_dvamethods
ファイル名:tejb_dvamethods.html