没有队列的 JMS

Posted

技术标签:

【中文标题】没有队列的 JMS【英文标题】:JMS without a queue 【发布时间】:2014-03-13 14:59:00 【问题描述】:

我不是 JMS 专家,最近在我的项目中遇到了一种情况,他们希望使用 JMS 在应用程序之间进行通信。是否可以在没有 Websphere MQ / TIBCO EMS 等底层 MQ 软件的情况下使用 JMS 进行异步通信。我的想法是,就像我们使用 JDBC API 与底层的物理数据库产品(如 Oracle/DB2 DB)对话一样,我们将使用 JMS 与物理队列对话。但是我的团队只说 JMS 而没有队列。谁能帮我理解?我们使用Websphere 6.0服务器,使用spring框架。

提前致谢。

【问题讨论】:

Websphere Application Server 有内部队列(我猜他们将其命名为默认队列)并且他们有自己的 JMS 实现(甚至不是相同的 Websphere MQ 的 JMS 实现)。也许您的团队正计划使用它,所以有专用的 MQ 服务器。 【参考方案1】:

你是对的:JMS 只是一个接口,它不包含任何实现。与 JDBC 的比较非常合适。

使用 JMS 时,您始终需要 JMS 提供程序。提供者是 JMS 实现,它与面向消息的中间件接口。

大多数应用程序服务器都内置了 JMS 提供程序,因此您的团队可能打算在没有外部提供程序的情况下使用 JMS。

【讨论】:

【参考方案2】:

是否可以在没有 Websphere MQ / TIBCO EMS 等底层 MQ 软件的情况下使用 JMS 进行异步通信

这毫无意义。需要注意的几点 -

    JMS 只是specs。根据规范,您可以将其想象为一组 API/接口/方法签名和管理规则。 有各种组织/公司提供这些 API 的实现。Apache 的 ActiveMQ、IBM 的 Websphere MQ 或 TIBCO EMS 就是其中的一些示例。 现在,当您说我想使用 JMS 时,您需要一个兼容 JMS 的服务器,即理解规范制定的规则的服务器。这通常称为 MQ 服务器,由提供商提供。

我的想法是,就像我们使用 JDBC API 与底层的物理数据库产品(如 Oracle/DB2 DB)对话一样,我们将使用 JMS 与物理队列对话。但是我的团队说只有 JMS,没有队列

这里有两点需要注意。当您说您想使用数据库和 JDBC API 进行通信时,JMS 根本就没有出现。请理解为什么使用 JMS。简而言之,它用于在两个解耦的系统之间传输消息。 JMS 服务器使用什么存储类型(如果它是可配置的)将取决于提供者。通常都有 DB 存储类型,并且可以配置为使用您的 DB。

Next JMS 有两种类型的通信 - PTP(peer to peer) 使用 queuesPUBSUB(publish subscribe) 使用 Topics。当您说您正在使用 JMS 时,一切都归结为这两个中的任何一个以及它的一些变体。现在,当您说没有队列的 JMS 时,您的团队可能意味着使用 PUBSUB。但同样,这不是您随机决定并在您的应用程序中使用它的东西。这个决定是根据您的要求做出的,因为它们的行为不同。

【讨论】:

【参考方案3】:

首先,您需要队列/主题才能使用 JMS。

第二(您的团队可能意味着不使用 WebSphere MQ,因为我的团队也在说同样的话)

IBM红皮书中的这张图将完全回答您的问题(与WS6相同):

http://www.redbooks.ibm.com/redbooks/pdfs/sg247770.pdf 第 4 页。

您将使用的可能是 WebSphere Default Messaging Provider。

【讨论】:

以上是关于没有队列的 JMS的主要内容,如果未能解决你的问题,请参考以下文章

JMS队列中没有负载时消费者数量不减少

替换 jms 队列中的消息

SOA 组合未从 JMS 队列中读取

JMS 队列上多线程消息处理的最佳实践

远程 JMS 队列的客户端

获取Weblogic中JMS队列处理的消息的历史记录