ActiveMQ 5.7.0选择器在C#中不起作用

本文关键字:不起作用 选择器 ActiveMQ | 更新日期: 2023-09-27 17:58:36

我有一个非常简单的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代理是使用现成的设置安装的。有什么特殊的设置需要我使用选择器来工作吗?

ActiveMQ 5.7.0选择器在C#中不起作用

您肯定希望使用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必须完全匹配。