Недавно работаю с 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(), который попытается получить следующее соответствующее сообщение, и если соответствующее сообщение сразу не будет доступно, оно вернется.