この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 44647|答える: 8

[WinForm] rabbitMQ キューキューメッセージの永続性[ソースコード付き]

[リンクをコピー]
掲載地 2018/04/09 10:23:21 | | | |
デフォルトでは、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#のソースコードです:

観光客の皆さん、この投稿の隠された内容を見たい方は、どうぞ答える





先の:例外メッセージ:「StrongTypingException: IsPrima...
次に:C#代理(delegate、Action、Func、述語)への入門
掲載地 2018/04/09 13:17:51 |
学ぶために
掲載地 2019/06/25 23:22:47 |
学ぶために
掲載地 2019/06/29 9:36:23 |
なぜデモを見なかったのか、返信しないと見られない
掲載地 2019/07/09 17:34:42 |
C#のソースコードが欲しいです
掲載地 2019/07/24 14:21:51 |
いいよ、まさに僕に必要なものだ
掲載地 2020/04/11 14:34:54 |
覚えてみろ
掲載地 2022/01/01 14:45:24 |
1111111111111111
 地主| 掲載地 2023/05/03 22:12:22 |
RabbitMQのキューのパラメータとその意味


/**
* 名前、耐久性フラグ、自動削除フラグ、引数を与えた新しいキューを構築します。
* @param キュー名 - nullであってはなりません; 「」に設定すると、ブローカーが名前を生成します。
* durable true @param durable true(サーバー再起動後もキューが残る)を宣言する場合
* 排他的な真@param、排他キューを宣言する場合(キューは宣言者のキューのみ使用)
* つながり)
* サーバーがキューを使用していない時に削除すべき場合、autoDelete true@param
* @param 引数 キューを宣言するために使用された引数
*/
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(name、「'name' はnullではありえない」));
   this.name = 名前;
   this.actualName = StringUtils.hasText(name) ? 名称
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = 耐久性;
   this.exclusive = 排他的;
   this.autoDelete = autoDelete;
   this.arguments = arguments != null ? arguments : new HashMap<>();
}

パラメータ紹介:
1. 名前:キューの名前;
2. actualName:キューの本名、名前パラメータがデフォルトで使われます。名前が空の場合はルールに従って名前が生成されます。
3. 耐久性:持続性の有無;
4. 排他的:排他的か排他的か;
5. autoDelete:自動削除するかどうか;
6. 引数:キューの他の属性パラメータには以下のオプションがあります。図2の引数を参照してください:
(1) x-message-ttl:メッセージの有効期限(ミリ秒単位);
(2) x-expires:キューの有効期限、アクセスされなかった場合にキューが削除される時間(単位:ミリ秒);
(3) x-max-length:キューの最大長で、最大値を超えるとキューヘッダーからメッセージが削除されます。
(4) x-max-length-bytes:キューメッセージの内容はメモリサイズに制限され最大容量を占め、この閾値を超えるとキューヘッダーからメッセージが削除されます。
(5) x-overflow:キューオーバーフローの動作を設定します。 これにより、キューの最大長に達したときにメッセージに何が行われるかが決まります。 有効な値はドロップヘッド、拒否-公開、または拒否-公開-dlxです。 クオーラムキュータイプはドロップヘッドのみをサポートします。
(6) x-dead-letter-exchange:死文字交換の名称と、期限切れまたは削除されたメッセージ(長いキュー長や閾値を超える空き容量のため)を交換に送信することを指定できます。
(7) x-デッドレタールーティングキー:デッドレターメッセージのルーティングキーで、メッセージがデッドレター交換機に送信される際に使用されます。設定されていない場合は、元のルーティングキー値が使われます
(8) x-single-active-consumer:キューが単一のアクティブコンシューマーであるかどうかを示します。もし真の場合、登録されたコンシューマーグループ内で1つのコンシューマーのみがメッセージを消費し、他は無視されます。また、メッセージがループ内で全てのコンシューマーに配布された場合はfalse(デフォルトはfalse)
(9) x-max-priority:キューがサポートする最大優先度数; 設定されていない場合、キューはメッセージの優先度をサポートしません。
(10) x-queue-mode(レイジーモード):キューを遅延モードに設定し、RAM使用量を減らすためにできるだけ多くのメッセージをディスク上に保持します。 設定されていない場合、キューはメッセージをできるだけ早く届けるためにメモリキャッシュを保持します。
(11) x-queue-master-locator:クラスタモードでミラーキューのマスターノード情報を設定します。


免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com