|
|
Geplaatst op 09-04-2018 10:23:21
|
|
|
|

Standaard worden rabbitMQ-wachtrijberichten niet op de harde schijf opgeslagen, wat betekent dat zodra de rabbitMQ-service opnieuw is opgestart, de berichten verloren gaan.
Persistentie van wachtrijen
Bijvoorbeeld, de persistentie van de wachtrij wordt geïdentificeerddurableis ingesteld op true, wat betekent dat het een persistente wachtrij is, en nadat de service is herstart, zal deze ook bestaan, omdat de service de behouden wachtrij op de harde schijf opslaat, en wanneer de service wordt herstart, wordt de eerder bestaande wachtrij opnieuw ingesteld. De wachtrij kan worden behouden, maar of de berichten binnenin persistent zijn, hangt af van de persistentie-instellingen van het bericht. Met andere woorden, als er geen bericht in de wachtrij is verzonden vóór de herstart, hangt het of het oorspronkelijke bericht na het herstarten nog in de wachtrij blijft hangen af van de berichtinstellingen die plaatsvonden bij het verzenden van het bericht. Als je berichten persistent wilt houden na een herstart, moet je de identiteit instellen waarop het bericht wordt gepersisteerd.
Wachtrijpersistentie instellen:
De vierde parameter van de methode, autoDelete, wordt meestal als false ingevoerd. De documentatie beschrijft deze parameter als deze waar is, wat betekent dat als de wachtrij niet langer wordt gebruikt (niet geabonneerd), de server deze zal verwijderen. Tijdens mijn tests, zolang alle ontvangers van de verbindingswijzigingswachtrij zijn losgekoppeld, wordt de wachtrij verwijderd, zelfs als er nog steeds onverwerkte berichten in staan. RabbitMQ-herstarts verwijderen ze ook. Als er vals wordt ingevoerd, verwijdert de dienst de wachtrij niet en blijven de berichten in de wachtrij bestaan als alle clients die ermee verbonden zijn losgekoppeld. De afzender kan ook berichten in de wijzigingswachtrij plaatsen wanneer er geen clientverbinding is, en wanneer de client verschijnt, ontvangt hij deze berichten. Als de RabbitMQ-service echter opnieuw wordt opgestart, verdwijnt de wachtrij en verdwijnen de berichten erin vanzelf.
De derde parameter is exclusief, en de documentatie stelt dat als dat waar is, de verbinding van de wachtrij wordt verbroken en de wachtrij wordt verwijderd, inclusief de berichten binnenin.
De tweede parameter, duurzaam, wordt in de documentatie beschreven als dat als waar is, deze een persistente wachtrij vertegenwoordigt, die ook zal bestaan nadat de dienst opnieuw is opgestart. Omdat de service de persistente wachtrij op de harde schijf opslaat, en wanneer de service wordt herstart, bevestigt hij deze wachtrij. Natuurlijk moet het zo zijn wanneer zowel autoDelete als exclusief onjuist zijn. De wachtrij kan worden behouden, maar of de berichten binnenin persistent zijn, hangt af van de persistentie-instellingen van het bericht. Met andere woorden, als er nog berichten in de wachtrij zijn gestuurd vóór de herstart, hangt het of het oorspronkelijke bericht na de herstart nog in de wachtrij blijft hangen af van de instellingen van de afzender voor het bericht bij het verzenden van het bericht.
Nadat we de code hebben aangepast, proberen we deze uit te voeren, en de foutmelding zal als volgt zijn:
Onbeheerde uitzondering: RabbitMQ.Client.Exceptions.OperationInterruptedException: De AMQP-operatie werd onderbroken: AMQP close-reason, geïnitieerd door Peer, code=406, text="PRECONDITION_FAILED - inequivalent arg 'durable' voor wachtrij 'hello' in vhost 'myserver': ontvangen 'waar' maar current is 'false'", classId=50, methodId=10, cause=
Omdat we een niet-behouden wachtrij hebben gedefinieerd genaamd hello. RabbitMQ staat bestaande wachtrijen niet toe te herdefiniëren met andere parameterinstellingen.
Er zijn twee oplossingen:
1: Een wachtrij opnieuw declareren met een andere naam, zoals my_queue 2: Verwijder de gedefinieerde "hello"-wachtrij met het adres van http://localhost:15672 en log in met de gebruikersnaam en het wachtwoord. Het standaardwachtwoord en gebruikersnaam van RabbitMQ zijn gast. Klik op de kolom "queue" om de wachtrijlijst te zien, klik op de "hello" queue om de wachtrijgegevens uit te breiden. Trek de pagina naar het einde, er staat een item "Verwijderen", klik erop, klik op de knop "Queue verwijderen" en je kunt de wachtrij verwijderen. Wanneer de code wordt uitgevoerd, wordt er een hello-wachtrij aangemaakt die persistentie ondersteunt.
Persistentie van berichten
Als je wilt dat het bericht na een herstart blijft bestaan, moet je het bericht zo instellen dat het blijft bestaan. De instelling is wanneer de zender het verzendt, wat relatief eenvoudig is, en de code is als volgt:
DeliveryMode staat standaard op 1, niet-persistent, en als je het op 2 zet, is het bericht persistent
Nadat we de code hebben aangepast, proberen we alleen het producer-programma te openen om berichten te verzenden, en dan de rabbitMQ-service opnieuw te starten, de consumer opnieuw te openen, en te ontdekken dat het bericht niet verloren is.
(Einde)
Bijgevoegd is de C#-broncode:
Toeristen, als jullie de verborgen inhoud van dit bericht willen zien, alsjeblieft Antwoord
|
Vorig:Uitzonderingsbericht: "StrongTypingException: IsPrima...Volgend:Introductie tot C#-delegates (delegate, Actie, Func, predicaat)
|