2011-09-07 42 views
1

我對JMS比較陌生。我有這樣的要求:替代來自隊列瀏覽器的郵件消息

事件發佈到隊列。每個事件都有一個與其關聯的用戶標識,並且必須按順序處理給定用戶標識的事件。有時一個事件不能立即處理,所以我們希望暫時忽略來自該用戶ID的事件,同時繼續使用隊列中其他用戶ID的事件。

起初我以爲一個QueueBrowser可以也許會有幫助,一拉:

Session session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE); 
QueueBrowser queueBrowser = session.createBrowser(eventQueue); 
Enumeration messages = queueBrowser.getEnumeration(); 
HashSet<Integer> busylist = new HashSet<Integer>(); // Keeps track of busy users 
while (messages.hasNextElement()) 
{ 
    t.begin() 
    Message msg = (Message) messages.getNextElement(); 
    Integer userId = msg.getIntProperty("UserID"); 
    if (busylist.contains(userId)) 
    continue; 
    boolean userIsBusy = process(msg); 
    if (userIsBusy) 
    { 
    busylist.add(userId); 
    continue; 
    } 
    msg.acknowledge(); 
    t.commit(); 
} 

的想法是從隊列中消耗的一切,但是當用戶正忙,記錄在busylist,並繼續到下一個信息。上面的代碼可能每分鐘調用一次。 在測試類似上述代碼之後,我發現來自隊列瀏覽器的消息上的確認()消息沒有做任何事設計

我的問題是,我怎麼能達到類似於上述的東西?我看到的一個解決方案是,爲每個我想要使用消息選擇器來選擇個別消息的消息創建一個MessageConsumer ...對我來說這似乎有點低效。還有其他方法可以做到這一點嗎?

我不認爲一個可接受的解決方案將是每個用戶一個隊列。有數百萬用戶。

回答

0

不要立即偏離您的方法,但是您可以在發送消息時設置生存時間嗎?這樣,如果用戶在指定的時間內沒有使用他們的消息,他們的消息將被JMS引擎自動清除。

另外,追求自己的方法,而不是每個空閒用戶,批量創建每個消息的消息消費者的消息ID成組ň消息。當批量滿或瀏覽器到達消息集的末尾時,指示消息使用者使用選擇器,該選擇器指定所有消息ID,並消耗它們。