ActivationSpec和ConnectionFactory有什么区别?

时间:2011-09-12 15:28:34

标签: java java-ee websphere ibm-mq

我的理解是:

  • MD B s(消息驱动Bean)通过激活规范连接。
  • MD P s(消息驱动POJO)通过连接工厂连接。

此图表from IBM非常有用:

enter image description here

对我而言,this explanation from IBM并没有对这种差异有所了解:

  • 连接工厂 - 由应用程序用于连接到消息传递总线。
  • 队列 - 由应用程序用来发送和接收邮件。
  • 激活规范 - 由应用程序的消息驱动Bean用于连接到队列并接收消息。

一个真正的difference I have found is that

  

会话bean和实体bean [又名MDP]允许您发送JMS消息   同时接收,但不是异步。为了避免捆绑   服务器资源,您可能不希望使用阻塞同步   在服务器端组件中接收。 接收消息   异步使用消息驱动的bean [MDB]。

所以到目前为止我不满意的名单是:

  • 将ActivationSpec与MDB和ConnectionFactory与POJO一起使用(但等待,POJO use ActivationSpec too可以吗?)
  • MDB以异步方式运行。 MBP同步运作。

我的问题是:还有其他差异吗?你能澄清一下这个区别吗?

参考文献:

3 个答案:

答案 0 :(得分:15)

@Jeffrey Knight:让我根据自己的经验尝试澄清。

我们理解MDB是使用传入消息的bean。现在需要指定哪种消息,特定MDB要从哪个目标消费到。

MDB基本上是一个消息终点。

符合JCA标准的MDB之前:

websphere中的流程是: -

  

传入讯息 - >由消息监听器监听 - >倾听者   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后,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)。这允许应用程序“异步”接收消息,而不是要求客户端轮询或阻止尝试从队列中提取消息。