如果消息不包含消息选择器条件,为什么消费者会停止?

Why consumer stopped if message doesn't contain message selector condition?

最近在做jms,有这样的疑问。我必须收到消息 1) 所有消息 2) 仅在类型 = 'LIQUID' 的地方。我创建了两个消费者

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Queue queue = session.createQueue(QUEUE_FOR_RECEIVED);
        QueueBrowser queueBrowser = session.createBrowser(queue);
        Enumeration enumeration = queueBrowser.getEnumeration();
        MessageConsumer consumer = session.createConsumer(queue);
        MessageConsumer liquidConsumer = session.createConsumer(queue, "type = 'LIQUID'");

第一个收到所有消息,第二个只收到type = 'LIQUID'。但是如果消息不包含 type='LIQUID'

,第二个消费者就停止了应用程序
while (enumeration.hasMoreElements()) {
            ObjectMessage ss = (ObjectMessage) consumer.receive();
            System.out.println(ss.getObject());
            ObjectMessage msg = (ObjectMessage) liquidConsumer.receive(); // here consumer stopped if message doesn't contain type ='LIQUID'
            System.out.println(msg.getObject());
            enumeration.nextElement();
        }

如何改进?

应用程序停止的原因是 javax.jms.MessageConsumer.receive() is a blocking call. In other words, it will block further execution until a result is returned. If the queue doesn't contain any messages which match the selector then the call to javax.jms.MessageConsumer.receive() 将无限期阻塞。这是预期的记录行为。

如果您不想无限期地阻止在这里,您可以:

  1. 异步接收消息(例如使用 javax.jms.MessageListener 实现)
  2. 使用 javax.jms.MessageConsumer.receive(int) 并将超时传递给 receive,以便在给定超时后未收到任何消息时调用 return。
  3. 使用 javax.jms.MessageConsumer.receiveNoWait() 将尝试接收下一条匹配消息,如果没有立即可用的匹配消息,它将 return.