Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 44647|Svare: 8

[WinForm] rabbitMQ Køkø Meldingspersistens [med kildekode]

[Kopier lenke]
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å snillSvare





Foregående:Unntaksmelding: "StrongTypingUnntak: IsPrima...
Neste:Introduksjon til C#-delegater (delegat, handling, func, predikat)
Publisert på 09.04.2018 13:17:51 |
Lær å lære
Publisert på 25.06.2019 23:22:47 |
Lær å lære
Publisert på 29.06.2019 09:36:23 |
Hvorfor så jeg ikke demoen, jeg må svare for å se den
Publisert på 09.07.2019 17:34:42 |
Jeg vil ha C#-kildekode
Publisert på 24.07.2019 14:21:51 |
Det er bra, det er akkurat det jeg trenger
Publisert på 11.04.2020 14:34:54 |
Lær det
Publisert på 01.01.2022 14:45:24 |
1111111111111111
 Vert| Publisert på 03.05.2023 22:12:22 |
Parametere for RabbitMQ-køen og deres betydninger


/**
* Konstruer en ny kø, gitt navn, holdbarhetsflagg, auto-slette-flagg og argumenter.
* @param navngi navnet på køen – må ikke være null; Sett til "" for at megleren skal generere navnet.
* @param varig sant hvis vi erklærer en varig kø (køen vil overleve en serveromstart)
* @param eksklusivt sant hvis vi erklærer en eksklusiv kø (køen vil kun bli brukt av spillerens
* forbindelse)
* @param autoDelete true hvis serveren skal slette køen når den ikke lenger er i bruk
* @param argumentene argumentene som brukes til å erklære køen
*/
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(name, "'name' kan ikke være null");
   this.name = navn;
   this.actualName = StringUtils.hasText(name) ? navn
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = durable;
   this.exclusive = eksklusiv;
   this.autoDelete = autoDelete;
   dette.argumenter = argumenter != null ? argumenter : ny HashMap<>();
}

Parameterintroduksjon:
1. navn: navnet på køen;
2. actualName: Det virkelige navnet på køen, navneparameteren brukes som standard, hvis navnet er tomt, genereres en i henhold til reglene;
3. varig: om den er vedvarende;
4. Eksklusivt: enten det er eksklusivt eller eksklusivt;
5. autoDelete: om man skal slette automatisk;
6. Argumenter: Andre attributtparametere i køen har følgende alternativer, se Argumenter i figur 2:
(1) x-melding-ttl: utløpstiden til meldingen, i millisekunder;
(2) x-utløp: køens utløpstid, hvor lenge køen slettes hvis den ikke blir aksessert, enhet: millisekunder;
(3) x-max-lengde: maksimal lengde på køen, hvis den overstiger maksimumsverdien, vil meldingen bli slettet fra køhodet;
(4) x-maks-lengde-bytes: innholdet i kømeldingen opptar maksimal plass, begrenset av minnestørrelsen, og hvis det overstiger denne terskelen, vil meldingen bli slettet fra køhodet;
(5) x-overflow: Sett kø-overflow-oppførselen. Dette avgjør hva som skjer med meldingen når maksimal lengde på køen nås. Gyldige verdier er drop-head, reject-publish eller reject-publish-dlx. Quorum-køtyper støtter kun drop-head;
(6) x-død-bokstav-utveksling: navnet på død-bokstav-utvekslingen, og meldingene som har utløpt eller blitt slettet (på grunn av lang kølengde eller at avstanden overstiger terskelen) kan spesifiseres til å sendes til utvekslingen;
(7) x-død-bokstav-ruting-nøkkel: Routingnøkkelen til dead-letter-meldingen, som vil bli brukt når meldingen sendes til dead-letter exchanger, hvis ikke satt, vil den opprinnelige rutingnøkkelverdien for meldingen bli brukt
(8) x-enkelt-aktiv-forbruker: indikerer om køen er en enkelt aktiv forbruker, hvis sann, er det bare én forbruker i den registrerte forbrukergruppen som konsumerer meldinger, de andre ignoreres, og falsk når meldingen distribueres til alle forbrukere i en løkke (standard falsk)
(9) x-max-prioritet: det maksimale antallet prioriteringer som skal støttes av køen; Hvis den ikke er satt, vil køen ikke støtte meldingsprioritet;
(10) x-kø-modus (Lazy mode): Sett køen til forsinkelsesmodus, hold så mange meldinger som mulig på disken for å redusere RAM-bruken; Hvis den ikke er satt, vil køen beholde en minnecache for å levere meldinger så raskt som mulig;
(11) x-queue-master-locator: Sett masternodeinformasjonen til speilkøen i klyngemodus.


Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com