Java消息队列抽象

时间:2016-05-10 20:29:41

标签: java jms message-queue amqp

我对Java很新,目前正在使用一些基于Dropwizard的微服务和Java8 SE编写Web应用程序。我现在想要在服务之间集成Message Queue for Async通信,并希望从使用像Amazon SQS这样的基于云的队列开始。但是,我不想将自己锁定到特定的云提供商,因此希望能够轻松切换到其他提供商或稍后使用RabbitMQ或ActiveMQ等选项。所以我的问题是,Java中是否有允许这样的框架?例如,使用Hibernate,我可以通过简单的配置更改在数据库之间切换,是否有等效的消息队列?

我花了相当多的时间研究这个问题,但是到目前为止,我已经找不到任何确定的答案;

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

3 个答案:

答案 0 :(得分:1)

java世界中的JMS是通过队列生成/消除消息的最常见API之一。使用JMS时,您可以自由使用任何JMS提供程序(activeMQ,rabbitMQ ...),如果不对您的提供程序进行任何直接调用(仅调用JMS API),您可以轻松地从一个提交到另一个。

为了使消息能够从生产者那里传播给消费者,您需要一个代理(一个可以处理它们的软件)。经纪人可以托管在专用服务器上或嵌入您的应用程序中(我不推荐第二种选择)。

AMQP是一种更新的协议,属于线路级别。一些经纪人能够同时处理AMQP和JMS。

AMQP和JMS都可以为您提供体面的抽象。然而,他们都有自己的极限。一方面使用JMS,您可能会尝试使用某些功能/精细配置调优,然后由于一组特定的行为,您可能会变为依赖于实现。另一方面,AMPQ给出了您选择的AMQP版本(0.9或1.0+),您可能只能选择少数几个代理,因为这些版本差异很大,目前大多数代理只支持其中一个

答案 1 :(得分:1)

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

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

从我所看到的亚马逊确实提供了JMS实现,文档here似乎很好地涵盖了它。

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

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

答案 2 :(得分:0)

如果您正在寻找JMS 2.0,请仔细检查您的提供商,有些 - 即ActiveMQ - 仅支持JMS 1.1。