JMS和AMQP-RabbitMQ


133

我试图了解什么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

我不知道是谁编辑了我的答案,并给出了这个不正确的观点,该观点在第3点。因为我已经问过凯文在第2点所说的话。在拒绝投票或提出建议之前,请务必仔细阅读
怪胎

1
看一下本文的JMS部分。它有一个非常详细的解释saipraveenblog.wordpress.com/2014/12/08/...
java_geek

Answers:


118

您的问题有点混乱,类似于试卷中的一个棘手问题:)(由于老师总是试图问一些简单的问题,使复杂的:DI希望您不是老师:))让我们一个个地查看所有这些问题。

如你所知:

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

现在(来自Wikipedia):

高级消息队列协议(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传输作为连接协议

祝好运 :)


20
I am not sure but I believe that AMQP also uses HTTP/S protocol but AMQP is enhacement is messaging protocol over HTTP不。那是不正确的。 JMS uses simple HTTP but for RabbitMQ/ActiveMq, they uses enhanced protocol.不。那是不正确的。JMS只是API规范。它不使用任何协议。JMS提供程序(如ActiveMQ)可以使用任何基础协议来实现JMS API。例如:Apache ActiveMQ可以使用以下任何协议:AMQP,MQTT,OpenWire,REST(HTTP),RSS和Atom,Stomp,WSIF,WS Notification,XMPP。
2020年

我已经编辑了答案。现在,有争议的部分已被替换。
怪胎

1
@brainOverflow我不知道是谁编辑了我的答案,并给出了这个不正确的观点,该观点是在数字3。.因为我已经问过您在第2点所说的话。在拒绝投票或提出建议之前,请务必仔细阅读
怪胎

我已经从该PDF中添加了内容,因此您也可以转到其他一些链接
Freak 2015年

43

让我们从基础开始。

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


TLC代表什么?
mvmn

@mvmm TLC代表电信。请看[1]。[1] allacronyms.com/TLC/Telecommunication
Paolo

15

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



0

https://spring.io/understanding/AMQP

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

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


-1

我怀疑您可能正在寻找这份说明,其中部分内容是:

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


不。它不是我正在看的那个。但是类似。
Kevin Rave 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.