Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 44647|Antwort: 8

[WinForm] rabbitMQ Queue Queue Nachrichtenpersistenz [mit Quellcode]

[Link kopieren]
Veröffentlicht am 09.04.2018 10:23:21 | | | |
Standardmäßig werden rabbitMQ-Warteschlangen-Nachrichten nicht auf der Festplatte gespeichert, was bedeutet, dass nach Neustart des rabbitMQ-Dienstes die Nachrichten verloren gehen.

Persistenz von Warteschlangen

Zum Beispiel wird die Persistenz der Warteschlange identifiziertdurableis auf true gesetzt, was bedeutet, dass es sich um eine persistente Warteschlange handelt, und nach dem Neustart des Dienstes existiert er auch, da der Dienst die bestehende Warteschlange auf der Festplatte speichert, und wenn der Dienst neu gestartet wird, stellt er die zuvor gespeicherte Warteschlange wieder her. Die Warteschlange kann gepflegt werden, aber ob die Nachrichten darin persistent sind, hängt von den Persistenzeinstellungen der Nachricht ab. Mit anderen Worten: Wenn vor dem Neustart keine Nachricht in der Warteschlange gesendet wird, hängt es davon ab, ob die ursprüngliche Nachricht nach dem Neustart noch in der Warteschlange existiert, von den Nachrichteneinstellungen, die beim Senden der Nachricht erfolgten.
Wenn Sie Nachrichten nach einem Neustart persistent halten möchten, müssen Sie die Identität festlegen, in der die Nachricht gespeichert wird.

Warteschlangenpersistenz einrichten:




Der vierte Parameter der Methode, autoDelete, wird üblicherweise als falsch eingegeben. Die Dokumentation beschreibt diesen Parameter, falls zutreffend, was bedeutet, dass der Server sie löscht, wenn die Warteschlange nicht mehr genutzt (nicht abonniert wird). Während meiner Tests wird die Warteschlange gelöscht, solange alle Empfänger der Verbindungsänderungs-Warteschlange getrennt sind, selbst wenn noch unverarbeitete Nachrichten darin sind. RabbitMQ-Neustarts entfernen sie ebenfalls. Wenn falsch eingegeben wird, löscht der Dienst die Warteschlange nicht und die Nachrichten in der Warteschlange existieren, wenn alle angeschlossenen Clients getrennt sind. Der Absender kann auch Nachrichten in die Änderungswarteschlange legen, wenn keine Client-Verbindung besteht, und wenn der Client aufgerufen wird, erhält er diese Nachrichten. Wenn der RabbitMQ-Dienst jedoch neu gestartet wird, ist die Warteschlange verschwunden und die Nachrichten darin verschwinden natürlich.

Der dritte Parameter ist exklusiv, und die Dokumentation besagt, dass, falls zutreffend, die Verbindung der Warteschlange unterbrochen wird und die Warteschlange gelöscht wird, einschließlich der darin enthaltenen Nachrichten.

Der zweite Parameter dauerhaft wird in der Dokumentation so beschrieben, dass er, falls wahr, eine persistente Warteschlange darstellt, die auch nach dem Neustart des Dienstes existiert. Denn der Dienst speichert die persistente Warteschlange auf der Festplatte, und wenn der Dienst neu gestartet wird, bestätigt er diese Warteschlange. Natürlich muss es der Fall sein, wenn sowohl AutoDelete als auch exklusiv falsch sind. Die Warteschlange kann gepflegt werden, aber ob die Nachrichten darin persistent sind, hängt von den Persistenzeinstellungen der Nachricht ab. Mit anderen Worten: Wenn vor dem Neustart noch Nachrichten in der Warteschlange gesendet werden, hängt es davon ab, ob die ursprüngliche Nachricht nach dem Neustart noch in der Warteschlange existiert, von den Einstellungen des Absenders für die Nachricht beim Senden der Nachricht.


Nachdem wir den Code geändert haben, versuchen wir, ihn auszuführen, und der Fehler lautet wie folgt:

Unbehandelte Ausnahme: RabbitMQ.Client.Exceptions.OperationInterruptedException: Die AMQP-Operation wurde unterbrochen: AMQP close-reason, initiiert von Peer, code=406, text="PRECONDITION_FAILED - Inequivalent arg 'durable' für die Warteschlange 'hello' in vhost 'myserver': received 'true', aber current is 'false'", classId=50, methodId=10, cause=



Weil wir eine nicht persistierte Warteschlange namens Hallo definiert haben. RabbitMQ erlaubt keine Neudefinition bestehender Warteschlangen mit anderen Parametereinstellungen.

Es gibt zwei Lösungen:

1: Eine Warteschlange mit einem anderen Namen neu deklarieren, zum Beispiel my_queue
2: Löschen Sie die definierte "Hallo"-Warteschlange mit der Adresse http://localhost:15672 und melden Sie sich mit Benutzernamen und Passwort an. Das Standardpasswort und der Benutzername von RabbitMQ sind Gast. Klicken Sie auf die Spalte "Warteschlange", um die Warteschlangenliste zu sehen, und klicken Sie auf die "Hallo"-Warteschlange, um die Warteschlangendetails zu erweitern. Zieh die Seite ans Ende, dort gibt es einen Punkt "Löschen", klicke darauf, klicke auf die Schaltfläche "Warteschlange löschen" und du kannst die Warteschlange löschen. Wenn der Code ausgeführt wird, wird eine Hello-Warteschlange erstellt, die Persistenz unterstützt.



Persistenz von Nachrichten

Wenn Sie möchten, dass die Nachricht nach einem Neustart persistent bleibt, müssen Sie die Nachricht so einstellen, dass sie erhalten bleibt. Die Einstellung ist, wenn der Sender sie sendet, was relativ einfach ist, und der Code lautet wie folgt:


DeliveryMode steht standardmäßig auf 1, nicht persistent, und eine Einstellung auf 2 bedeutet, dass die Nachricht persistent ist

Nachdem wir den Code geändert haben, versuchen wir, nur das Producer-Programm zu öffnen, um Nachrichten zu senden, dann den rabbitMQ-Service neu zu starten, den Consumer erneut zu öffnen und festzustellen, dass die Nachricht nicht verloren geht.

(Ende)

Angehängt ist der C#-Quellcode:

Touristen, wenn ihr den versteckten Inhalt dieses Beitrags sehen wollt, bitteAntwort





Vorhergehend:Ausnahme-Nachricht: "StrongTypingException: IsPrima...
Nächster:Einführung in C#-Delegierte (Delegierte, Aktion, Func, Prädikat)
Veröffentlicht am 09.04.2018 13:17:51 |
Lernen lernen
Veröffentlicht am 25.06.2019 23:22:47 |
Lernen lernen
Veröffentlicht am 29.06.2019 09:36:23 |
Warum habe ich die Demo nicht gesehen? Ich muss antworten, um sie zu sehen.
Veröffentlicht am 09.07.2019 17:34:42 |
Ich möchte C#-Quellcode
Veröffentlicht am 24.07.2019 14:21:51 |
Es ist gut, es ist genau das, was ich brauche
Veröffentlicht am 11.04.2020 14:34:54 |
Lerne es
Veröffentlicht am 01.01.2022 14:45:24 |
1111111111111111
 Vermieter| Veröffentlicht am 03.05.2023 22:12:22 |
Parameter der Warteschlange von RabbitMQ und ihre Bedeutungen


/**
* Erstelle eine neue Warteschlange, mit Namen, Haltbarkeitsflag, Auto-Delete-Flag und Argumenten.
* @param Namen der Warteschlange – darf nicht null sein; Setze auf "", damit der Makler den Namen generiert.
* @param dauerhaft wahr, wenn wir eine dauerhafte Warteschlange deklarieren (die Warteschlange übersteht einen Server-Neustart)
* @param exklusiv wahr, wenn wir eine exklusive Warteschlange deklarieren (die Warteschlange wird nur vom Alleinschalter verwendet
* Verbindung)
* @param autoDelete true, wenn der Server die Warteschlange löschen sollte, wenn sie nicht mehr genutzt wird
* @param Argumente, die Argumente, die zur Deklaration der Warteschlange verwendet werden
*/
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(name, "'name' kann nicht null sein");
   this.name = Name;
   this.actualName = StringUtils.hasText(name) ? Name
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = durable;
   this.exklusiv = exklusiv;
   this.autoDelete = autoDelete;
   this.arguments = argumente != null ? Argumente : neues HashMap<>();
}

Parameter-Einführung:
1. Name: Der Name der Warteschlange;
2. actualName: Der echte Name der Warteschlange, der Name-Parameter wird standardmäßig verwendet; ist der Name leer, wird einer gemäß den Regeln generiert;
3. Dauerhaft: ob es persistent ist;
4. Exklusiv: ob es exklusiv oder exklusiv ist;
5. autoDelete: ob automatisch gelöscht werden soll;
6. Argumente: Andere Attributparameter der Warteschlange haben folgende Optionen, siehe Argumente in Abbildung 2:
(1) x-message-ttl: die Ablaufzeit der Nachricht in Millisekunden;
(2) x-Ablauf: Warteschlangenablaufzeit, wie lange die Warteschlange gelöscht wird, wenn nicht auf sie zugegriffen wird, Einheit: Millisekunden;
(3) x-max-länge: Die maximale Warteschlange, wenn sie den maximalen Wert übersteigt, wird die Nachricht aus dem Warteschlangenkopf gelöscht;
(4) x-max-länge-Bytes: Der Inhalt der Warteschlangennachrichten nimmt den maximalen Speicherplatz ein, begrenzt durch die Speichergröße, und wenn er diesen Schwellenwert überschreitet, wird die Nachricht aus dem Warteschlangenkopf gelöscht;
(5) x-Overflow: Stellen Sie das Queue-Overflow-Verhalten ein. Dies bestimmt, was mit der Nachricht passiert, wenn die maximale Warteschlange erreicht ist. Gültige Werte sind Drop-Head, Reject-Publish oder Reject-Publish-DLX. Quorum-Warteschlangentypen unterstützen nur Drop-Head;
(6) x-tot-Buchstaben-Austausch: Der Name des toten Buchstabenaustauschs und die Nachrichten, die abgelaufen oder gelöscht wurden (aufgrund der langen Wartelänge oder des Platzes, der die Schwelle überschreitet), können als Senden an die Vermittlungsstelle angegeben werden;
(7) x-Totbrief-Routing-Key: Der Routing-Key der Dead-Letter-Nachricht, der verwendet wird, wenn die Nachricht an den Dead-Letter Exchanger gesendet wird; falls nicht gesetzt, wird der ursprüngliche Routing-Key-Wert der Nachricht verwendet
(8) x-einzelner-aktiver-Konsument: Gibt an, ob die Warteschlange ein einzelner aktiver Konsument ist; falls wahr, konsumiert nur ein Konsument in der registrierten Verbrauchergruppe Nachrichten, die anderen werden ignoriert, und falsch, wenn die Nachricht in einer Schleife an alle Konsumenten verteilt wird (Standard falsch)
(9) x-max-Priorität: die maximale Anzahl der von der Warteschlange unterstützten Prioritäten; Wenn nicht gesetzt, unterstützt die Warteschlange keine Nachrichtenpriorität;
(10) x-queue-mode (Lazy mode): Die Warteschlange auf Verzögerungsmodus setzen, so viele Nachrichten wie möglich auf der Festplatte speichern, um den RAM-Verbrauch zu reduzieren; Wenn nicht gesetzt, speichert die Warteschlange einen Speichercache, um Nachrichten so schnell wie möglich zuzustellen;
(11) x-queue-master-locator: Stellen Sie die Master-Node-Informationen der Spiegelwarteschlange im Cluster-Modus ein.


Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com