デフォルトでは、rabbitMQのキューメッセージはハードディスクに永続化されないため、rabbitMQサービスが再起動されるとメッセージは失われます。
キューの永続性
例えば、キューの永続性が特定されますdurableisはtrueに設定されており、永続的なキューであることを意味しますサービスが再起動された後も、永続キューをハードディスクに保存し、サービスが再起動すると以前に永続キューだったものを再確立するため、そのキューも存在します。 キューは永続化可能ですが、メッセージが永続的かどうかはメッセージの永続性設定に依存します。 つまり、再起動前にキューに送信されたメッセージがない場合、再起動後に元のメッセージがキューに残るかどうかは、送信時に設定されたメッセージ設定によって異なります。 再起動後もメッセージを永続的に保ちたい場合は、メッセージが永続化されているかどうかの識別子を設定する必要があります。
キュー永続化の設定:
メソッドの4つ目のパラメータであるautoDeleteは通常、falseと入力されます。 ドキュメントではこのパラメータが真であると説明されており、キューが使われなくなった(サブスクライブされていない)場合、サーバーはそれを削除します。 テスト中、接続変更キューのすべての受信者が切断されている限り、キューは削除されます。たとえ未処理のメッセージが残っていてもです。 RabbitMQの再起動も同様に削除します。 falseが入力されると、サービスはキューを削除せず、接続されているすべてのクライアントが切断されてもキュー内のメッセージは存在します。 送信側はクライアント接続がない場合でもメッセージを変更キューに入れることができ、クライアントが起動するとこれらのメッセージを受け取ります。 しかし、RabbitMQサービスを再起動するとキューは消え、メッセージは自然に消えてしまいます。
3つ目のパラメータは排他的で、ドキュメントによると、もしこれが真ならキューの接続が切断され、キュー内のメッセージも含めて削除されます。
2つ目のパラメータであるdurableは、ドキュメントで、もしこれが真であれば永続的なキューを表し、サービス再起動後も存在すると述べています。 サービスは永続キューをハードディスクに保存し、サービスが再起動されるとこのキューを再確認します。 もちろん、autoDeleteとexclusticの両方がfalseの場合は間違いありません。 キューは永続化可能ですが、メッセージが永続的かどうかはメッセージの永続性設定に依存します。 つまり、再起動前にキューに送信されたメッセージがまだある場合、再起動後に元のメッセージがキューに残るかどうかは、送信者がメッセージを送信する際の設定によって異なります。
コードを修正した後、実行を試みると、エラーは以下のようになります。
処理されていない例外:RabbitMQ.Client.Exceptions.OperationInterruptedException:AMQP操作が中断された:AMQPのクローズリーズ理由、ピアによって開始、コード=406、テキスト="PRECONDITION_FAILED - vhost 'myserver' のキュー 'Hello' に対するinequivalent arg 'durable': received 'true' が current は 'false', classId=50, methodId=10, cause=
なぜなら、私たちは「hello」という非永続的なキューを定義しているからです。 RabbitMQは、既存のキューをパラメータ設定を変えて再定義することはできません。
解決策は2つあります。
1: 別の名前でキューを再宣言する(例:my_queue 2: http://localhost:15672 のアドレスで定義された「hello」キューを削除し、ユーザー名とパスワードでログインします。 RabbitMQのデフォルトパスワードとユーザー名はゲストです。 「queue」列をクリックするとキューリストが表示され、「hello」キューをクリックするとキューの詳細が展開されます。 ページを最後まで引き寄せ、「削除」という項目があり、それをクリックして「キューを削除」ボタンを押すと、キューを削除できます。 そしてコードを実行すると、永続性をサポートするHelloキューが作成されます。
メッセージの永続性
再起動後もメッセージを永続的に残したいなら、メッセージを永続化に設定する必要があります。 設定は送信側が送信するタイミングで、比較的シンプルで、コードは以下の通りです:
DeliveryModeはデフォルトで1、非永続化、2に設定するとメッセージは永続的です
コードを修正した後、メッセージ送信のためにプロデューサープログラムだけを開き、その後rabbitMQサービスを再起動し、再びコンシューマーを開いてメッセージが失われていないことを確認します。
(終わり)
添付はC#のソースコードです:
観光客の皆さん、この投稿の隠された内容を見たい方は、どうぞ 答える
|