我最近和jms一起工作,我有这样一个问题。我必须收到消息1)所有消息2)只有type ='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()
的调用将无限期地阻塞。这是预期的,记录在案的行为。
如果你不想在这里无限期阻止,你可以:
javax.jms.MessageListener
实现)javax.jms.MessageConsumer.receive(int)
并将超时传递给receive
,以便在给定超时后没有收到消息时调用返回。javax.jms.MessageConsumer.receiveNoWait()
将尝试接收下一个匹配的消息,如果没有匹配的消息立即可用,它将返回。