JMS - 消息选择器如何与多个队列和主题使用者一起工作?

时间:2010-05-13 16:51:46

标签: java java-ee jms messaging

假设您有一个JMS队列,并且多个消费者正在查看队列中的消息。您希望其中一个消费者获得所有特定类型的消息,因此您决定使用message selectors.

例如,您可以在名为targetConsumer的JMS消息头中定义一个属性。您应用于称为A的消费者的消息选择器类似于WHERE targetConsumer = 'CONSUMER_A'

很明显,消费者A现在只是抓住具有属性集的消息,就像在示例中一样。但是,其他消费者是否会意识到这一点? IOW,如果消费者在消费者CONSUMER_A之前查看队列,那么另一个不受消息选择器约束的消费者会抓取A消息吗?我是否需要将WHERE targetConsumer <> 'CONSUMER_A'等消息选择器应用于其他人?

我现在正在RTFMing并收集经验数据,但是希望有人可能知道他们的头脑。

3 个答案:

答案 0 :(得分:6)

当多个消费者使用相同的队列时,需要在这些消费者之间正确配置消息选择器,以便在确定目标消费者时不会发生冲突。

对于消息驱动Bean(JMS消息的使用者),可以在ejb-jar.xml文件中指定选择器,从而允许在部署时完成配置(而不是相反的视图)在开发期间指定消息选择器。)

编辑:在现实生活中,当不同的消费者负责处理包含写入同一队列的相同标头(通常由同一生产者生成)的消息时,这是有意义的。例如,当生产者无法将JMS消息写入两个单独的买卖队列时,可以在交易应用程序中使用消息选择器来区分买入和卖出订单。

答案 1 :(得分:0)

是的,另一个未使用任何消息选择器的消费者将获得针对消费者A的消息(或者就此而言,消息在队列顶部的任何消息)。因此,在共享队列时,必须对消费者应用程序进行管理,并仅选择那些针对它们的消息。

答案 2 :(得分:0)

第一个&#39;如果选择器匹配,队列中的JMS消息使用者将获取消息。什么&#39;第一&#39; means是一个实现细节(可以是循环,基于优先级或网络接近度)。因此,当在队列中使用选择器时,您需要确保这些选择器不重叠&#39;。

更正式地说:不存在与同一队列中的2个选择器匹配的消息

这是队列与主题的另一个缺点 - 在实践中,您应该始终考虑首先使用主题。通过主题,每个匹配的消费者都会收到消息。