我對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 ...對我來說這似乎有點低效。還有其他方法可以做到這一點嗎?
我不認爲一個可接受的解決方案將是每個用戶一個隊列。有數百萬用戶。