JMS消息选择器

3

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

key<>'aValue'

这意味着用户只会收到没有属性值为“aValue”的“key”属性的消息。

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

让我困惑的是,消息被传送了。

如果我使用运算符NOT LIKE,则情况就不同了:

key NOT LIKE 'aVal%'. 

在这种情况下,消费者没有收到消息。在我的看法中,这是不一致的。
以下是JMS规范的说明:
消息选择器匹配消息时,当消息头字段和属性值替换为选择器中对应的标识符时,选择器求值为true。
根据SQL92规范(JMS消息选择器语法基于此),将任何内容与NULL进行比较会导致结果为NULL而不是一个值(在本例中为TRUE或FALSE)。如果是这种情况,第一种情况不应该导致消息被接收。
有人遇到过这种情况吗?当生产者未指定属性,消费者具有选择器时,哪个结果,即<>还是NOT LIKE,是正确的?有什么办法可以解决这个问题?
1个回答

3
基于我的有限阅读,我的理解是这样的,首先从JMS规范开始:

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

因此,在您的情况下,替换属性值时,关键字标识符将计算为NULL。
第一个表达式本质上将是NULL<>'aValue',在我看来是正确的。
第二个表达式将是NULL NOT LIKE '%aVal',规范说将具有未知结果,并且ActiveMQ似乎已经选择了true作为结果:

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

我认为解决方法是使选择器非常明确。
(key NOT NULL) AND ...

1
谢谢你的回答。我也会在其他JMS代理上进行测试,看看是否有不同的解释。你建议的解决方法在ActiveMQ中不起作用,它会抛出异常。我一有时间就会在这里添加它。 - Kilter444

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接