@Jeffrey奈特:让我试着根据我的经验来澄清一下。
我们知道MDB是消耗传入消息的豆子。现在需要指定哪种消息,特定 MDB 要从哪个目标消费到哪个目标。
MDB基本上是一个消息端点。
在符合 JCA 标准的 MDB 之前:
流在网络球是:-
传入消息 --消息侦听器侦听> -->侦听器端口 -->传递到 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。
简而言之,这两种情况都使用队列连接工厂来获取队列连接。在一种情况下,它是用于传递消息的资源适配器(具有激活规范形式的配置信息),而在其他情况下,它是用于传递消息的侦听器端口(绑定到队列和工厂)。
我希望现在这能澄清。