我有一个非常简单的ActiveMQ消息使用者,它在C#中创建如下:
using(IMessageConsumer consumer = session.CreateConsumer(destination,"NMSCorrelationID='<value of correlation id>'")){
/* This Receive(..) operation does not retrieve the message with the correlation id which I confirmed to be available on the queue. */
IMessage message = consumer.Receive(new TimeSpan(1000));
}
但是,如果我在创建消费者时不使用选择器,我可以收到消息。目标是ActiveMQ代理上的队列。我已经尝试使用CorrelationID和JMSCorrelationID作为选择器,但它们都没有工作。 ActiveMQ代理安装了开箱即用的设置。是否有任何特殊设置需要用于选择器才能工作?
答案 0 :(得分:2)
您肯定希望使用 JMSCorrelationID 设置选择器。使用NMSCorrelationID,或只使用CorrelationID将导致它忽略所有消息。我用以下主题和队列测试了以下内容,一切正常。我在ActiveMQ 5.8.0上做过测试,但我很确定这在5.7.0上运行得很好。
IMessageConsumer subscriber = session.CreateConsumer(
"queue://TestCorrelation",
"JMSCorrelationID = 'FOO'",
false);
如果该消费者已将第三个参数(noLocal)设置为true,则代理不会从与生产者相同的连接将消息排入消费者。您需要有两个单独的连接才能使相关ID选择器工作。一个发送消息,一个消费者在另一个连接上接收消息。如果将noLocal设置为 false ,则与生产者在同一连接上的使用者将收到该消息。
如果要测试,也可以尝试在选择器中使用一些通配符。
"JMSCorrelationID LIKE '%FOO%'"
请注意选择器区分大小写。您的相关ID必须完全匹配。