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);

コンシューマーが3番目のパラメーター(noLocal)をtrueに設定している場合、ブローカーはプロデューサーと同じ接続からコンシューマーへのメッセージをキューに入れません。相関IDセレクターを機能させるには、2つの別個の接続が必要になります。1つはメッセージを送信し、別の接続のコンシューマーはメッセージを受信します。noLocalをfalseに設定すると、プロデューサーと同じ接続上のコンシューマーがメッセージを受信します。

テストする場合は、セレクターでいくつかのワイルドカードを使用することもできます。

"JMSCorrelationID LIKE '%FOO%'"

セレクターでは大文字と小文字が区別されることに注意してください。相関IDは完全に一致する必要があります。

于 2013-02-21T00:15:54.020 に答える