|
|
Publisert på 09.04.2018 10:23:21
|
|
|
|

Som standard lagres ikke rabbitMQ-kømeldinger på harddisken, noe som betyr at når rabbitMQ-tjenesten startes på nytt, vil meldingene gå tapt.
Vedvarende køer
For eksempel identifiseres persistensen til køendurableis satt til true, noe som betyr at det er en vedvarende kø, og etter at tjenesten er startet på nytt, vil den også eksistere, fordi tjenesten lagrer den vedvarende køen på harddisken, og når tjenesten startes på nytt, vil den gjenopprette den den tidligere lagrede køen. Køen kan opprettholdes, men om meldingene inni er persistente avhenger av persistensinnstillingene til meldingen. Med andre ord, hvis det ikke sendes noen melding i køen før omstarten, avhenger det om den opprinnelige meldingen fortsatt eksisterer i køen etter omstart av meldingsinnstillingene som skjedde da meldingen ble sendt. Hvis du vil at meldingene skal være vedvarende etter en omstart, må du sette identiteten som meldingen er bevart.
Sett opp køpersistens:
Den fjerde parameteren i metoden, autoDelete, er vanligvis oppgitt falsk. Dokumentasjonen beskriver denne parameteren hvis den er sann, noe som betyr at hvis køen ikke lenger brukes (ikke abonneres), vil serveren slette den. Under testingen min, så lenge alle mottakere av tilkoblingsbyttekøen er frakoblet, blir køen slettet, selv om det fortsatt er ubehandlede meldinger i den. RabbitMQ-omstarter vil også fjerne dem. Hvis falsk legges inn, vil ikke tjenesten slette køen, og meldingene i køen vil eksistere hvis alle klientene som er koblet til den blir koblet fra. Avsender kan også legge meldinger i endringskøen når det ikke er noen klientforbindelse, og når klienten kommer opp, vil den motta disse meldingene. Men hvis RabbitMQ-tjenesten startes på nytt, vil køen være borte, og meldingene i den vil naturlig forsvinne.
Den tredje parameteren er eksklusiv, og dokumentasjonen sier at hvis den er sann, brytes forbindelsen til køen, og køen slettes, inkludert meldingene inni.
Den andre parameteren, durable, beskrives i dokumentasjonen som at hvis den er sann, representerer den en vedvarende kø, som også vil eksistere etter at tjenesten starter på nytt. Fordi tjenesten lagrer den vedvarende køen på harddisken, og når tjenesten startes på nytt, vil den bekrefte denne køen. Selvfølgelig må det være når både autoDelete og eksklusiv er falske. Køen kan opprettholdes, men om meldingene inni er persistente avhenger av persistensinnstillingene til meldingen. Med andre ord, hvis det fortsatt er meldinger sendt i køen før omstarten, avhenger det av avsenderens innstillinger for meldingen ved sending om den opprinnelige meldingen fortsatt eksisterer i køen etter omstarten.
Etter at vi har endret koden, prøver vi å kjøre den, og feilen vil være som følger:
Ubehandlet unntak: RabbitMQ.Client.Exceptions.OperationInterruptedException: AMQP-operasjonen ble avbrutt: AMQP close-reason, initiert av Peer, code=406, text="PRECONDITION_FAILED - inequivalent arg 'durable' for kø 'hello' i vhost 'myserver': mottatt 'true' men current er 'false'", classId=50, methodId=10, cause=
Fordi vi har definert en ikke-persistert kø kalt hello. RabbitMQ tillater ikke å omdefinere eksisterende køer med andre parameterinnstillinger.
Det finnes to løsninger:
1: Erklære en kø på nytt med et annet navn, for eksempel my_queue 2: Slett den definerte "hello"-køen med adressen til http://localhost:15672 og logg inn med brukernavn og passord. Standardpassord og brukernavn for RabbitMQ er gjestepassord. Klikk på kolonnen "kø" for å se kølisten, klikk på "hallo"-køen for å utvide kødetaljene. Trekk siden til slutten, det er et element "Slett", klikk på det, klikk på "Slett kø"-knappen, og du kan slette køen. Når koden kjøres, opprettes en hello-kø som støtter persistens.
Persistens av meldinger
Hvis du vil beholde meldingen vedvarende etter en omstart, må du sette meldingen til å bestå. Innstillingen er når avsenderen sender den, noe som er relativt enkelt, og koden er som følger:
DeliveryMode er standard 1, ikke-persistent, og å sette til 2 betyr at meldingen er persistent
Etter at vi har endret koden, prøver vi kun å åpne produsentprogrammet for å sende meldinger, og deretter starte rabbitMQ-tjenesten på nytt, åpne forbrukeren igjen, og oppdage at meldingen ikke er tapt.
(Slutt)
Vedlagt er C#-kildekoden:
Turister, hvis dere vil se det skjulte innholdet i dette innlegget, vær så snill Svare
|
Foregående:Unntaksmelding: "StrongTypingUnntak: IsPrima...Neste:Introduksjon til C#-delegater (delegat, handling, func, predikat)
|