Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 44647|Antwoord: 8

[WinForm] rabbitMQ Queue Queue Message Persistence [met broncode]

[Link kopiëren]
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, alsjeblieftAntwoord





Vorig:Uitzonderingsbericht: "StrongTypingException: IsPrima...
Volgend:Introductie tot C#-delegates (delegate, Actie, Func, predicaat)
Geplaatst op 09-04-2018 13:17:51 |
Leer leren
Geplaatst op 25-06-2019 23:22:47 |
Leer leren
Geplaatst op 29-06-2019 09:36:23 |
Waarom heb ik de demo niet gezien, ik moet antwoorden om hem te kunnen zien
Geplaatst op 09-07-2019 17:34:42 |
Ik wil C#-broncode
Geplaatst op 24-07-2019 14:21:51 |
Het is goed, het is precies wat ik nodig heb
Geplaatst op 11-04-2020 14:34:54 |
Leer het
Geplaatst op 01-01-2022 14:45:24 |
1111111111111111
 Huisbaas| Geplaatst op 03-05-2023 22:12:22 |
Parameters van de Queue of RabbitMQ en hun betekenissen


/**
* Bouw een nieuwe wachtrij, krijg een naam, duurzaamheidsvlag, auto-delete vlag en argumenten.
* @param naam van de wachtrij - mag niet nul zijn; Zet op "" zodat de makelaar de naam genereert.
* @param duurzaam als we een duurzame wachtrij declareren (de wachtrij overleeft een serverherstart)
* @param exclusief waar als we een exclusieve wachtrij declareren (de wachtrij wordt alleen gebruikt door de declarant
* verbinding)
* @param autoDelete true als de server de wachtrij moet verwijderen wanneer deze niet meer in gebruik is
* @param argumenten de argumenten die gebruikt zijn om de wachtrij te declareren
*/
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(name, "'name' kan niet null zijn");
   this.name = naam;
   this.actualName = StringUtils.hasText(name) ? Naam
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.duurzaam = duurzaam;
   this.exclusief = exclusief;
   this.autoDelete = autoDelete;
   dit.argumenten = argumenten != nul ? argumenten : nieuwe HashMap<>();
}

Parameterintroductie:
1. naam: de naam van de wachtrij;
2. actualName: De echte naam van de wachtrij, de naamparameter wordt standaard gebruikt; als de naam leeg is, wordt er één gegenereerd volgens de regels;
3. Duurzaam: of het persistent is;
4. Exclusief: of het nu exclusief of exclusief is;
5. autoDelete: of automatisch verwijderd moet worden;
6. Argumenten: Andere attribuutparameters van de wachtrij hebben de volgende opties, zie Argumenten in Figuur 2:
(1) x-message-ttl: de vervaldatum van het bericht, in milliseconden;
(2) x-vervaldatum: vervaltijd van de wachtrij, hoe lang de wachtrij wordt verwijderd als er geen toegang is, eenheid: milliseconden;
(3) x-max-length: de maximale lengte van de wachtrij, als deze de maximale waarde overschrijdt, wordt het bericht uit de wachtrijheader verwijderd;
(4) x-max-lengte-bytes: de inhoud van het wachtrijbericht neemt de maximale ruimte in, beperkt door de geheugengrootte, en als deze drempel overschrijdt, wordt het bericht uit de wachtrijheader verwijderd;
(5) x-overflow: Stel het queue overflow-gedrag in. Dit bepaalt wat er met het bericht gebeurt wanneer de maximale lengte van de wachtrij is bereikt. Geldige waarden zijn drop-head, reject-publish of reject-publish-dlx. Quorum-wachtrijtypes ondersteunen alleen drop-head;
(6) x-dead-letter-exchange: de naam van de dead-letter exchange, en de berichten die zijn verlopen of verwijderd (vanwege de lange wachtrijlengte of de ruimte die de drempel overschrijdt) kunnen worden gespecificeerd om naar de exchange te worden gestuurd;
(7) x-dode-letter-routeringssleutel: De routeringssleutel van het dode-letterbericht, die wordt gebruikt wanneer het bericht naar de dode-letterwisselaar wordt gestuurd; als deze niet is ingesteld, wordt de oorspronkelijke routeringssleutelwaarde van het bericht gebruikt
(8) x-enkele-actieve-consument: geeft aan of de wachtrij een enkele actieve consument is; als het waar is, consumeert slechts één consument in de geregistreerde consumentengroep berichten, de anderen worden genegeerd, en false wanneer het bericht in een lus aan alle consumenten wordt verspreid (standaard onwaar)
(9) x-max-prioriteit: het maximale aantal prioriteiten dat door de wachtrij ondersteund moet worden; Als deze niet is ingesteld, ondersteunt de wachtrij geen berichtprioriteit;
(10) x-queue-mode (Lazy mode): Zet de wachtrij op delay-modus, bewaar zoveel mogelijk berichten op de schijf om het RAM-gebruik te verminderen; Als deze niet is ingesteld, houdt de wachtrij een geheugencache aan om berichten zo snel mogelijk af te leveren;
(11) x-queue-master-locator: Stel de master-node-informatie van de spiegelwachtrij in clustermodus.


Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com