Jms 从QueueBrowser确认消息的替代方法

Jms 从QueueBrowser确认消息的替代方法,jms,Jms,我对JMS比较陌生。我有这样的要求: 事件被发布到队列中。每个事件都有一个与之关联的UserID,并且必须按顺序处理给定UserID的事件。有时无法立即处理事件,因此我们希望暂时忽略来自该用户标识的事件,同时继续使用队列中其他用户标识的事件 起初,我认为排队浏览器可能会有所帮助,la: Session session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE); QueueBrowser queueBrowser =

我对JMS比较陌生。我有这样的要求:

事件被发布到队列中。每个事件都有一个与之关联的UserID,并且必须按顺序处理给定UserID的事件。有时无法立即处理事件,因此我们希望暂时忽略来自该用户标识的事件,同时继续使用队列中其他用户标识的事件

起初,我认为排队浏览器可能会有所帮助,la:

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中,然后继续下一条消息。上述代码可能每分钟调用一次。 在测试类似于上述代码的内容后,我发现来自queuebrowser的消息上的确认消息在设计上没有任何作用

我的问题是,我如何实现类似于上述的目标?我看到的一个解决方案是使用消息选择器为我想要确认的每条消息创建一个消息消费者,以选择出单个消息。。。这对我来说似乎有点低效。还有其他方法吗


我不认为一个可接受的解决方案是每个用户一个队列。有数以百万计的用户。

不想立即改变你的方法,但你能在发送消息时设定一个时间让它们生存吗?这样,如果用户没有在指定的时间内使用他们的消息,JMS引擎将自动清除他们的消息

或者,按照您的方法,而不是为每个空闲用户的每条消息创建一个消息使用者,而是将消息ID批处理为n条消息的集合。当批处理已满,或浏览器到达消息集的末尾时,指示消息使用者使用指定所有空闲消息ID并使用它们的选择器