Properties jms消息选择器

Properties jms消息选择器,properties,jms,activemq,Properties,Jms,Activemq,我正在使用ActiveMQ5.5和JMS。我创建了一个主题消费者,其消息选择器为 key<>'aValue' 在这种情况下,消费者不会收到消息。这在我看来是前后矛盾的 这就是JMS规范所说的: 当消息的标题字段和属性值被替换为选择器中相应的标识符时,消息选择器将在选择器的计算结果为true时匹配消息 根据SQL92规范(JMS消息选择器语法所基于的规范),将任何内容与NULL进行比较会得到NULL,而不是值(本例中为TRUE或FALSE)。如果是这种情况,则第一种情况不应导致收到消

我正在使用ActiveMQ5.5和JMS。我创建了一个主题消费者,其消息选择器为

key<>'aValue'
在这种情况下,消费者不会收到消息。这在我看来是前后矛盾的

这就是JMS规范所说的:

当消息的标题字段和属性值被替换为选择器中相应的标识符时,消息选择器将在选择器的计算结果为true时匹配消息

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


有人见过这个吗?当生产者未指定属性且消费者有选择器时,哪种结果(案例或不相似案例)是正确的?有什么想法可以解决这个问题吗?

基于我有限的阅读,我的理解是,首先是从JMS规范:

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

因此,在您的情况下,当替换属性值时,键标识符的计算结果将为NULL

第一个表达式本质上是空的“aValue”,这在我心目中是正确的

第二个表达式将为NULL,不像规范所说的“%aVal”有未知的结果,ActiveMQ似乎以true作为结果:

如果相似或不相似操作的标识符为NULL,则 操作未知

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

(key NOT NULL) AND ...

谢谢你的回答。我还将与其他JMS代理一起测试这一点,看看在解释上是否存在差异。您建议的解决方案不适用于ActiveMQ。它抛出一个异常。等我有空的时候,我会把它加在这里
(key NOT NULL) AND ...