Java消息队列抽象

标签 java jms message-queue amqp

我对 Java 相当陌生,目前正在使用一些基于 Dropwizard 的微服务和 Java8 SE 编写一个 Web 应用程序。我现在想要集成一个消息队列以实现服务之间的异步通信,并希望首先使用基于云的队列(例如 Amazon SQS)。然而,我不想将自己锁定在特定的云提供商,因此希望可以轻松切换到另一个提供商或稍后使用 RabbitMQ 或 ActiveMQ 之类的东西。所以我的问题是,Java 中是否有一个框架允许这样做?例如,使用 Hibernate,我可以通过简单的配置更改在数据库之间切换,是否有消息队列的等效项?

我花了相当多的时间研究这个问题,但到目前为止我发现还没有找到明确的答案;

  • JMS,这看起来有点像我想要的,但看起来只在 Java EE 版本中可用,并且可能需要应用程序服务器?这是正确的吗?
  • AMQP,它看起来像是一个用于消息队列互操作性的低级协议(protocol)。还有 Apache Qpid Proton,它看起来像一个纯 AMQP 消息库,但所有 Java 文档和示例似乎都使用 JMS。
  • 我能找到的针对特定 MQ(Rabbit 等)的所有教程都使用这些队列特定客户端库。
  • 显然,我可以添加自己的抽象层,但不想重新发明轮子,而且我怀疑我不是第一个想做这样的事情的开发人员。

最佳答案

正如 Hibernate 或 JDBC 允许您在不同的数据库提供程序之间切换一样,JMS API 允许您随意在消息代理或消息提供程序之间切换,而不会破坏您的代码,前提是您没有在您的应用程序中使用任何特定的供应商扩展。代码。

JMS 只是一个 API,没有 JMS 协议(protocol),只有各个供应商实现的 API,并为您提供与他们的消息传递提供程序一起使用的客户端。您可以在 Java 8 代码中使用 JMS API,只需使用您碰巧选择的任何构建管理工具以及您当时使用的供应商提供的客户端 jar 来引入 JMS API jar 。要了解如何获取 Apache 许可版本的 JMS API jar,请参阅此问题的答案 question .

据我所知,Amazon 确实提供了 JMS 实现,文档 here似乎很好地覆盖了它。

当您决定切换到另一个消息传递产品(例如 ActiveMQ 或 RabbitMQ)时,每个产品都提供 JMS 实现,允许您换出客户端,而无需更改任何现有代码(同样,前提是您不使用任何供应商扩展)。如果您切换到提供 AMQP 1.0 支持的消息传递解决方案,那么 Apache Qpid 项目 here 提供了基于 AMQP 1.0 的 JMS 实现。 .

我认为您需要花一些时间阅读 JMS 规范和一些教程,以了解 JMS 是什么以及如何利用 JMS 和 JNDI 创建与提供程序无关的代码。

关于Java消息队列抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148376/

相关文章:

java.lang.NoSuchFieldError : DEFAULT_INCOMPATIBLE_IMPROVEMENTS

java - 在数据库中保留动态数据以供工作流执行

java - 使用 ActiveMQ 创建持久主题和订阅者 spring boot jms

c++ - PocketPC c++ windows消息处理递归问题

java - Jersey :com.sun.jersey.server.impl.template.ViewableMessageBodyWriter

java - 使用 sendkeys 进行 Selenium 上传不起作用 - 因为上传前有一个弹出窗口

java - DOM 解析器错误的 childNodes 计数

Java内部消息队列/JMS

azure - 消息队列触发器在可扩展性方面是否比 Http 触发器更好?

message-queue - 在Kubernetes中,如何根据队列大小自动缩放?