JMS 和 AMQP-RabbitMQ

我试图理解什么是 JMS,以及它是如何与 AMQP 术语相关联的。 我知道 JMS 是一个 API,AMQP 是一个协议。

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

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

上面的一些可能是愚蠢的。 : ——但是我试着去理解它。

64219 次浏览

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

一般概念:

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

现在 (来自 维基百科) :

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

最重要的是(同样来自维基百科) :

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

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

  1. 请记住,AMQP 是一种不实现 JMSAPI 的消息传递技术。
  2. JMS 是 API,AMQP 是一个协议。所以说什么是 JMS 的默认协议是没有意义的,当然是客户端 应用程序在调用 WebLogic Web 服务。
  3. JMS 只是一个 API 规范。它不使用任何协议。JMS 提供程序(如 ActiveMQ)可以使用任何底层协议来 实现 JMSAPI。例如: ApacheActiveMQ 可以使用任何 以下协议: AMQP、 MQTT、 OpenWire、 REST (HTTP)、 RSS 和 Atom, Stomp,WSIF,WS Notification,XMPP。我建议您阅读 < a href = “ http://docs.oracle.com/cd/E13222 _ 01/wls/docs103/webserv _ adv _ rpc/jmstransport.html # wp244314”rel = “ noReferrer”> Use 作为连接协议的 JMS 传输 .

祝你好运

在定义 JMS 时,它没有定义 JMS 客户机和消息传递服务器之间的协议。实现 JMS API 的 JMS 客户机可以使用任何协议与消息传递服务器通信。客户机只需要遵从 JMSapi。仅此而已。通常,JMS 客户机使用其消息传递服务器能够理解的自定义协议。

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

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

我怀疑你可能在寻找 这份文件,它在某种程度上说:

用于 vFabric 的 JMS 客户端 RabbitMQ 是用于 vFabric 的客户端库 VFabric RabbitMQ 不是 JMS 提供者,但具有一些特性 需要支持 JMS Queue 和 Topic 消息传递模型 For RabbitMQ 实现了 JMS 1.1规范 RabbitMQJava 客户端 API,从而允许新的和现有的 JMS 应用程序通过高级消息与 RabbitMQ 代理连接 排队协议(AMQP)。

让我们从基础开始。

RabbitMQ 是个妈妈(面向消息的中间件) ,使用 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)。

关键是: 一组 API,比如 JMS,可以在任何技术情况下实现(在本例中是 RabbitMQ)。

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

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

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

这取决于您对那个 JMSAPI 的配置。对于 ActiveMQ,它可以是 AMQP,但默认情况下它是‘ openwire’

Https://spring.io/understanding/amqp

AMQP (高级消息队列协议)是一种公开发布的连接 异步消息传递规范。传输的每个字节 这个特性允许写入库 并且可以在多种操作系统和 CPU 上运行 架构,这使得一个真正的互操作性,跨平台 信息传递标准。

AMQP 通常与最常见的 JMS (JavaMessageService)相比较 在 Java 社区中使用消息传递系统 指定了 API,但没有指定消息格式, JMS 对消息的形成和传输方式没有要求。 实际上,每个 JMS 代理都可以在 不同的格式。他们只是必须使用相同的 API。

JMS 是什么?

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

我们为什么需要 JMS?

  1. 它是在 二零零一年 中引入的,并在很长一段时间内被用于异步消息传递。

  2. 在 JMS 出现之前,每个消息代理都有一个专有的 API,这使得应用程序的消息代码在代理 之间的可移植性降低。

  3. 使用 JMS,所有兼容的实现都可以通过公共 接口。因此,如果将代理从“ Apache 活动 MQ”更改为“ ApacheActiveMQ 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 投诉,它就会持有。

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

  1. 消息系统可能需要一个插件来支持线路级协议,例如 ActiveMQ STOMP 插件等。
  2. 驱动程序需要通过将标准 JMSAPI 调用转换为 STOMP、 aMQP 等调用来支持线路级协议。
    最后,因此您可以有一个驱动程序每-> 消息传递系统 + API + 线路级协议
    Java 代码-> API-> Driver-> wire level protocol-> plugin-> Messaging system