2013-03-01 150 views
103

我想了解什麼JMS以及它如何連接到AMQP術語。 我知道JMS是一個API,AMQP是一個協議。JMS和AMQP - RabbitMQ

這裏是我的假設(和問題以及)

  • RabbitMQ的使用AMQP協議(而實現AMQP協議)
  • Java客戶端需要使用AMQP協議客戶端庫連接/使用RabbitMQ的
  • JMS API在哪裏發揮作用? JMS API應該使用AMQP客戶端庫連接到RabbitMQ?
  • 通常我們使用JMS然後在這裏,而不是AMQP使用什麼默認的協議,消息代理連接如RabbitMQ的,ActiveMQ的,等等?

上述的一些可以是啞。 :-)但試圖把我的頭圍繞它。

+3

@KevinRave:所選的答案在某些要點上是錯誤的。我已添加了評論,以便您可以查看它。 – brainOverflow 2013-05-08 17:43:58

+0

@KevinRave我編輯了答案。現在有爭議的部分已經取代。現在整個答案完全OK – Freak 2013-07-17 03:19:20

+0

我不知道誰編輯了我的答案,並給出了這個不適當的點,這是第3號..因爲我已經問過這件事凱文在第2點說。在進行投票或提出建議之前,請務必仔細閱讀。 – Freak 2013-07-17 03:24:25

回答

77

你的問題有點混亂,類似問題論文中的一個難題:)(因爲老師總是試圖提出複雜的簡單問題:DI希望你不是老師:))讓我們看看所有這些一。

如你所知:

Java消息服務(JMS)API是一個Java面向消息的中間件(MOM),兩個或多個客戶端之間發送消息API。 JMS是Java平臺企業版的一部分,由Java Community Process下開發的規範定義爲JSR 914. 它是一種消息傳遞標準,允許基於Java企業版(Java EE)的應用程序組件創建,發送,接收和閱讀消息。它允許分佈式應用程序的不同組件之間的通信鬆散耦合,可靠並且異步

現在(來自Wikipedia):

的高級消息隊列協議(AMQP)爲面向消息的中間件的開放標準的應用層協議。 AMQP的 限定特徵是消息取向,排隊,路由 (包括點至點和發佈和訂閱),可靠性和安全性 。

而最重要的事情(再次從維基百科):

不同於JMS,其僅定義了一個API,AMQP是線級 協議。有線協議是對數據的格式的描述,以數據流的形式通過網絡發送。 因此,可以創建和解釋 符合該數據格式郵件中的任何工具可以不管實現語言的其它任何符合 工具互操作

一些重要的事情你應該知道:

  1. 請介意AMQP是一種不實現JMS API的消息傳遞技術。
  2. JMS是API,AMQP是協議。因此,當調用WebLogic Web Service時,什麼是JMS的默認協議,當然客戶端應用程序使用HTTP/S作爲連接協議毫無意義。
  3. JMS只是一個API SPEC。它不使用任何協議。 JMS提供(如ActiveMQ的)可以是使用任何底層協議到 實現JMS API。例如:Apache ActiveMQ可以使用以下協議中的任意一種:AMQP,MQTT,OpenWire,REST(HTTP),RSS和Atom,Stomp,WSIF,WS Notification,XMPP。我建議你閱讀Using JMS Transport as the Connection Protocol

好運:)

+11

'我不確定,但我相信AMQP也使用HTTP/S協議,但AMQP是enhacement是通過HTTP協議的消息協議:**否。這是不正確的。**'JMS使用簡單的HTTP,但對於RabbitMQ/ActiveMq,它們使用增強型協議。:**否。這是不正確的。** JMS只是一個API規範。它不使用任何協議。 JMS提供者(如ActiveMQ)可以使用任何底層協議來實現JMS API。例如:Apache ActiveMQ可以使用以下任何協議:AMQP,MQTT,OpenWire,REST(HTTP),RSS和Atom,Stomp,WSIF,WS Notification,XMPP。 – brainOverflow 2013-05-08 17:40:37

+0

我編輯了答案。現在有爭議的部分已經取代。 – Freak 2013-07-17 03:18:38

+0

@brainOverflow我不知道是誰編輯了我的答案,並給出了這個不恰當的點,這是第3點..因爲我已經問過你在第2點說的東西。在投票或提出建議之前仔細閱讀 – Freak 2013-07-17 03:21:37

13

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

-1

我懷疑你可能會尋找this documentation它說,部分:

JMS客戶端的vFabric RabbitMQ的是對的vFabric RabbitMQ的客戶端庫。 vFabric RabbitMQ不是JMS提供者,但具有支持JMS隊列和主題消息傳遞模型所需的功能 。針對RabbitMQ的JMS客戶端 在 RabbitMQ Java客戶端API之上實現了JMS 1.1規範,從而允許新的和現有的JMS 應用程序通過高級消息 排隊協議(AMQP)與RabbitMQ中介連接。

+0

Nope 。它不是我正在看的那個。但類似。 – 2014-04-16 14:37:20

27

讓我們從基礎開始。

的RabbitMQ是MOM(中間件消息),使用Erlang(一薄層面向對象編程語言)和開發實現有線協議AMQP(提前消息隊列協議)。 目前,許多客戶端API(例如Java,C++,RESTful等)都可用於啓用RabbitMQ消息服務的使用。

JMS(Java消息服務)是一種JCP標準限定組結構化的API的要由MOM來實現。實現(即兼容)JMS API的MOM的一個例子是ActiveMQ;還有HornetMQ和其他人。這些中間件獲取JMS API並相應地實現交換模式。

根據以上所述,以JMS API(RabbitMQ及其Java API客戶端API)的實例爲基礎,可以開發一個使用RabbitMQ的JMS實現:在這一點上必須做的唯一事情根據JMS規範實施交換模式(通過RabbitMQ)。

關鍵是:無論採用何種技術(本例中爲RabbitMQ),都可以實現一組API,如JMS。

+0

很好的解釋! – 2014-10-17 16:33:23

+0

TLC代表什麼? – mvmn 2016-12-22 13:15:48

+0

@mvmm TLC代表電信。請看看[1]。 [1] https://www.allacronyms.com/TLC/Telecommunication – 2017-01-02 15:00:18

8

我對JMS和AMQP有類似的問題。這裏的討論回答了這些問題。這從spring.io鏈接也解釋了它精美,值得一看,因此分享...

Understanding AMQP

1
  • 哪裏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」

0

https://spring.io/understanding/AMQP

AMQP(高級消息隊列協議)是用於異步消息的公開發表導線 規範。指定傳輸的每個字節 數據。該特徵允許以許多種語言編寫庫,並且可以在多種操作系統和CPU 體系結構上運行,這構成了真正可互操作的,跨平臺的消息傳送標準 。

AMQP經常與Java社區中最常見的郵件系統JMS(Java Message Service)相比較。 JMS的侷限性在於指定了API,但消息格式不是。與AMQP不同, JMS不需要如何形成和傳輸消息。從本質上講,每個JMS代理都可以以不同的格式實現消息。他們只需要使用相同的API。