如果消息不包含消息选择器条件,为什么消费者会停止?
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()
将无限期阻塞。这是预期的记录行为。
如果您不想无限期地阻止在这里,您可以:
- 异步接收消息(例如使用
javax.jms.MessageListener
实现)
- 使用
javax.jms.MessageConsumer.receive(int)
并将超时传递给 receive
,以便在给定超时后未收到任何消息时调用 return。
- 使用
javax.jms.MessageConsumer.receiveNoWait()
将尝试接收下一条匹配消息,如果没有立即可用的匹配消息,它将 return.
最近在做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()
将无限期阻塞。这是预期的记录行为。
如果您不想无限期地阻止在这里,您可以:
- 异步接收消息(例如使用
javax.jms.MessageListener
实现) - 使用
javax.jms.MessageConsumer.receive(int)
并将超时传递给receive
,以便在给定超时后未收到任何消息时调用 return。 - 使用
javax.jms.MessageConsumer.receiveNoWait()
将尝试接收下一条匹配消息,如果没有立即可用的匹配消息,它将 return.