JMS和AMQP - RabbitMQ

问题

我试图了解JMS及其与AMQP术语的关联方式。我知道JMS是一个API,而AMQP是一个协议。

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

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

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


#1 热门回答(86 赞)

你的问题有点混乱,在问题文件中类似于一个棘手的问题:)(因为老师总是试图提出复杂的简单问题:D我希望你不是老师:))让我们逐一看到所有这些问题。

如你所知:

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

现在(fromWikipedia):

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

而最重要的事情(再次来自维基百科):

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

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

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

祝你好运 :)


#2 热门回答(30 赞)

让我们从基础开始吧。

Rabbit MQ是一个MOM(面向消息的中间件),使用Erlang(面向TLC的编程语言)和586969996开发,实现了有线协议AMQP(高级消息队列协议)。目前,许多客户端API(例如,Java,C,RESTful等)可用于实现RabbitMQ消息传递服务的使用。

JMS(Java消息传递服务)是定义由MOM实现的一组结构化API**的JCP标准。实现(即兼容)JMS API的MOM的一个例子是ActiveMQ;还有HornetMQ和其他人。这些中间件获取JMS API并相应地实现交换模式。

根据上面的内容,采用JMS API的框架,RabbitMQ及其Java客户端API的实例,可以开发一个使用RabbitMQ的JMS实现:在这一点上,唯一需要做的就是实现根据JMS规范交换模式(通过RabbitMQ)。

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


#3 热门回答(14 赞)

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