|
|
Opslået på 09/04/2018 10.23.21
|
|
|
|

Som standard bliver rabbitMQ-kømeddelelser ikke lagret på harddisken, hvilket betyder, at når rabbitMQ-tjenesten genstartes, vil beskederne gå tabt.
Køers persistens
For eksempel identificeres køens persistensdurableis sat til true, hvilket betyder, at det er en persistent kø, og efter servicen genstartes, vil den også eksistere, fordi servicen vil gemme den vedvarende kø på harddisken, og når servicen genstartes, vil den genetablere den tidligere vedvarende kø. Køen kan bevares, men om beskederne indeni er persistente, afhænger af beskedens persistensindstillinger. Med andre ord, hvis der ikke sendes nogen besked i køen før genstarten, afhænger det af beskedindstillingerne, der blev sendt efter genstarten, om den oprindelige besked stadig eksisterer i køen efter genstarten. Hvis du vil bevare beskederne efter en genstart, skal du sætte identiteten på, hvor beskeden er bevaret.
Opsæt kø-persistens:
Den fjerde parameter i metoden, autoDelete, angives normalt falsk. Dokumentationen beskriver denne parameter, hvis den er sand, hvilket betyder, at hvis køen ikke længere bruges (ikke abonneres), vil serveren slette den. Under min testning, så længe alle modtagere af forbindelsesændringskøen er afbrudt, bliver køen slettet, selvom der stadig er ubehandlede beskeder i den. RabbitMQ-genstarter vil også fjerne dem. Hvis falsk indtastes, vil tjenesten ikke slette køen, og beskederne i køen vil eksistere, hvis alle klienter, der er forbundet til den, bliver afbrudt. Afsenderen kan også lægge beskeder i ændringskøen, når der ikke er nogen klientforbindelse, og når klienten kommer op, vil den modtage disse beskeder. Men hvis RabbitMQ-tjenesten genstartes, vil køen være væk, og beskederne i den vil naturligt forsvinde.
Den tredje parameter er eksklusiv, og dokumentationen angiver, at hvis den er sand, så brydes forbindelsen til køen, og derefter slettes køen, inklusive beskederne indeni.
Den anden parameter, holdbar, beskrives i dokumentationen som, at hvis den er sand, repræsenterer den en vedvarende kø, som også vil eksistere efter tjenesten genstarter. Fordi tjenesten vil gemme den vedvarende kø på harddisken, og når tjenesten genstartes, vil den bekræfte denne kø. Selvfølgelig må det være sådan, når både autoDelete og eksklusiv er falske. Køen kan bevares, men om beskederne indeni er persistente, afhænger af beskedens persistensindstillinger. Med andre ord, hvis der stadig sendes beskeder i køen før genstarten, afhænger det afsenderens indstillinger for beskeden ved afsendelsen, om den oprindelige besked stadig eksisterer i køen efter genstarten.
Efter vi har ændret koden, prøver vi at køre den, og fejlen vil være som følger:
Ubehandlet undtagelse: RabbitMQ.Client.Exceptions.OperationInterruptedException: AMQP-operationen blev afbrudt: AMQP close-reason, initieret af Peer, kode=406, tekst="PRECONDITION_FAILED - inækvivalent arg 'durable' for kø 'hello' i vhost 'myserver': received 'true' men current is 'false'", classId=50, methodId=10, cause=
Fordi vi har defineret en ikke-persisteret kø kaldet hello. RabbitMQ tillader ikke at omdefinere eksisterende køer med forskellige parameterindstillinger.
Der er to løsninger:
1: Omdeklarer en kø med et andet navn, såsom my_queue 2: Slet den definerede "hello"-kø med adressen på http://localhost:15672 og log ind med brugernavn og adgangskode. Standardadgangskoden og brugernavnet til RabbitMQ er gæste. Klik på kolonnen "kø" for at se kølisten, klik på "hello"-køen for at udvide kødetaljerne. Træk siden til slutningen, der er et punkt "Slet", klik på det, klik på knappen "Slet kø", og du kan slette køen. Når koden køres, oprettes der en hello-kø, der understøtter persistens.
Beskeders persistens
Hvis du vil bevare beskeden efter en genstart, skal du sætte beskeden til at bestå. Indstillingen er, når afsenderen sender den, hvilket er relativt enkelt, og koden er som følger:
DeliveryMode er som standard 1, ikke-persistent, og at sætte til 2 betyder, at beskeden er persistent
Efter vi har ændret koden, prøver vi kun at åbne producer-programmet for at sende beskeder, og genstarter rabbitMQ-tjenesten, åbner consumeren igen og opdager, at beskeden ikke er tabt.
(Slut)
Vedhæftet er C#-kildekoden:
Turister, hvis I vil se det skjulte indhold i dette indlæg, så vær venlig Svar
|
Tidligere:Undtagelsesbesked: "StrongTypingUndtagelse: IsPrima...Næste:Introduktion til C#-delegerede (delegeret, Handling, Afslutning, prædikat)
|