gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:59:21 25 4
gpt4 key购买 nike

我最近在使用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()是一个阻塞调用。换句话说,它将阻止进一步的执行,直到返回结果。如果队列不包含任何与选择器匹配的消息,则调用 javax.jms.MessageConsumer.receive()将无限期地阻塞。这是预期的、有记录的行为。

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

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

关于java - 如果消息不包含消息选择器条件,为什么消费者会停止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55748290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com