2011-10-24 130 views
1

我正在編寫服務器/客戶端遊戲,一個典型的場景如下所示:一個客戶端(clientA)向服務器發送消息,服務器中有一個MessageDrivenBean來處理此類消息。 MDB完成其作業後,會將結果消息發送回另一個客戶端(clientB)。關於JMS系統結構

在我看來,我只需要兩個隊列進行這種通信,一個用於輸入另一個用於輸出。爲每個連接創建新的隊列不是一個好主意,對吧? 輸入隊列相對清晰,如果有更多的客戶端同時發送消息,則消息只是在隊列中等待,而服務器中有更多的MDB實例,這不應該是一個很大的性能問題。

但在另一方面,我不太清楚輸出隊列,我應該使用主題而不是隊列嗎?每個客戶端正在監聽輸出隊列,其中一個獲取新消息並檢查屬性以確定消息是否屬於該消息,如果不是,則回滾事務,消息返回隊列並準備好用於其他客戶端... It應該工作,但一定很慢。如果我使用topic,每個客戶端都會得到一份消息副本,如果不是這樣,就會忽略消息。它應該會更好,對吧?

我是新的消息系統。有沒有關於我的實施的建議?謝謝!

回答

1

首先,選擇JMS作爲遊戲平臺很不尋常—企業使用JMS代理提供可靠性和交易支持。你真的需要一場比賽中的沉重打擊嗎?例如,你不應該訴諸於你自己的基於HTTP協議嗎?

也就是說,兩個隊列是點對點通信的標準模式。爲新連接創建隊列絕對不行—消息驅動的bean在部署時連接到隊列,因此您將無法響應隊列創建事件。此外,排隊不是要在短週期內創建和銷燬,而是設計成長生存的實體。如果您需要向一個精確的客戶端發送消息,請讓客戶端在服務器響應隊列中偵聽,並設置一個消息選擇器,以僅過濾旨在用於此客戶端的消息(請參閱javax.jms.Message API)。

隨着主題是完全按照您注意—每個連接的客戶端會再次得到消息—的副本,這不是一個好的模式通過n-1個發送給ň客戶端將被廢棄的消息客戶。

+0

感謝您的回答。現在我對JMS更加清楚了。順便說一句。我使用JMS是因爲前端使用flash,我使用blazeds消息系統與java後端進行通信。 http絕對是一種選擇,但blazeds消息系統具有服務器數據推送功能,這意味着不必每秒都查詢服務器響應,客戶端在收到響應時立即獲得響應。所以我決定使用jms。 – cn1h

+0

@ cn1h隨着服務器將數據推送到客戶端,這是有道理的。你有這樣的技術是很好的,謝謝你的解釋。 – MaDa

1

MaDa;

您可以粘貼一個輸出隊列(或主題),並簡單地標記帶有標識預期客戶端的標頭的消息。然後,客戶端可以使用選擇器監聽隊列/主題。希望您的JMS實現具有高效的服務器端偵聽器評估。