2012-04-19 118 views
0

我正在使用Glassfish 3.1.1,結合使用EJB 3.1體系結構和smack庫來處理傳入的XMPP數據包。每個發件人的消息隊列

爲此,我有一個從Singleton處理我的傳入數據包的線程。

Packet packet = collector.nextResult(); 
if (packet != null) 
    processPacket(packet); // here i lookup my processing EJB and start working 

我所需要的是,其在一個時間排隊分組以每發送方處理一個分組的隊列。目前,我並行處理每個收到的數據包,這使我無法保持數據包的順序。

任何想法如何我可以儘可能優雅地解決這個問題?

問候中號

PS:第一種方法是存儲該客戶端處理的時刻數據包,我遍歷收集的數據包並找出不處理任何發件人。但是,如果緩衝區中沒有數據包被允許處理,恐怕這會花費很多次迭代。

回答

0

如果您提前知道發件人,那麼您可以註冊與每個發件人匹配的PacketFilter。因此每個收集器將排隊來自每個發送者的數據包。

如果你不知道,那麼你可以完成同樣的事情,但你必須自己發送消息。使用PacketListener而不是收集器,並在收到它們時將每封郵件路由到發件人隊列中。然後,您可以按需創建隊列,如果它不存在。

+0

我之前嘗試過PacketListener,但我更喜歡PacketCollector,因爲當我想停止處理數據包時,我有更多的控制權。在heaver負載下,數據包監聽器一直調用回調函數,直到它的緩衝區爲空,即使我取消了它。通過收集器,我還可以通過獲取排隊數據包的數量(反射)來確定其健康狀態。但不管怎麼說。當我收到新包時,我需要爲每個客戶端高效排隊。你有什麼想法嗎?我在PS中張貼了我的第一個方法。 – mkuff 2012-04-20 07:10:31