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

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

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

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

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

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

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

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

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

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

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

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