4

今天,如果我们使用 JMS API 构建应用程序(使用 MDB 作为消息侦听器,将其托管在 GlassFish 或 Weblogic 10 上),明天假设流量变得疯狂,我们能否在不更改代码的情况下将此应用程序移植到 Websphere MQ 等产品...因为理论上 MQ 更像是一个专用的 JMS 提供者...

4

4 回答 4

4

是和不是。(所有最佳问题的答案总是“视情况而定”。)

如果应用程序遵循 JMS 规范,那么它应该在任何符合 JMS 的提供程序上运行不变。这就是好消息。

坏消息是,提供者如何实现 JMS 确实很重要。例如,JMS 1.1 规范的第 6.5 节对主题这样说:

许多 Pub/Sub 提供者将主题分组到层次结构中,并提供各种选项来订阅层次结构的各个部分。JMS 对 Topic 对象表示的内容没有任何限制。它可能是主题层次结构中的一个叶子,也可能是层次结构的较大部分(用于订阅一般信息类)。

主题的组织和订阅的粒度是 Pub/Sub 应用程序架构的重要组成部分。JMS 没有指定如何执行此操作的策略。如果应用程序利用了提供者特定的主题分组机制,它应该记录这一点。如果应用程序是使用不同的提供者安装的,那么管理员的工作就是构建一个等效的主题架构并创建等效的主题对象。

这意味着规范的某些部分对 JMS 传输提供者的解释是开放的。移植应用程序时如何映射这些差异将由应用程序所有者决定。

这个问题的另一个方面是,即使两个传输提供者严格遵循规范,API 背后的行为也可能不同。这方面的一个例子是连接管理。一些提供者将失败的连接透明地转移到客户端,其他提供者要求客户端在失败后重新驱动连接序列。这两种方法都可以 100% 兼容 JMS,但都需要不同的应用程序逻辑。

因此,答案是遵守 JMS API 让您非常接近完全可移植,并且所需的移植量取决于传输提供者如何解释规范的部分和/或规范中模棱两可的实现特性的差异.

于 2011-04-13T03:21:54.350 回答
1

开发人员很容易受到诱惑(或有时被要求)在基于 JMS 的应用程序中使用供应商专有功能。在我使用 JMS 的短时间内,我注意到开发人员可能诉诸使用专有 API 的四个原因。

首先,从命名服务获取Destination对象ConnectionFactory并不方便,特别是对于不希望在能够编写应用程序之前花时间学习 JMS 管理命令的 JMS 新手来说。使用供应商专有函数直接创建对象可能更方便DestinationConnectionFactory

其次,JMS 产品通常会提供超出 JMS 规范中定义的服务质量。如果这些服务质量与或相关Session,那么供应商很自然地提供对这些类型的专有操作。简而言之,并非所有专有的服务质量都可以封装在管理对象中。ProducerConsumerset<Name>()

第三,当与 JMS 相关的操作失败时,它会抛出 (subtype of) JMSException。根据异常的性质,应用程序的开发人员可能希望以多种方式之一处理捕获的异常。但是,JMS 规范指出,由 提供的三条信息中有两条JMSException是 JMS 供应商专有的。因此,开发人员在决定如何处理异常时可能需要依赖包含在异常中的供应商专有信息。

最后,JMS 指定消息由三部分组成:(1) 标头字段,(2) 任意属性(即名称=值对),以及 (3) 正文。(2) 的预期用途是支持消费者应用程序中的灵活消息选择。例如,在伦敦运行的生产者应用程序可能会在发送消息之前将location=London添加到消息的属性中。然后,消费者应用程序可以使用消息选择器"(location = 'London')"来确保它只接收具有该属性值的消息。听起来不错。不好的一点是 JMS 规范保留了以开头的属性名称JMS_<vendor>供 JMS 供应商使用,并且一些供应商使用此类属性来指定基于每条消息的专有服务质量。希望使用专有的按消息服务质量的开发人员必须修改生产者应用程序的代码,以便在发送消息之前设置专有属性。

T.Rob 关于主题层次结构的警告是另一个需要警惕的问题。

于 2011-04-21T15:26:39.193 回答
0

WebSphere MQ 是一个非常成熟、稳定的平台——据我所知——它完全符合 JMS 标准。许多组织使用 JMS over MQ 作为他们的传输。我曾在几个同时使用 JMS 和本机 MQ 机制与 MQ 层通信的项目中工作过,我没有遇到任何关于 IBM JMS 实现的抱怨。不过,我还没有与任何更改过 JMS 提供程序的人合作过……

IBM 提供了一堆只引用 javax.jms 包的 Java 库,因此只要您没有让任何供应商特定的增强功能进入您的代码,您应该能够插入 MQ 库以使 MQ 成为您的 JMS提供者。(您可能需要使用 MQ 工具进行一些管理以执行设置 JMS 订阅之类的操作,但是……我没有使用 MQ 的 JMS 方面,只使用了核心库。)

查看此 IBM 页面以获取有关 MQ JMS 库的更多详细信息。

如果您仅使用 WebSphere MQ 作为示例,那么是的,您可能仍需要检查候选供应商是否符合规范,但 JMS 已经存在一段时间了,我认为所有大玩家的产品都将是合适的 JMS 提供商.

于 2011-04-13T05:25:05.580 回答
0

由于 JMS 是一个相对简单的 API(与 JDBC 等相比),它在实现之间保持相当可移植性,前提是您.

至于从 WebSphereMQ 获得更好的性能,我不确定您是否会发现这种情况。如果您使用的是点对点,也许。但如果你在做 Pub/Sub,那是不太可能的。请参阅这个公认的由竞争对手发布的基准 ,但它使用第三方基准,实际上对一些开源参赛者非常慷慨。

于 2011-04-18T19:30:31.297 回答