2016-07-13 11 views
0

私はRabbitMQの一般的な使用例と考えています。 ワーカーキュー - サーバーはユーザーからの要求を取得し、後で処理するためにキューに格納します。問題は、タスクの一部は数分かかることがあり、そして私はいない自動ACKすることを決めたということです:Rabbitmq - メッセージを自動的に拒否しない場合の処理​​方法

私は仕事が終了したときに確認応答したい
GetResponse response = channel.basicGet(queueName, false); 

私が知っていることから、

channel.basicAck(deliveryTag, false); 

https://www.rabbitmq.com/confirms.html(「同じチャンネルにbasic.ackを送信する」 - メッセージを受信したのと同じチャンネルで確認が必要です)。

私はチャンネルへのメッセージのマップを持っていることに決めました(私の場合、メッセージごとに1つのチャンネルがあります)。メッセージの作業が完了するたびに、私は感謝します。

私はこのデザインに非常に欠陥があると思います。サーバーに状態を保存するよう強制され、チャンネルを再利用するのではなく、メッセージごとにチャンネルを持つように強制します。

これは広く普及しているユースケースであると確信しています。 1.スレッドローカルチャネルを使用することにしますか?もしそうなら、別のスレッドのメッセージを確認するのはいいですか? 2.このメッセージを保存するよりも、保留メッセージを処理する方がいいですか?>チャネルマップですか?

は私があまりにもひどくjavaのに慣れていないんだけど、私は、スレッドごとに単一のチャネルを持つことが正しいと理解して何からあなたに

答えて

1

ありがとうございます。私はチャネルがスレッドセーフではないと思う。

さらに、チャネルID(または名前または何それはある)を格納し、その同じチャネル上でメッセージを肯定応答(ACK)は、私は個人的にあなたが提供しているものの高レベルの概要と間違って何も表示されません

必要があります。

あなたは正しいですが、「メッセージごとのチャンネル」は悪い考えです。スレッドごとのチャネルでなければならず、同じチャネル上で同じスレッド内で複数のメッセージを消費することができます。

ちょうどそれが消費されたチャネル

+0

にメッセージをACKに必ずとチャネルオブジェクトが何らかの形で閉じている場合、私はそれを再度開くことができます - connection.createChannel(チャネル番号)を - と、そのチャネル上でそれを確認応答? – user967710

+0

また、チャンネルは決して閉じられませんか? – user967710

関連する問題