基本
- 消息驱动Bean(又称为MDB)只是另一个EJB,如无状态,有状态或单例。 使用@MessageDriven批注指定。
- MDB用于异步消息处理
- 它们与无状态EJB 相似 ,因为它们都是由EJB容器池化的
- 但是,它们与无状态EJB不同,因为客户端无法直接访问 MDB。 只有容器会调用它们,以响应客户端发送到MDB正在侦听的端点的消息。
MDB的常用模式
- MDB通常与JMS(Java消息服务API)一起使用
- MDB配置为使用@ActivationConfigProperty侦听JMS目标,实现javax.jms.MessageListener接口,并在onMessage方法中提供业务逻辑(消息处理)
- 组件将消息发送到JMS目标( 端点 )。 这不是一个同步过程(如上所述)。 消息触发方法立即返回,容器负责调用配置为侦听该特定JMS目标的MDB
MDB神话
- MDB 不属于JMS规范的一部分, 也不以任何方式与JMS 耦合 –这是一个误解。
- MDB是池化的bean,可以以异步方式处理消息,并且可以侦听任何端点,包括JMS队列或目标 (最常见)。
- 实际上,从EJB 2.1开始就是这种情况,并且通过JCA(Java连接器体系结构)规范可以实现
什么是JCA?
- 在较高的层次上,JCA使Java EE服务器可以通过标准SPI与外部系统(例如旧版企业信息源等)进行交互(此处不处理复杂的JCA详细信息)
- 可以使用JCA标准接口为特定系统构建资源适配器(RAR文件)
- JCA为Java EE容器与外部系统之间的双向通信(入站和出站)提供合同-资源适配器本身需要实现该实现
JCA如何实现通用MDB的概念?
- JCA定义了MDB特定的功能
- 就像在基于JMS的MDB中一样,基于JCA的MDB也需要实现一个接口并定义激活属性(两者都特定于JCA Resource Adapter实现)
- 外部系统发送一条消息,资源适配器通过其入站JCA合同的实现接受该消息,并将该消息中继到内部端点(这又是特定于JCA适配器实现的)
- 注册到此端点的MDB会在接收到的消息上执行业务逻辑
最终结果
外部系统使用标准接口(JCA)将消息发送到Java EE容器,而JCA实现则负责将其传递到适当的端点,该端点进一步将其传递给已注册的MDB
需要注意的是,由于EJB规范供应商必须支持基于JCA的MDB,因此它在Java EE服务器之间是完全可移植的 。
进一步阅读
- JCA规范
- JMS规范
- EJB规范
翻译自: https://www.javacodegeeks.com/2015/01/mdb-jms-and-vice-versa.html