以下是我的假设(以及问题):
- RabbitMQ使用AMQP协议(实现了AMQP协议)
- Java客户端需要使用AMQP协议客户端库来连接/使用RabbitMQ
- JMS API在这里扮演了什么角色?JMS API应该使用AMQP客户端库来连接到RabbitMQ吗?
- 通常我们使用JMS来连接消息代理,如RabbitMQ、ActiveMQ等。那么在这里使用的默认协议是什么,而不是AMQP?
你的问题有点混乱,但我们逐个看一下。
总体概念:
Java消息服务(JMS)API是用于在两个或多个客户端之间发送消息的Java面向消息的中间件(MOM)API。 JMS是Java平台企业版的一部分,并由Java社区过程根据JSR 914开发的规范进行定义。它是一种允许基于Java企业版(Java EE)的应用程序组件创建、发送、接收和读取消息的消息标准。它允许分布式应用程序的不同组件之间的通信松散耦合、可靠和异步。
现在(来自维基百科):
高级消息队列协议(AMQP)是一种用于面向消息的中间件的开放标准应用层协议。 AMQP的定义特性是消息定向、排队、路由(包括点对点和发布-订阅)、可靠性和安全性。
最重要的事情(再次来自维基百科):
与仅定义API的JMS不同,AMQP是一种线路级协议。线路级协议是对作为八位字节流通过网络发送的数据格式的描述。因此,任何能够创建和解释符合该数据格式的消息的工具都可以与任何其他符合工具互操作,无论实现语言如何。 请记住,AMQP是一种消息传递技术,不实现JMS API。让我们从基础开始。
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)。
http://www.lshift.net/blog/2009/03/16/openamqs-jms-client-with-rabbitmq-server
JMS是一个Java标准,定义了与消息代理一起工作的公共API。
JMS于2001年推出并被采用了很长时间作为异步消息传递的方法。
在JMS之前,每个消息代理都有自己的专有API,使得应用程序的消息传递代码在不同的代理之间难以移植。
使用JMS,所有符合规范的实现都可以通过一个公共接口进行操作。因此,如果您将代理从“Apache Active MQ”更改为“Apache ActiveMQ Artemis”,则不必担心可移植性问题,因为JMS接口确保了您的代码可移植性。
AMQP只是一个消息客户端和消息服务器之间的协议。因此,即使是JMS客户端也可以使用AMQP作为与消息服务器通信的协议。
AMQP是跨所有平台的消息协议。无论使用哪个AMQP客户端,只要它符合AMQP规范,就可以使用。
JMS是一个API,因此一些JMS API是通过AMQP协议实现的(例如Apache QPID JMS),而大多数JMS API则使用其他协议。如果AMQP协议版本相同,则此类客户端应能够与另一个AMQP客户端通信。
这取决于您配置的JMS API。对于ActiveMQ,它可以是AMQP,但默认情况下是“openwire”。
https://spring.io/understanding/AMQP
AMQP(高级消息队列协议)是一种开放的异步消息传递的线路规范。每个传输数据的字节都有明确的规定。这种特性使得可以使用多种语言编写库,并在多个操作系统和CPU架构上运行,从而实现真正的互操作性、跨平台的消息标准。我猜你可能在寻找这份文档,其中部分内容如下:
vFabric RabbitMQ的JMS客户端是vFabric RabbitMQ的客户端库。vFabric RabbitMQ不是JMS提供程序,但具有支持JMS队列和主题消息模型所需的功能。RabbitMQ的JMS客户端实现了JMS 1.1规范,建立在RabbitMQ Java客户端API之上,从而允许新的和现有的JMS应用程序通过高级消息队列协议(AMQP)与RabbitMQ代理连接。