消息驱动 Bean 是一种企业 Bean,通过该 Bean,J2EE 应用程序可以异步处理消息。该 Bean 用作 Java 消息服务 (Java Message Service, JMS) 消息侦听程序,此消息侦听程序类似于事件侦听程序,不同的是消息驱动 Bean 接收消息而不是事件。消息可以由任何 J2EE 组件(应用程序客户端、其他企业 Bean 或 Web 组件)发送。
消息驱动 Bean 是构建异步企业应用程序的解决方案,在该应用程序中,当有消息进入时才开始执行处理。通过此方法,可实现企业应用程序模块间的松散耦合。在发送者(即创建者)将消息发送到 JMS 管理的对象(主题或队列)时,便会启动进程。
与会话 Bean 和实体 Bean 不同,消息驱动 Bean 的客户端不直接对其进行访问。消息驱动 Bean 只有一个 Bean 类。
在某些方面,消息驱动 Bean 类似于无状态会话 Bean:
消息驱动 Bean 实例的实例变量可以维护客户端消息处理过程中的状态信息,如对企业 Bean 对象的对象引用。
当消息到达时,容器将调用消息驱动 Bean 的 onMessage 方法来处理此消息。onMessage 方法通常将消息强制转换为五个 JMS 消息类型之一,然后根据应用程序的业务逻辑处理此消息。onMessage 方法可能会调用帮助程序方法,或者调用会话 Bean 或实体 Bean 来处理消息中的信息,然后可能会将结果存储在数据库中。
很多消息驱动 Bean 类的实例可以并行执行,从而能够并行处理消息流。因为无法保证以准确的顺序将消息传送到这些实例,所以必须准备使用消息驱动 Bean 来处理序列以外的消息。例如,取消保留的消息会在确认保留的消息之前被传送。
容器为消息驱动 Bean 实例提供了 MessageDrivenContext,这样,Bean 实例便可访问由容器为其维护的上下文。根据 Bean 是管理其自身的事务还是依赖容器的事务管理,它可以访问 MessageDrivenContext 的不同方法以处理事务。
如果 Bean 使用此接口设置事务界限,则导致调用 Bean 的消息接收凭据不是事务的一部分。如果要使消息接收凭据成为事务的一部分,您必须使用容器管理事务。
消息驱动 Bean 的 newInstance、setMessageDrivenContext、ejbCreate 和 ejbRemove 方法通过未指定的事务上下文进行调用。当调用消息驱动 Bean 时,不存在任何可用的客户端事务上下文,因为事务上下文不支持 JMS 消息。
Bean 可以使用以下 MessageDrivenContext 方法: