|
|
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, bitte Antwort
|
Vorhergehend:Ausnahme-Nachricht: "StrongTypingException: IsPrima...Nächster:Einführung in C#-Delegierte (Delegierte, Aktion, Func, Prädikat)
|