6

C# .NET アプリケーションで RabbitMQ.Client (ランタイム バージョン v2.0.50727、バージョン 2.8.1.0) を使用しています。

次のような接続を作成します。

using (IConnection connection = _factory.CreateConnection())
{
    using (IModel channel = connection.CreateModel())
    {
        // code...
    }
}

アプリケーションを適切に閉じると、チャネルと接続が閉じられます。ただし、アプリケーションが誤って閉じられた場合 (PC の再起動ボタンを押すなど) は、そうではありません。アプリケーションを起動する前に、すべての不要な接続 (アプリケーションの他のインスタンスが誤って別の場所で実行されている場合は、以前のセッションまたは他のアプリケーションから) を確実に閉じたいと思います。

ハートビートを使用する可能性があることはわかっていますが、アプリケーションが何かを開始するのに非常に長い時間がかかる可能性があります (何時間も接続を開いて使用していません)。だから私はハートビートは最高のものではないと思います。

RMQ で開かれているすべての接続を閉じるにはどうすればよいですか? (または、さらに良いことに、特定の 1 つの IP を除いて、すべての開いている接続)?

よろしく!

4

3 に答える 3

1

Heartbeats が最適なソリューションのようです。同じ理由で、RabbitMQ アプリにハートビートを追加しました (不適切なシャットダウン)。メッセージ間に長い時間のギャップがあってもかまいません。ハートビートは、両側で接続がまだ開いていることを確認するだけです。

于 2012-11-14T03:42:25.077 に答える
0

コンソールでワーカーを開いてctrl + cで停止すると、同じ問題が発生しました。プロセスが閉じられた後、接続はまだ存在し、管理パネルに表示されます。

  • 1 つの解決策は、RabbitMQ 管理パネルで接続を閉じることです
  • または、プロセスを見つけて強制終了できます manual sudo kill -9 pid
  • または、接続セットHEARTBEATを開いたとき。[死んだ TCP 接続]を読む
于 2015-12-18T14:12:14.397 に答える