2010-01-28 46 views
3

我正在研究運行在我的本地 Glassfish3安裝上的Java EE 6企業應用程序。我的一個EJB需要將消息發送到位於互聯網某處的遠程 JMS代理。如何使用Glassfish的JMS Broker將代理消息「上傳到」互聯網上的JMS Broker?

不幸的是,互聯網連接相當不可靠,所以我的想法是首先將消息發送給本地的 Glassfish自己的JMS代理。我的本地經紀人然後會將消息轉發給代理的遠程。如果互聯網連接不可用,本地經紀人只需等待連接恢復。

我正確地認爲這將起作用嗎?如果是這樣,我將非常感謝一些想法如何開始。

+0

Ewernli和帕斯卡,非常感謝您的回覆。他們幫助我瞭解OpenMQ的當前侷限性。 我已決定不採用虛擬MDB方法,而是使用本地ActiveMQ消息代理。就目前而言,它似乎在起作用。 – 2010-02-01 09:46:07

回答

0

JMS很適合當客戶(生產者或消費者)是不可靠的,但在情況下,經紀人本身是不可靠的你有麻煩了。

您可以嘗試玩重新發送「暫存」代理的參數(超時時間,重試次數等)。但是,您仍然需要一個虛擬MDB作爲forwarer:陳述式代理嘗試傳遞給試圖連接外部代理的虛擬MDB。如果它不能處理失敗,並且消息保留在臨時代理中。然後,陳述經紀人將嘗試將消息重新傳遞給虛擬MDB。

如果MDB無法將消息轉發給「外部」代理,則「分段」代理的重新傳遞功能可幫助管理連接問題。但請注意,在某個時間點,消息可能會進入「暫存」代理的死信息隊列(DMQ),甚至可能會被丟棄,具體取決於它的配置方式。

但是,這仍然聽起來有點怪,我...

1

這種做法是完全有效針對這種情況(當遠程端點並不總是可用的)和被稱爲「存儲 - 轉發」消息。事實上,許多應用服務器支持這個開箱即用,例如WebLogic和他的Store and Forward服務:

SAF服務使WebLogic Server能夠可靠地在跨WebLogic Server實例分佈的應用程序之間傳遞消息。例如,通過SAF服務,在本地WebLogic Server實例上運行或連接到本地WebLogic Server實例的應用程序可以可靠地將消息發送到駐留在遠程服務器上的端點。如果在發送消息時目的地不可用,或者是由於網絡問題或系統故障,那麼這些消息將保存在本地服務器實例中,並在其變爲可用時轉發給遠程端點。

Open MQ(GlassFish的JMS實現)的情況下,我知道,存儲和轉發消息是在功能計劃(見2007年this presentation)。但是我在這方面找到一個確切的狀態有一些困難(像this one這樣的消息並沒有真正說明情況)。可以肯定的是,GlassFish v3使用Open MQ 4。4和Open MQ 4.4具有JMS橋(這是存儲和轉發所必需的),並且您可能可以將其用於代理進行代理通信。有關如何配置它,請參閱this recent blog post(找不到Open MQ 4.4的文檔!!)。就個人而言,我會在開發郵件列表上發佈消息。

現在,如果這不是很清楚,或者如果您沒有得到滿意的答案,那麼始終可以編寫自定義應用程序來使用消息並將它們轉發給其他代理,而且這並不複雜。基本上,存儲轉發消息意味着爲應用程序使用「本地」持久隊列,並使用MDB消費這些消息並將它們發送到遠程JMS目標(在單個事務中)。這需要進一步測試,但作爲JMS客戶端,處理轉發的MDB應該能夠透明地重新連接到遠程目標。