使用JMS& WebSphere MQ,如果我使用消息选择器选择性地出列,并且有几条消息具有相同的选择标准,我是否可以将第一条匹配的消息出列?
e.g。给出一个带消息的队列
{color: pink, name: alice}
{color: blue, name: bob}
{color: red, name: charlie}
{color: blue, name: doug}
如果我使用选择器color='blue'
出列,我保证会将{color: blue, name: bob}
出列吗?或者我有可能获得{color: blue, name: doug}
,即使它进一步进入队列深度?
答案 0 :(得分:3)
请参阅不同WMQ连接工厂实施的RESCANINT属性。从手册:
当点对点域中的消息使用者使用消息时 选择器以选择它想要接收哪些消息,即WebSphere MQ JMS客户端在WebSphere MQ队列中搜索合适的消息 由MsgDeliverySequence属性确定的序列 队列。当客户端找到合适的消息并将其传递给 消费者,客户端恢复搜索下一个合适的消息 从它在队列中的当前位置。客户端继续搜索 以这种方式排队,直到它到达队列的末尾,或直到 以毫秒为单位的时间间隔,由值决定 这个属性已经过期了。在每种情况下,客户返回到 队列的开头继续搜索,并有一个新的时间间隔 开始。
这个想法是,在一个非常繁忙的优先级传递队列中,一些优先级较高的消息可能会在队列中显得高于选择器的当前位置。从理论上讲,应首先消耗较高优先级的消息,但消费者除非从队列的头部进行搜索,否则不会看到它。当光标到达末尾或达到RESCANINT时,光标将重置为队列的头部。 RESCANINT的设置允许调整您希望选择器找到这些更高优先级消息的响应速度。
RESCANINT不是特定于FIFO传送。发生这种情况的另一种情况是,如果存在多个具有重叠选择标准的线程。在这种情况下,一个线程可以在锁定下保存消息然后释放它。虽然该消息可能符合第二个线程的条件,但如果该线程已经在队列中传递了该位置,那么它将占用队列的末尾或者RESCANINT过去以重新启动游标以查找消息。
重新扫描间隔以毫秒为单位,默认为5000.接受任何正整数值,但过低的值会导致抖动,因为在消耗任何消息之前光标会不断重置。
实际上,如果队列是FIFO并且队列中只有一个读取器符合条件,您将按顺序接收消息,无论RESCANINT设置为什么。如果要严格保留消息顺序,则还有一些其他注意事项,如 Sequential retrieval of messages 中所述。这些归结为在考虑频道,同步点等时,从生产者到消费者只有一条路径的消息
答案 1 :(得分:2)
请参阅“The order in which messages are retrieved from a queue”一章和以下内容:“Getting a particular message”。
总结:获取忽略FIFO顺序的消息的唯一方法是通过其消息ID或相关ID获取特定消息。队列也可以配置为以FIFO +优先级顺序递送,但这不是您考虑的选项。最后,如果消息被分组,消息排序会变得复杂,但同样,情况并非如此。