无法在 ActiveMQ 中使用 STOMP 选择器过滤消息

Cannot filter message using selector for STOMP in ActiveMQ

我正在使用 ActiveMQ 5.15.8。我在 node.js 中使用 STOMP 协议与库 stompit.

生产者代码片段:

var headers = {
'destination':'/topic/xyz',
'persistent':'true',
'content-type':'binary/octet-stream',
'content-length':9999,
'selector': "key = 'A'"
}
var frame = client.send(headers)

消费者代码订阅片段:

client.subscribe({'ack':'client-individual',
'activemq.retroactive':'true',
'activemq.subscriptionName':'name',
'destination':'/topic/xyz',
'selector':"key = 'A'"},(err,msg)=>{})

问题是我无法正确选择选择器。我无法使用上述代码接收任何消息。我也试过使用:

'selector':'key=A'

有了这个,我收到了所有消息,但没有在密钥上过滤。

有人可以帮我正确选择这个选择器吗?我再次使用 Node.js 库 stompit。

谢谢

当您发送 消息时,您没有应用selector header。您只需应用 key/value,例如:

var headers = {
'destination':'/topic/xyz',
'persistent':'true',
'content-type':'binary/octet-stream',
'content-length':9999,
'key': "A"
}
var frame = client.send(headers)

然后您的消费者选择器将在 header 上运行。保持消费者的 selector 定义不变。更新生产者后它应该可以工作。

就其价值而言,选择器使用 here 中描述的 SQL92 条件表达式语法的一个子集(向下滚动到 "Message Selectors" 部分)。为此引用 JMS 文档可能看起来很奇怪,但 STOMP 规范没有定义与选择器相关的任何内容。但是,为了方便起见,已经为其 JMS 客户端(如 ActiveMQ)实现它的代理将其公开给 STOMP 客户端。