2012-09-02 39 views
6

我是C++的新手,但在Java EE方面有很多經驗。C++和JMS - 如何連接這兩個?

我需要編寫一個非常異步的小應用程序。它從HTTP接收數據並將其存儲在Queue(它需要有保證的交付和非常高的吞吐量),像ActiveMQ或OpenMQ,可能通過JMS。

然後,另一個C++應用程序/偵聽器從隊列中取出數據(通過由隊列直接激活的某些偵聽器,而不是由我的池)激活,連接到MySQL數據庫並執行一些業務邏輯計算並將消息發送給另一個隊列。

在Java EE中,這將是一個將消息發送到JMS隊列的Web應用程序。消息驅動Bean將成爲EJB模塊中這些消息的使用者,並且會話EJB會將消息發送到傳出的JMS隊列。

有人可以用C++的經驗,請介紹一些基礎知識對我說:

  1. JMS是C++的擔保交付隊列的唯一選擇?你是否建議使用ActiveMQ或其他的東西,因爲消費者會使用C++。

  2. 是否需要在C++中創建某種類型的多線程守護進程來偵聽Queue消息,或者是ActiveMQ的C +消費者實現的線程創建(消息消耗)部分?

有關如何實施上述場景的任何其他建議將非常感激。

編輯:我寧願消息代理和客戶端在C++。 ActiveMQ是一款Java產品,並不是我們真正需要的。

+0

看看[ZeroMQ](http://www.zeromq.org/)。這可能是你正在尋找的東西。 – Codo

+0

對於像我這樣的新手來說,ZeroMQ看起來非常低級。我正在尋找一些已經具有更高層次可靠消息隊列抽象的庫。 – bozo

+0

專有軟件是一個選項嗎?看看IBM WebSphere MQ,它提供了大量的客戶端庫... –

回答

18

1 - JMS - Java消息服務 - 僅僅是Java和Java的API參考。除了AMQP之外,沒有適用於C++的消息傳遞標準(對我來說,這並不是真正的跨實現,而是應該儘可能好)。對於C++,您必須依賴每個消息代理實現的特定供應商庫。

建議實現的:

  • ActiveMQ的 - 它有一個很好的C++ API(稱爲CMS),這是JMS藍本,並命名爲 - 所以你會覺得熟悉的API。主要的代理可以運行在Java上 - 可能是最簡單的選擇。

  • IBM WebSphere MQ - 非開放源代碼,運行本機(用C語言編寫)並具有C++庫的企業級代理。當你瞭解學習曲線並且價格無關緊要時,你會感覺很好。

  • RabbitMQ - 非常流行的可靠消息傳遞,具有高性能和開放源代碼。具有C++客戶端庫,但是用Erlang編寫並在erlang/otp運行時內運行。

  • Apache QPID - 不太知名的AMQP/JMS代理。有兩種風格的服務器端,Java和C++,其中C++代理具有更好的性能。來自C++客戶端庫。

2 - 對於多線程,JMS規範並沒有真正的解決方案。它更像是Java EE容器(或者Spring Framework),它簡單地包裝了線程的管理並將開發人員從中解脫出來。在這種情況下,ActiveMQ的支持類別並不多,就我所知,其他供應商的庫都沒有。所以,找一些包裝線程的庫(我沒有線索)或者自己處理消費者線程。它不應該所有這些混亂,做對。

+1

驚訝地看到這個答案只有5票。它很棒。可悲的是我只能給一個。 – Mats