@Jeffrey Knight: 让我根据我的经验尝试澄清一下。
我们理解MDB是消费传入消息的bean。现在需要指定特定的消息类型和MDB要从哪个目标消费。
MDB基本上是一个消息端点。
JCA兼容MDB之前:
在websphere中的流程如下:
传入消息->被消息监听器监听->监听器端口->交付给MDB
因此,开发人员通常会创建一个MDB,并在ejb-jar.xml中指定消息目标详细信息,如下所示:
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
<res-ref-name>jms/QCF</res-ref-name>
<resource-ref>
<res-type>javax.jms.QueueConnectionFactory</res-type>
<res-auth>Container</res-auth>
</resource-ref>
部署者需要创建侦听端口并将已部署的MDB与侦听端口相关联。上述QueueConnectionFactory用于创建到队列的连接。
符合JCA标准的MDB:
在JCA之后,MDB被视为JCA资源。 JCA规范还将消息框架API纳入其中。在JCA的情况下,流程如下:
incoming message --> listened by Message listener --> Resource Adapter-->deliver to MDB
由于JCA是为了与任何类型的资源(例如JDBC、JMS、EIS等)一起使用而创建的,因此它具有通用的“激活规范”方式,可为任何适配器创建配置。在ra.xml文件中,指定了该特定适配器所需的激活规范类型以使其正常工作。激活规范不是运行时实体,它只是由资源适配器使用的配置详细信息。在上述情况下,JCA适配器将使用激活规范中提到的队列连接工厂中的连接。因此,在上述两种情况下,队列连接工厂都是相同的。
在WebSphere的情况下,您可以使用SIB(服务集成总线)目标进行消息传递,也可以使用外部软件(如WebSphere MQ)进行消息传递。
对于SIB目标进行消息传递:SIB已经实现了一个JCA资源适配器。因此,使用SIB上的目标的MDB可以使用激活规范来指定目标详细信息。资源适配器模块可以与消息引擎交互,并将消息传递给MDB。
对于外部消息框架(如WebSphere MQ)进行消息传递:由于WebSphere MQ没有实现任何JCA适配器,因此我们将需要配置侦听器端口以连接到驻留在WebSphere MQ上的目标。侦听器端口将把消息传递给MDB。
简而言之,在两种情况下都使用队列连接工厂来获取队列连接。在一种情况下,资源适配器(以激活规范的形式的配置信息)用于传递消息,而在另一种情况下,侦听器端口(绑定到队列和工厂)用于传递消息。
希望这样可以解释清楚。