3

我正在使用 ActiveMQ 5.5 和 JMS。我创建了一个带有消息选择器的主题消费者

key<>'aValue'

这意味着消费者将仅接收具有名为“key”的属性且不具有值“aValue”的消息。

然后我发送一条没有名为“key”的属性的消息(请注意,这种情况不是存在具有空值的属性,而是没有属性。)

令我困惑的是,消息已传递。

如果我使用运算符 NOT LIKE,情况并非如此:

key NOT LIKE 'aVal%'. 

在这种情况下,消费者不会收到消息。这在我看来是不一致的。

这就是 JMS 规范所说的:

A message selector matches a message when the selector evaluates to true when the message's header field and property values are substituted for their corresponding identifiers in the selector.

根据 SQL92 规范(JMS 消息选择器语法基于该规范),将任何内容与 NULL 进行比较会导致 NULL 而不是值(在这种情况下为 TRUE 或 FALSE)。如果是这种情况,则第一种情况不应导致接收到消息。

有人遇到过这个吗?当生产者没有指定属性而消费者有选择器时,<> 情况或 NOT LIKE 情况哪个结果是正确的?有什么想法可以解决这个问题吗?

4

1 回答 1

3

根据我有限的阅读,我的理解是这样的,首先来自 JMS 规范:

如果引用了消息中不存在的属性,则其值为 NULL。

因此,在您的情况下,替换属性值时的键标识符将评估为 NULL

第一个表达式本质上是 NULL<>'aValue',在我看来这是真的

第二个表达式将是 NULL NOT LIKE '%aVal' 规范说会有一个未知的结果,而 ActiveMQ 似乎已经以 true 作为结果:

如果 LIKE 或 NOT LIKE 操作的标识符为 NULL,则操作的值是未知的。

我认为解决方法是使选择器非常明确:

(key NOT NULL) AND ...
于 2012-09-15T04:18:01.387 回答