150

我试图了解什么 JMS 以及它如何连接到 AMQP 术语。我知道 JMS 是一种 API,而 AMQP 是一种协议。

这是我的假设(以及问题)

  • RabbitMQ 使用 AMQP 协议(​​而是实现了 AMQP 协议)
  • Java客户端需要使用AMQP协议客户端库连接/使用RabbitMQ
  • JMS API 在哪里发挥作用?JMS API 应该使用 AMQP 客户端库连接到 RabbitMQ?
  • 通常我们使用 JMS 来连接 RabbitMQ、ActiveMQ 等消息代理。那么这里使用的默认协议是什么而不是 AMQP?

上面的一些可能是愚蠢的。:-) 但试图绕开它。

4

8 回答 8

127

你的问题有点乱,但让我们一一看看。

一般概念:

Java 消息服务(JMS) API 是一种 Java 面向消息的中间件 (MOM) API,用于在两个或多个客户端之间发送消息。JMS 是 Java Platform, Enterprise Edition 的一部分,由 Java Community Process 下开发的规范定义为 JSR 914。它是一种消息传递标准,允许基于 Java Enterprise Edition (Java EE) 的应用程序组件创建、发送、接收和阅读消息。它允许分布式应用程序的不同组件之间的通信是松散耦合、可靠和异步的。

现在(来自维基百科):

高级消息队列协议 (AMQP)是面向消息中间件的开放标准应用层协议。AMQP 的定义特性是消息导向、队列、路由(包括点对点和发布订阅)、可靠性和安全性。

最重要的事情(再次来自维基百科):

与仅定义 API 的 JMS 不同,AMQP 是一种线级协议。线路级协议是对作为八位字节流通过网络发送的数据格式的描述。因此,任何可以创建和解释符合此数据格式的消息的工具都可以与任何其他兼容工具互操作,而与实现语言无关

您应该知道的一些重要事项:

  1. 请记住,AMQP 是一种不实现 JMS API 的消息传递技术。
  2. JMS是API,AMQP是协议。所以说什么是JMS的默认协议是没有意义的,当然客户端应用程序在调用WebLogic Web Service时使用HTTP/S作为连接协议。
  3. JMS 只是一个 API 规范。它不使用任何协议。JMS 提供者(如 ActiveMQ)可以使用任何底层协议来实现 JMS API。例如:Apache ActiveMQ 可以使用以下任何协议:AMQP、MQTT、OpenWire、REST(HTTP)、RSS 和 Atom、Stomp、WSIF、WS Notification、XMPP。我建议您阅读使用 JMS 传输作为连接协议

祝你好运 :)

于 2013-03-01T04:33:26.940 回答
49

让我们从基础开始。

RabbitMQ 是一个 MOM(面向消息的中间件),使用 Erlang(一种面向 TLC 的编程语言)开发并实现了有线协议 AMQP(高级消息队列协议)。目前,许多客户端 API(例如,Java、C++、RESTful 等)可用于启用 RabbitMQ 消息传递服务。

JMS(Java 消息服务)是一个 JCP 标准,它定义了一组由 MOM 实现的结构化 API 。实现(即兼容)JMS API 的 MOM 的一个示例是 ActiveMQ;还有 HornetMQ 等。此类中间件获取 JMS API 并相应地实现交换模式。

根据上述,以 JMS API 的框架、RabbitMQ 的一个实例及其 Java 客户端 API 为例,可以使用 RabbitMQ 开发 JMS 实现:此时唯一要做的就是实现根据 JMS 规范交换模式(通过 RabbitMQ)。

关键是:无论采用何种技术(在本例中为 RabbitMQ),都可以实现一组 API,例如 JMS。

于 2014-10-16T19:10:25.377 回答
16

JMS 在定义时没有定义 JMS 客户端和消息传递服务器之间的协议。实现 JMS API 的 JMS 客户端可以使用任何协议与消息传递服务器进行通信。客户端只需要兼容 JMS api。就这样。通常,JMS 客户端使用其消息传递服务器可以理解的自定义协议。

另一方面,AMQP 是消息传递客户端和消息传递服务器之间的协议。JMS 客户端可以使用 AMQP 作为与消息传递服务器通信的协议。并且有这样的客户可用。

http://www.lshift.net/blog/2009/03/16/openamqs-jms-client-with-rabbitmq-server

于 2013-03-01T05:48:19.807 回答
2
  • JMS API 在哪里发挥作用?JMS API 应该使用 AMQP 客户端库连接到 RabbitMQ?

JMS 是一种 API,因此一些 JMS API 是通过 AMQP 协议(​​如Apache QPID JMS)实现的,而大多数 JMS API 使用其他协议。如果 AMQP 协议的版本相同,那么这样的客户端应该能够与另一个 AMQP 客户端通信。

  • 通常我们使用 JMS 来连接 RabbitMQ、ActiveMQ 等消息代理。那么这里使用的默认协议是什么而不是 AMQP?

这取决于您对该 JMS API 的配置。对于 ActiveMQ,它可以是AMQP,但默认情况下它是“openwire”

于 2017-06-07T10:06:38.967 回答
2

什么是 JMS?

JMS 是一种 Java 标准,它定义了用于处理消息代理的通用 API。

为什么我们需要 JMS?

  1. 它于2001年推出,并在很长一段时间内被用于异步消息传递。

  2. 在 JMS 之前,过去发生的情况是每个消息代理都有一个专有 API,这使得应用程序的消息传递代码在代理之间的可移植性降低

  3. 使用 JMS,所有兼容的实现都可以通过一个通用接口进行处理。因此,如果您将代理说“ Apache Active MQ ”更改为“ Apache ActiveMQ Artemis ”,您不必担心可移植性问题,因为 JMS 接口可确保您的代码可移植性。

JMS 的缺点?

  1. JMS 在 2001 年被定义时并没有在 JMS 客户端和 JMS 消息传递服务器之间强制执行任何协议。JMS 客户端可以使用任何协议进行通信,并且客户端需要确保协议与 JMS API 兼容。
  2. JMS 仅限于 Java 应用程序。

什么是 AMQP?

  1. AMQP(高级消息队列协议)是一种用于传递消息的开放标准应用层协议。
  2. AMQP 0.9.1 于 2008 年 11 月发布。
  3. AMQP 提供了如何构造消息的描述。与 JMS 不同,它不提供有关如何发送消息的 API。

为什么选择 AMQP?

  1. AMQP 只是消息传递客户端和消息传递服务器之间的协议。因此,即使是 JMS 客户端也可以使用 AMQP 作为协议与消息传递服务器进行通信。

  2. AMQP 是一种跨越所有平台的消息传递协议。使用哪个 AMQP 客户端无关紧要,只要是 AMQP 投诉,就会成立。

于 2022-01-18T14:06:13.777 回答
1

JMS 是来自 Sun - Oracle 的 API。
有实现此 API 的驱动程序。对于每种语言和每种消息传递系统,将至少有一个驱动程序。例如,对于 Java + RabbitMQ -> 驱动程序,对于 Java + ActiveMq,对于 C# + RabbitMQ,Go + IBM MQ 等
。AMQP 是一种线级协议,很像 MQTT 或 STOMP 或 Openwire。它不是 API。这带来了两个新的东西:-

  1. 消息系统可能需要一个插件来支持线级协议,例如 ActiveMQ STOMP 插件等。
  2. Driver needs to support the wire level protocol by converting standard JMS API calls to STOMP, aMQP etc calls.
    Finally, thus you can have one driver per -> messaging system + API + wire level protocol
    Java code -> API -> Driver -> wire level protocol -> plugin -> Messaging system
于 2022-01-24T19:14:11.350 回答
0

https://spring.io/understanding/AMQP

AMQP(高级消息队列协议)是一个公开发布的异步消息传输规范。指定传输数据的每个字节。此特性允许库以多种语言编写,并在多个操作系统和 CPU 架构上运行,从而形成真正可互操作的跨平台消息传递标准。

AMQP 经常与 Java 社区中最常见的消息传递系统 JMS(Java 消息服务)进行比较。JMS 的一个限制是指定了 API,但没有指定消息格式。与 AMQP 不同,JMS 对消息的形成和传输方式没有要求。本质上,每个 JMS 代理都可以以不同的格式实现消息。他们只需要使用相同的 API。

于 2017-08-09T15:28:48.153 回答
-1

我怀疑您可能正在寻找此文档,其中部分内容是:

vFabric RabbitMQ 的 JMS 客户端是 vFabric RabbitMQ 的客户端库。vFabric RabbitMQ 不是 JMS 提供程序,但具有支持 JMS 队列和主题消息传递模型所需的功能。RabbitMQ 的 JMS 客户端在 RabbitMQ Java 客户端 API 之上实现了 JMS 1.1 规范,从而允许新的和现有的 JMS 应用程序通过高级消息队列协议 (AMQP) 与 RabbitMQ 代理连接。

于 2014-04-16T14:25:21.373 回答