JMS和AMQP – RabbitMQ

我想了解JMS以及它如何连接到AMQP术语。 我知道JMS是一个API,AMQP是一个协议。

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

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

上面的一些可能是愚蠢的。 :-)但试图把我的头围绕它。

你的问题有点混乱,在一个问题论文中类似一个棘手的问题:)(因为老师总是试图提出简单的问题,使复杂:DI希望你不是老师:))让我们看看所有这些一个一个。

如你所知:

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

现在 (来自Wikipedia ):

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

而最重要的事情(再次从维基百科):

与仅仅定义API的JMS不同,AMQP是一个有线协议。 有线协议是对通过networking作为八位字节stream发送的数据格式的描述。 因此,任何可以创build和解释符合该数据格式的消息的工具都可以与任何其他兼容的工具进行互操作,而不考虑实现语言

一些重要的事情你应该知道:

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

祝你好运 :)

我们从基础开始。

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

关键是: 不pipe是什么技术 (在这种情况下,RabbitMQ) ,都可以实现一套API,比如JMS

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

我对JMS和AMQP有类似的问题。 这里的讨论回答了这些问题。 spring.io的这个链接也很好地解释了它,值得一看,因此共享…

了解AMQP

  • JMS API在这里发挥了什么作用? JMS API应该使用AMQP客户端库连接到RabbitMQ?

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

  • 通常我们使用JMS来连接Message Broker,比如RabbitMQ,ActiveMQ等等。那么这里使用的是默认的协议,而不是AMQP?

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

https://spring.io/understanding/AMQP

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

AMQP通常与Java社区中最常见的消息系统JMS(Java消息服务)相比较。 JMS的限制是指定了API,但消息格式不是。 与AMQP不同,JMS不需要如何形成和传输消息。 实质上,每个JMS代理都可以以不同的格式实现这些消息。 他们只需要使用相同的API。

我怀疑你可能正在寻找这个文件 ,其中部分说:

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