将 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 源代码中添加 @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>
- 对具有非接口视图的 bean 的一种方法应用 @Asynchronous 注释。在此示例中,m1 方法是同步方法,m2 方法是异步方法。
- 验证对任何异步方法应用的事务属性是否为 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>
下一步做什么
运行应用程序时,如果它在第一次尝试使用带有异步方法的会话 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) 容器用于分派异步方法的缺省工作管理器是不可配置的。提供了以下配置信息来帮助您理解此工作管理器施加的限制。 请记住,在应用程序服务器进程中运行的所有异步方法使用一个 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) 容器用于分派异步方法的缺省工作管理器是不可配置的。提供了以下配置信息来帮助您理解此工作管理器施加的限制。 请记住,在应用程序服务器进程中运行的所有异步方法使用一个 EJB 容器工作管理器。EJB 异步方法设置
使用此页面来修改 Enterprise JavaBeans 异步方法的支持中使用的工作管理器的设置。


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