异步 bean
异步 Bean 是可由 Java Platform, Enterprise Edition (Java EE) 应用程序使用 异步 Bean 创建程序的 Java EE 上下文以异步方式运行的 Java™ 对象或企业 Bean。

通过启用 Java EE 程序将操作分解为几个并行任务,异步 bean 可改进性能。异步 bean 支持有状态的构造、活动的 Java EE 应用程序。这些应用程序处理需要应用程序线程化、服务器应用程序中的活动代理程序或分布式监视功能的应用程序的应用程序空间分段。
- 国际化上下文
- 应用程序概要文件,不受 Java EE 1.4 应用程序支持并建议不要在 Java 1.3 应用程序中使用
- 工作区
异步 bean 接口
- 工作对象
- 存在两个工作接口,实质上实现相同的目的。旧的异步 bean 工作接口是 com.ibm.websphere.asynchbeans.Work,而 CommonJ 工作接口是 commonj.work.Work。工作对象使用工作管理器 startWork 或 schedule 方法(startWork 用于旧的异步 bean,而 schedule 用于 CommonJ)与其调用者并行运行。应用程序实现工作对象,以异步运行代码块。
- 计时器侦听器
- 此接口是实现 commonj\timers\TimerListener 接口的对象。高速瞬态计时器到期时调用计时器侦听器。
- 警报侦听器
- 警报侦听器是实现 com.ibm.websphere.asynchbeans.AlarmListener 接口的对象。高速瞬态警报到期时调用警报侦听器。
- 事件侦听器
- 事件侦听器可实现任何接口。事件侦听器是轻量级异步通知机制,用于单个 Java 虚拟机 (JVM) 内的异步事件。事件侦听器通常在单个应用程序中启用 Java EE 组件,以彼此通知有关的各种异步事件。
支持接口
- 工作管理器
- 工作管理器是管理员为 Java EE 应用程序创建的线程池。管理员指定线程池属性,以及指定确定异步 bean 继承哪些 Java EE 上下文的策略。
- CommonJ 工作管理器
- CommonJ 工作管理器类似于工作管理器。两者的差别在于 CommonJ 工作管理器包含异步 bean 工作管理器方法的子集。尽管 CommonJ 工作管理器在 Java EE 1.4 环境中运行,但是工作管理器的每个 JNDI 查询不返回新的 WorkManager 实例。范围内工作管理器的所有 JNDI 查找具有相同的实例。
- 计时器管理器
- 计时器管理器实现 commonj.timers.TimerManager 接口,该接口使 Java EE 应用程序(其中包含 servlet、EJB 应用程序和 JCA 资源适配器)能够调度以后的计时器通知和接收计时器通知。应用程序服务器规范的计时器管理器提供应用程序服务器支持的使用 java.util.Timer 类的可选方法,这不适用于受管环境。
- 事件源
- 事件源实现 com.ibm.websphere.asynchbeans.EventSource 接口。事件源是系统提供的对象,其支持单个 JVM 中一般的类型安全异步通知服务器。事件源启用事件侦听器对象,其实现要注册的任何接口。
- 事件源事件
- 每个事件源可生成其自己的事件,如更改的侦听器计数。应用程序可注册实现类 com.ibm.websphere.asynchbeans.EventSourceEvents 的事件侦听器对象。此操作允许应用程序捕捉事件,如正在添加或移除的侦听器,或者抛出意外异常的侦听器。
在“开发异步范围”主题中介绍了其他接口(包含警报和子系统监视器),此主题讨论了异步 bean 的一些高级应用程序。
事务
每个异步 bean 方法使用其自己的事务进行调用,与典型企业 Bean 中容器管理的事务很像。这与使用 TX_NOT_SUPPORTED 调用 Enterprise JavaBeans (EJB) 方法时的情况非常相似。运行时在调用方法前启动局部事务包含范围。如果此事务可能用于调用 Java EE 组件,那么异步 bean 方法自由启动其自己的全局事务。例如,如果企业 Bean 创建组件,那么创建异步 bean 的方法必须是 TX_BEAN_MANAGED。
例如,从异步 bean 内调用实体 Bean 时,必须使全局事务上下文在当前线程上可用。因为异步 bean 对象启动局部事务上下文,所以您可将所有实体 Bean 逻辑封装在具有标记为 TX_REQUIRES 的方法或等价方法的会话 Bean 中。此进程建立您可访问一个或多个实体 Bean 方法的全局事务上下文。
如果异步 bean 方法抛出异常,那么回滚任何局部事务。如果方法正常返回,那么根据为 Bean 配置的未解析操作策略完成未完成的局部事务。EJB 方法可使用其部署描述符配置此策略。如果异步 bean 方法启动其自己的全局事务,并且未落实此全局事务,那么在方法返回时,回滚该事务。
访问 Java EE 组件元数据
如果异步 bean 是 Java EE 组件,如会话 Bean,那么在调用方法时,其自己的元数据是活动的。如果异步 bean 是简单 Java 对象,那么创建组件的 Java EE 组件元数据可用于此 Bean。同其创建程序一样,异步 bean 可查找 java:comp 名称空间。此查询允许 Bean 访问连接工厂和企业 Bean,正像其在作为任何其他 Java EE 组件时进行的操作。创建组件的环境属性还可用于异步 bean。
java:comp 名称空间等同于可创建组件、应用相同的限制的名称空间。例如,如果企业 Bean 或 servlet 具有 EJB 引用 java:comp/env/ejb/MyEJB,此 EJB 引用可用于异步 bean。另外,所有连接工厂使用与创建组件的相同资源共享范围。
连接管理
异步 bean 方法可利用其通过使用 java:comp 资源引用创建 Java EE 组件获取的连接。(有关资源引用的更多信息,请参阅“引用”主题。)但是,Bean 方法必须使用 get、use 或 close 模式访问这些连接。在异步 bean 上的方法调用之间不存在连接高速缓存。连接工厂或数据源可高速缓存,但是连接必须在每次方法调用时被检索、使用,然后关闭。虽然异步 Bean 方法可使用全局 Java 命名和目录接口 (JNDI) 名称查找连接工厂,出于下列原因,不推荐使用:
- JNDI 名称在应用程序中硬编码(例如,作为属性或字符串字面值)。
- 连接工厂不共享,这是因为没有指定共享范围的方法。
有关演示从异步 bean 方法访问连接的正确和不正确方法的代码示例,请参阅“示例:异步 bean 连接管理”主题。
异步 bean 的延迟启动
异步 bean 通过允许序列化 Java EE 服务上下文信息来支持延迟启动。WorkManager 接口的 WorkWithExecutionContext createWorkWithExecutionContext(Work r) 方法将创建在 WorkManager 上启用的 Java EE 服务上下文快照。然后,产生的 WorkWithExecutionContext 对象可序列化,并存储在数据库或文件中。当需要存储 Java EE 服务上下文(如当前安全身份或语言环境)时,稍后填充它们,然后在此上下文中运行一些工作时,这样做非常有用。可对 WorkManager 接口使用 startWork() 和 doWork() 方法运行 WorkWithExecutionContext 对象。所有 WorkWithExecutionContext 对象必须由将它序列化的相同应用程序进行反序列化。为了 Java 能够成功填充其中包含的对象,所有 EJB 和类必须存在。
延迟启动和安全性
异步 bean 安全服务上下文可能需要启用公共安全互操作性 V2 (CSIV2) 身份断言。将 WorkWithExecutionContext 对象反序列化并运行对 Java 认证和授权服务 (JAAS) 主体集标识凭证指定时,身份断言是必需的。查看以下主题,以更好地理解您在使用 WorkWithExecutionContext 对象时是否需要启用身份断言:- 配置公共安全互操作性 V2 和安全认证服务认证协议
- 身份断言
还存在与来自产品不同版本的 WorkWithExecutionContext 对象进行交互时发生的问题。请参阅“与异步 bean 互操作”主题。
与 JPA 相关的限制
不支持在 JPA 扩展持久性上下文中使用异步 bean。
JPA 扩展持久性上下文与异步 bean 的调度和多线程功能不一致,无法从异步 bean 线程中进行访问。
同样地,因为并不预期使 EntityManager 实例成为线程安全的实例,所以不应该将异步 bean 创建成接受 javax.persistence.EntityManager(或子类)作为参数。