1

我有一个在 C# 中创建的非常简单的 ActiveMQ 消息使用者,如下所示:

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 代理是使用开箱即用的设置安装的。我需要使用任何特殊设置来使选择器工作吗?

4

1 回答 1

3

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

于 2013-02-21T00:15:54.020 回答