【问题标题】:JMS and AMQP - RabbitMQJMS 和 AMQP - RabbitMQ
【发布时间】:2013-02-15 12:08:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • @KevinRave:所选答案在某些要点上是错误的。我添加了一条评论,以便您查看。
  • @KevinRave 我已经编辑了答案。现在有争议的部分已被替换。现在整个答案完全没问题
  • 我不知道是谁编辑了我的答案并在第 3 点给出了这个不恰当的观点。因为我已经问过凯文在第 2 点所说的话。在投票或制作之前务必仔细阅读建议
  • 查看本文中的 JMS 部分。有很详细的解释saipraveenblog.wordpress.com/2014/12/08/…

标签: java jms rabbitmq message-queue amqp


【解决方案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 -> 驱动程序 -> 线级协议 -> 插件 -> 消息系统

【讨论】:

    【解决方案2】:

    什么是 JMS?

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

    为什么我们需要 JMS?

    1. 它是在 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投诉就成立。

    【讨论】:

      【解决方案3】:

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

      一般概念:

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

      现在(来自Wikipedia):

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

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

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

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

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

      祝你好运:)

      【讨论】:

      • 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。
      • 我已经编辑了答案。现在有争议的部分已被替换。
      • @brainOverflow 我不知道是谁编辑了我的答案并在第 3 点给出了这个不恰当的点。因为我已经问过你在第 2 点所说的事情。在投票或否决之前务必仔细阅读提出建议
      • 我已经从那个 PDF 添加了一些东西,所以你也可以去其他一些链接
      • AMQP 不是线级协议。维基百科错了,天哪,谁会重蹈覆辙
      【解决方案4】:

      https://spring.io/understanding/AMQP

      AMQP(高级消息队列协议)是一种公开发布的线路 异步消息传递规范。传输的每个字节 数据被指定。此特性允许编写库 支持多种语言,可在多种操作系统和 CPU 上运行 架构,这使得真正可互操作的跨平台 消息传递标准。

      AMQP 常被比作 JMS(Java Message Service),最常见的 Java 社区中的消息传递系统。 JMS 的一个限制是 指定了 API,但未指定消息格式。与 AMQP 不同, JMS 对消息的形成和传输方式没有要求。 本质上,每个 JMS 代理都可以在一个 不同的格式。他们只需要使用相同的 API。

      【讨论】:

        【解决方案5】:
        • 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'

        【讨论】:

          【解决方案6】:

          让我们从基础开始。

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

          关键是:无论采用何种技术,都可以实现一组 API,例如 JMS(在本例中为 RabbitMQ)。

          【讨论】:

          【解决方案7】:

          我怀疑您可能正在寻找 this documentation,其中部分内容是:

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

          【讨论】:

          • 不。它不是我正在看的那个。但类似。
          【解决方案8】:

          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

          【讨论】:

            猜你喜欢
            • 2021-08-18
            • 2012-09-09
            • 2013-03-07
            • 2011-06-13
            • 2018-07-24
            • 2023-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多