激活规范(ActivationSpec)和连接工厂(ConnectionFactory)有什么区别?

20
我的理解是:
  • 使用激活规范(Activation Specification)连接消息驱动 Bean(MDB)。
  • 使用连接工厂(Connection Factory)连接消息驱动 POJO(MDP)。

这张来自 IBM 的图表很有帮助:

enter image description here

对我来说,IBM 的这个解释并没有阐明差异:

  • 连接工厂 -- 应用程序用于获取与消息总线的连接。
  • 队列 -- 应用程序用于发送和接收消息。
  • 激活规范 -- 应用程序的消息驱动 Bean 用于连接队列并接收消息。

我找到的一个真正的区别是:

会话 Bean 和实体 Bean(也称为 MDP)允许您发送 JMS 消息并同步接收它们,但不允许异步接收。为了避免占用服务器资源,您可能不希望在服务器端组件中使用阻塞同步接收。要异步接收消息,请使用消息驱动 Bean(MDB)。

因此,我目前得到的不令人满意的列表是:

  • 使用激活规范与 MDB,并使用连接工厂与 POJO(但是等等,POJO 是否也可以使用激活规范?)
  • MDB 异步操作。MDP 同步操作。

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

参考资料:

3个回答

14

@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。
简而言之,在两种情况下都使用队列连接工厂来获取队列连接。在一种情况下,资源适配器(以激活规范的形式的配置信息)用于传递消息,而在另一种情况下,侦听器端口(绑定到队列和工厂)用于传递消息。
希望这样可以解释清楚。

WebSphere Application Server v7 允许使用 WebSphere MQ 消息提供程序创建激活规范。 - zacheusz

12

这两者都是配置项,但连接工厂用于出站消息,而激活规范用于入站消息。

这是我从IBM获得的信息。

激活规范是JCA 1.5规范的一部分。MDB应用程序使用激活规范连接到WebSphere MQ队列管理器以处理入站消息。激活规范还提供其他选项,例如安全设置。

JMS连接工厂包含有关如何创建连接的信息。当应用程序需要JMS连接时,工厂会创建一个连接实例。连接工厂需要与您之前创建的激活规范相同的连接信息,但用于MDB的出站消息,而激活规范用于入站消息。


2

ConnectionFactory的客户端是应用程序。 应用程序使用ConnectionFactory通过队列将消息推送/拉取到/从消息引擎中。

ActivationSpec的客户端是EJB容器。 EJB容器获取ActivationSpec以为MDB或MDP注册MessageEndpointFactory与ResourceAdapter。 当客户端将消息推送到消息引擎时,消息引擎将使用注册的MessageEndpointFactory将消息转发到应用程序(例如,MDB或MDP)。 这使得应用程序可以“异步”接收消息,而不需要客户端轮询或阻塞尝试从队列中拉取消息。


是的,你说得对,我把自己搞混了。我更新了答案,希望更清晰明了。谢谢。 - Brett Kail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接