JMS和AMQP - RabbitMQ

154
我试图理解JMS及其与AMQP术语的关系。我知道JMS是一个API,而AMQP是一种协议。
以下是我的假设(以及问题):
  • RabbitMQ使用AMQP协议(实现了AMQP协议)
  • Java客户端需要使用AMQP协议客户端库来连接/使用RabbitMQ
  • JMS API在这里扮演了什么角色?JMS API应该使用AMQP客户端库来连接到RabbitMQ吗?
  • 通常我们使用JMS来连接消息代理,如RabbitMQ、ActiveMQ等。那么在这里使用的默认协议是什么,而不是AMQP?
以上有些可能很愚蠢。:-) 但我正在努力理解它。

3
@KevinRave:选定的答案在某些关键点上有误。我已经添加了一条评论,以便您可以查看。 - 2020
@KevinRave 我已经编辑了答案。现在有争议的部分已经被替换了。现在整个答案完全没问题了。 - Freak
我不知道是谁编辑了我的答案并给出了这个不当的排名,它在第三位...因为我已经问过了凯文在第二点所说的事情。在投票或提出建议之前,请仔细阅读。 - Freak
1
请查看本文中的JMS部分。它有非常详细的解释http://saipraveenblog.wordpress.com/2014/12/08/asynchronous-communication-in-soamsa/。 - java_geek
RabbitMQ教程 - https://jstobigdata.com/rabbitmq/complete-rabbitmq-tutorial-in-java/ - SyntaX
8个回答

131

你的问题有点混乱,但我们逐个看一下。

总体概念:

Java消息服务(JMS)API是用于在两个或多个客户端之间发送消息的Java面向消息的中间件(MOM)API。 JMS是Java平台企业版的一部分,并由Java社区过程根据JSR 914开发的规范进行定义。它是一种允许基于Java企业版(Java EE)的应用程序组件创建、发送、接收和读取消息的消息标准。它允许分布式应用程序的不同组件之间的通信松散耦合、可靠和异步

现在(来自维基百科):

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

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

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

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

22
我不确定,但我认为AMQP也使用HTTP/S协议,但是AMQP是在HTTP上增强的消息传递协议。:不对,那是不正确的。 JMS使用简单的HTTP,但是对于RabbitMQ / ActiveMq,它们使用增强的协议。:不对,那是不正确的。 JMS只是API规范,并不使用任何协议。JMS提供者(例如ActiveMQ)可以使用任何底层协议来实现JMS API。例如:Apache ActiveMQ可以使用以下任意一种协议:AMQP,MQTT,OpenWire,REST(HTTP),RSS和Atom,Stomp,WSIF,WS Notification,XMPP。 - 2020
我已经编辑了答案。现在有争议的部分已经被替换了。 - Freak
1
@brainOverflow,我不知道是谁编辑了我的答案并给了这个不当的排名,它在第3位...因为我已经问过你在第2点所说的事情。在投票或提出建议之前,请仔细阅读。 - Freak
我已经添加了那个PDF中的内容,所以你也可以去其他链接。 - Freak
AMQP不是一种线级协议。维基百科错了,天哪,谁会想到呢。 - niken

50

让我们从基础开始。

RabbitMQ 是一个消息导向中间件(Message Oriented Middleware),使用 Erlang(一种面向事务处理的编程语言)开发,并实现 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)。

关键在于:一组 API(如 JMS)可以不受技术限制进行实现(在本例中是 RabbitMQ)。


TLC代表什么? - mvmn
@mvmm TLC代表电信。请查看[1]。[1] https://www.allacronyms.com/TLC/Telecommunication - Paolo Maresca

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


2

JMS是什么?

JMS是一个Java标准,定义了与消息代理一起工作的公共API。

为什么需要JMS?

  1. JMS于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规范,就可以使用。


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”。


1
JMS是Sun-Oracle公司提供的API。有一些实现了这个API的驱动程序,每种语言和消息系统都至少有一个驱动程序,例如:Java + RabbitMQ -> 驱动程序,Java + ActiveMq,C# + RabbitMQ,Go + IBM MQ等。
AMQP是一种类似于MQTT、STOMP或Openwire的电线协议,它不是API。这引出了两个新的问题:
  1. 消息系统可能需要插件来支持电线协议,例如:ActiveMQ STOMP插件等。
  2. 驱动程序需要通过将标准JMS API调用转换为STOMP、aMQP等调用来支持电线协议。
最终,这样就可以有一个驱动程序用于消息系统+API+电线协议
Java代码-> API->驱动程序->电线协议->插件->消息系统

0

https://spring.io/understanding/AMQP

AMQP(高级消息队列协议)是一种开放的异步消息传递的线路规范。每个传输数据的字节都有明确的规定。这种特性使得可以使用多种语言编写库,并在多个操作系统和CPU架构上运行,从而实现真正的互操作性、跨平台的消息标准。
AMQP通常与JMS(Java消息服务)进行比较,后者是Java社区中最常见的消息系统。JMS的局限在于API被指定,但消息格式没有被指定。与AMQP不同,JMS没有对消息如何形成和传输提出要求。基本上,每个JMS代理都可以以不同的格式实现消息。他们只需要使用相同的API即可。

-1

我猜你可能在寻找这份文档,其中部分内容如下:

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


不是我在找的那个,但很相似。 - Kevin Rave

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