2016-09-25 12 views
0

私は、リスナーが何らかのプリフェッチカウントを持つキューを待ち受けているキューを持っています。これは10個の要素をいくつかのプロセッサに渡しています。 プロセッサが何らかのタスクを処理している可能性があります。私はそのような情報を受け取った後、キューからデキューしたい(channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);)。ChannelAwareMessageListenerを使用したコールバックメカニズム機能

これを達成するにはどうすればよいでしょうか? 1つのアイデアが私に別のキューを作成し、プロセッサから配信タグとチャネル参照を持つ処理済メッセージをプッシュします。そして、私はこの新しい待ち行列に耳を傾け、それに基づいて肯定を行います。

答えて

0

チャンネルはスレッドセーフではありません - rabbitmq documentationを参照してください。

チャネルインスタンスはスレッド間で共有してはなりません。アプリケーションは、複数のスレッドにわたって同じチャネルを共有するのではなく、スレッドごとにチャネルを使用するほうがよいでしょう。チャネル上の操作の中には、同時に起動するのが安全なものもありますが、ワイヤ上でフレームのインターリーブが正しくないものもあります。スレッド間のチャネルを共有すると、* Publisherの確認にも影響します。

リスナースレッド自体にChannelAwareMessageListenerで公開されているチャネルのみを使用してください。

同時実行を実現しようとしている場合は、メッセージを他のスレッドに渡すのではなく、コンテナのプロパティを使用する方が一般的に適しています。

関連する問題