我的理解是:
此图表from IBM非常有用:
对我而言,this explanation from IBM并没有对这种差异有所了解:
一个真正的difference I have found is that:
会话bean和实体bean [又名MDP]允许您发送JMS消息 同时接收,但不是异步。为了避免捆绑 服务器资源,您可能不希望使用阻塞同步 在服务器端组件中接收。 接收消息 异步使用消息驱动的bean [MDB]。
所以到目前为止我不满意的名单是:
我的问题是:还有其他差异吗?你能澄清一下这个区别吗?
参考文献:
答案 0 :(得分:15)
我们理解MDB是使用传入消息的bean。现在需要指定哪种消息,特定MDB要从哪个目标消费到。
MDB基本上是一个消息终点。
传入讯息 - >由消息监听器监听 - >倾听者 ports - >传递给MDB
通常,开发人员会在ejb-jar.xml中创建MDB并指定消息目标详细信息,如下所示: -
<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资源。 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。
简而言之,两种情况都使用队列连接工厂来获取队列连接。在一种情况下,资源适配器(具有激活规范形式的配置信息)用于传递消息,而在其他情况下,它是用于传递消息的侦听器端口(绑定到队列和工厂)。
我希望现在澄清一下。
答案 1 :(得分:12)
它们都是配置,但连接工厂用于出站消息,激活规范用于入站消息传递。
这是我从IBM那里得到的。
激活规范是JCA 1.5规范的一部分。该 MDB应用程序使用激活规范连接到 WebSphere MQ队列管理器,用于处理入站消息。该 激活规范还提供其他选项,例如安全性 设置。
JMS连接工厂包含有关如何创建的信息 连接。当应用程序需要JMS连接时,工厂 创建一个连接实例。连接工厂需要 与您的激活规范相同的连接信息 先前创建,但用于来自MDB的出站消息, 而激活规范用于入站消息。
答案 2 :(得分:2)
ConnectionFactory的客户端是应用程序。该应用程序使用ConnectionFactory通过队列向/从消息传递引擎推送/拉出消息。
ActivationSpec的客户端是EJB容器。 EJB容器获取ActivationSpec以使用ResourceAdapter为MDB或MDP注册MessageEndpointFactory。当客户端将消息推送到消息传递引擎时,消息传递引擎将使用注册的MessageEndpointFactory将消息转发给应用程序(例如,MDB或MDP)。这允许应用程序“异步”接收消息,而不是要求客户端轮询或阻止尝试从队列中提取消息。