有选择地出列的消息是否保持FIFO顺序(MQ)?

时间:2011-10-02 23:25:35

标签: jms ibm-mq

使用JMS& WebSphere MQ,如果我使用消息选择器选择性地出列,并且有几条消息具有相同的选择标准,我是否可以将第一条匹配的消息出列?

e.g。给出一个带消息的队列

  1. {color: pink, name: alice}
  2. {color: blue, name: bob}
  3. {color: red, name: charlie}
  4. {color: blue, name: doug}
  5. 如果我使用选择器color='blue'出列,我保证会将{color: blue, name: bob}出列吗?或者我有可能获得{color: blue, name: doug},即使它进一步进入队列深度?

2 个答案:

答案 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 +优先级顺序递送,但这不是您考虑的选项。最后,如果消息被分组,消息排序会变得复杂,但同样,情况并非如此。