java - 如果消息不包含消息选择器条件,为什么消费者会停止?
问题描述
我最近与 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()
which 将尝试接收下一个匹配的消息,如果没有匹配的消息立即可用,它将返回。
推荐阅读
- jupyter-notebook - jupyter notebook 打不开笔记本
- google-chrome - 使用 Chrome / Chromium 无头模式时如何获取地址栏?
- python - 安装pyInstaller时如何修复错误
- c# - 如何获取声明的变量
- c++ - 存储持续时间与 C++ 中的位置
- css - SCSS 文件图像 @import 命令不起作用
- python - 尝试删除带有空格的符号(“-”),同时保留不带空格的符号(“-”)
- c# - 什么是图像的字节数组?
- javascript - jquery:为什么我的轮播滑块不再滑动了?
- machine-learning - Scikit learn 中是否有用于将子类数据集拆分为文件夹中的训练/测试集的库或工具