将 EJB 3.1 会话 Bean 方法配置为异步方法

使用本任务来配置 Enterprise JavaBeans (EJB) 3.1 会话 Bean 方法,以使其以异步方式运行。您可以使部分或全部 bean 方法成为异步方法。

开始之前

注意: 在 EJB 3.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 之后,请完成以下步骤以使其中一个或多个 bean 方法成为异步方法。

过程

  1. 将 bean 实现类的一个或多个方法指定为异步。可通过在 bean 源代码中添加 @Asynchronous 注释、在模块部署描述符中添加 <async-method> 节或添加注释和部署描述符节的组合来完成此操作。 您可以将 @Asynchronous 注释或仅其超类应用于您的 bean 实现类。无法将其应用于接口类。此外,当在类级别应用注释时,该类的所有方法均为异步。同样,通过在部署描述符中将“*”应用为 <method-name>,可将 bean 的所有方法配置为异步。
    请参阅以下应用 @Asynchronous 注释的示例:
    • 对具有非接口视图的 bean 的一种方法应用 @Asynchronous 注释。在此示例中,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 文档以了解更多详细信息。
    • 对 Bean 类的类级别应用 @Asynchronous 注释。在此示例中,m1 方法和 m2 方法在这一非接口视图 Bean 中均为异步方法。
      @Stateless @LocalBean @Asynchronouspublic class MyLocalBean {
      
         public void m1() {
      
            // method code
         }
      
         public Future<String> m2() { 
      
            // method code
      
            return new javax.ejb.AsyncResult("Hello, Async World!");
         }
      
      }
    • 对 Bean 实现类的一个方法应用 @Asynchronous 注释。在此示例中,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);
         }
      }
    • 对 bean 实现类的类级别应用 @Asynchronous 注释。在此示例中,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 实现类及其超类的所有业务方法都使用通配符 (*) method-name 元素配置为异步。
      <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>
      
      
    • 在此示例中,将忽略方法 m2 的 @Asynchronous 注释,因为部署描述符头包含 metadata-complete="true" 标记。此标记导致仅从部署描述符元素中获取配置信息。结果是:仅 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。 这些事务属性类型是异步方法上仅支持的几种事务属性类型。可通过在 bean 源代码中应用 @TransactionAttribute 注释、在 ejb-jar.xml 文件中添加 <container-transaction> 节或在部署描述符中添加注释和 <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