Java 消息队列抽象
Java Message Queue Abstraction
我是 Java 的新手,目前正在使用许多基于 Dropwizard 的微服务和 Java8 SE 编写 Web 应用程序。我现在想为服务之间的异步通信集成消息队列,并希望从使用基于云的队列(如 Amazon SQS)开始。但是,我不想将自己锁定在特定的云提供商中,因此希望可以选择轻松切换到另一个提供商或稍后使用 RabbitMQ 或 ActiveMQ 之类的东西。所以我的问题是,Java 中是否有允许这样做的框架?例如,使用 Hibernate,我可以通过简单的配置更改在数据库之间切换,消息队列是否有等效项?
我已经花了很多时间研究这个问题,但到目前为止我还没有找到明确的答案;
- JMS,这看起来有点像我想要的,但看起来只在 Java EE 版本中可用并且可能需要应用服务器?对吗?
- AMQP,这看起来像是消息队列互操作性的低级协议。还有 Apache Qpid Proton,它看起来像一个纯 AMQP 消息库,但 Java 的所有文档和示例似乎都使用 JMS。
- 我能找到的针对特定 MQ(Rabbit 等)的所有教程都使用那些特定于队列的客户端库。
- 显然,我可以添加自己的抽象层,但不想重新发明轮子,而且我怀疑我不是第一个想要这样做的开发人员。
java 世界中的 JMS 是最常见的 API 之一,用于 producing/consumming 消息队列。使用 JMS 时,您可以自由使用任何 JMS 提供程序(activeMQ、rabbitMQ ...),如果不直接调用您的提供程序(仅调用 JMS API),您可以轻松地从一个提供程序切换到另一个提供程序.
为了让消息从生产者传输到消费者,您需要一个代理(一个可以处理它们的软件)。经纪人可以托管在专用服务器上或嵌入到您的应用程序中(我不推荐第二个选项)。
AMQP 是一个较新的协议,是有线级别的。一些代理能够同时处理 AMQP 和 JMS。
AMQP 和 JMS 都可以为您提供体面的抽象。然而,它们都有其局限性。一方面,对于 JMS,您可能会想使用一些 feature/fine 配置调整,然后由于一组特定的行为,您可能变得依赖于实现。另一方面,对于 AMPQ,给定您选择的 AMQP 版本(0.9 或 1.0+),您可能只能 select 几个代理,因为这些版本差异很大,目前大多数代理只支持一个其中
正如 Hibernate 或 JDBC 允许您在不同的数据库提供者之间切换一样,JMS API 允许您随意在消息代理或消息提供者之间切换而不会破坏您提供的代码您没有在代码中使用任何特定的供应商扩展。
JMS 只是一个 API,没有 JMS 协议,只有 API 各种供应商实施并为您提供一个客户端以与他们的消息提供程序一起使用。您可以使用 Java 8 代码中的 JMS API 就好了,您只需要使用您碰巧与客户端一起选择的任何构建管理工具来拉入 JMS API jar来自您当时碰巧使用的供应商的 jar。要查看如何获取 JMS API jar 的 Apache 许可版本,请参阅此 question.
的答案
据我所知,Amazon 确实提供了 JMS 实现,文档 here 似乎涵盖得很好。
当您决定切换到其他消息传递产品(例如 ActiveMQ 或 RabbitMQ)时,每个消息传递产品都提供了 JMS 实现,允许您换出客户端而不需要更改任何现有代码(同样前提是您不这样做) t 使用任何供应商扩展)。如果您切换到提供 AMQP 1.0 支持的消息传递解决方案,那么 Apache Qpid 项目 here.
提供的基于 AMQP 1.0 实现的 JMS
我认为您需要花一些时间阅读 JMS 规范和一些教程,以了解什么是 JMS 以及如何利用 JMS 和 JNDI 创建与提供程序无关的代码。
如果您正在寻找 JMS 2.0,请仔细检查您的供应商,有些 - 即 ActiveMQ - 仅支持 JMS 1.1。
我是 Java 的新手,目前正在使用许多基于 Dropwizard 的微服务和 Java8 SE 编写 Web 应用程序。我现在想为服务之间的异步通信集成消息队列,并希望从使用基于云的队列(如 Amazon SQS)开始。但是,我不想将自己锁定在特定的云提供商中,因此希望可以选择轻松切换到另一个提供商或稍后使用 RabbitMQ 或 ActiveMQ 之类的东西。所以我的问题是,Java 中是否有允许这样做的框架?例如,使用 Hibernate,我可以通过简单的配置更改在数据库之间切换,消息队列是否有等效项?
我已经花了很多时间研究这个问题,但到目前为止我还没有找到明确的答案;
- JMS,这看起来有点像我想要的,但看起来只在 Java EE 版本中可用并且可能需要应用服务器?对吗?
- AMQP,这看起来像是消息队列互操作性的低级协议。还有 Apache Qpid Proton,它看起来像一个纯 AMQP 消息库,但 Java 的所有文档和示例似乎都使用 JMS。
- 我能找到的针对特定 MQ(Rabbit 等)的所有教程都使用那些特定于队列的客户端库。
- 显然,我可以添加自己的抽象层,但不想重新发明轮子,而且我怀疑我不是第一个想要这样做的开发人员。
java 世界中的 JMS 是最常见的 API 之一,用于 producing/consumming 消息队列。使用 JMS 时,您可以自由使用任何 JMS 提供程序(activeMQ、rabbitMQ ...),如果不直接调用您的提供程序(仅调用 JMS API),您可以轻松地从一个提供程序切换到另一个提供程序.
为了让消息从生产者传输到消费者,您需要一个代理(一个可以处理它们的软件)。经纪人可以托管在专用服务器上或嵌入到您的应用程序中(我不推荐第二个选项)。
AMQP 是一个较新的协议,是有线级别的。一些代理能够同时处理 AMQP 和 JMS。
AMQP 和 JMS 都可以为您提供体面的抽象。然而,它们都有其局限性。一方面,对于 JMS,您可能会想使用一些 feature/fine 配置调整,然后由于一组特定的行为,您可能变得依赖于实现。另一方面,对于 AMPQ,给定您选择的 AMQP 版本(0.9 或 1.0+),您可能只能 select 几个代理,因为这些版本差异很大,目前大多数代理只支持一个其中
正如 Hibernate 或 JDBC 允许您在不同的数据库提供者之间切换一样,JMS API 允许您随意在消息代理或消息提供者之间切换而不会破坏您提供的代码您没有在代码中使用任何特定的供应商扩展。
JMS 只是一个 API,没有 JMS 协议,只有 API 各种供应商实施并为您提供一个客户端以与他们的消息提供程序一起使用。您可以使用 Java 8 代码中的 JMS API 就好了,您只需要使用您碰巧与客户端一起选择的任何构建管理工具来拉入 JMS API jar来自您当时碰巧使用的供应商的 jar。要查看如何获取 JMS API jar 的 Apache 许可版本,请参阅此 question.
的答案据我所知,Amazon 确实提供了 JMS 实现,文档 here 似乎涵盖得很好。
当您决定切换到其他消息传递产品(例如 ActiveMQ 或 RabbitMQ)时,每个消息传递产品都提供了 JMS 实现,允许您换出客户端而不需要更改任何现有代码(同样前提是您不这样做) t 使用任何供应商扩展)。如果您切换到提供 AMQP 1.0 支持的消息传递解决方案,那么 Apache Qpid 项目 here.
提供的基于 AMQP 1.0 实现的 JMS我认为您需要花一些时间阅读 JMS 规范和一些教程,以了解什么是 JMS 以及如何利用 JMS 和 JNDI 创建与提供程序无关的代码。
如果您正在寻找 JMS 2.0,请仔细检查您的供应商,有些 - 即 ActiveMQ - 仅支持 JMS 1.1。