|
|
Objavljeno na 9. 04. 2018 10:23:21
|
|
|
|

Privzeto sporočila v čakalni vrsti rabbitMQ niso shranjena na trdem disku, kar pomeni, da se ob ponovnem zagonu storitve rabbitMQ sporočila izgubijo.
Obstojnost vrst
Na primer, prepoznamo obstojnost vrstedurableis nastavljen na true, kar pomeni, da gre za trajno čakalno vrsto, nato po ponovnem zagonu storitve tudi ta obstaja, saj storitev shrani trajno vrsto na trdi disk, in ko se storitev ponovno zažene, ponovno vzpostavi prej trajno čakalno vrsto. Čakalna vrsta se lahko ohrani, vendar je pomembno, ali so sporočila v njej trajna, odvisno od nastavitev obstojnosti sporočila. Z drugimi besedami, če pred ponovnim zagonom v čakalni vrsti ni poslanega nobenega sporočila, je odvisno od nastavitev sporočila, ki so se zgodile ob pošiljanju sporočila. Če želite, da sporočila ostanejo vztrajna po ponovnem zagonu, morate nastaviti identiteto, da je sporočilo ohranjeno.
Nastavite obstojnost čakalne vrste:
Četrti parameter metode, autoDelete, se običajno vnese false. Dokumentacija opisuje ta parameter, če je resničen, kar pomeni, da če vrsta ni več uporabljena (ni naročena), jo strežnik izbriše. Med mojim testiranjem, dokler so vsi prejemniki vrste za spremembo povezave odklopljeni, se čakalna vrsta izbriše, tudi če so v njej še vedno neobdelana sporočila. Ponovni zagoni RabbitMQ jih bodo prav tako odstranili. Če je vnesena laž, storitev vrste ne bo izbrisala in sporočila v vrsti bodo obstajala, če so vsi odjemalci, povezani nanjo, odklopljeni. Pošiljatelj lahko sporočila vključi tudi v čakalno vrsto sprememb, ko ni povezave s stranko, in ko odjemalec pride, prejme ta sporočila. Če pa se storitev RabbitMQ ponovno zažene, čakalna vrsta izgine, sporočila v njej pa naravno izginejo.
Tretji parameter je izključujoč, dokumentacija pa navaja, da če je res, se povezava vrste prekine, nato pa se vrsta izbriše, vključno s sporočili v njej.
Drugi parameter, vzdržljiv, je v dokumentaciji opisan tako, da če je res, predstavlja trajno čakalno vrsto, ki bo obstajala tudi po ponovnem zagonu storitve. Ker storitev shrani trajno vrsto na trdi disk in ob ponovnem zagonu storitve to vrsto ponovno potrdi. Seveda mora biti, ko sta tako autoDelete kot exclusive napačna. Čakalna vrsta se lahko ohrani, vendar je pomembno, ali so sporočila v njej trajna, odvisno od nastavitev obstojnosti sporočila. Z drugimi besedami, če so sporočila še vedno poslana v čakalni vrsti pred ponovnim zagonom, ali izvirno sporočilo še vedno obstaja v vrsti po ponovnem zagonu, je odvisno od nastavitv pošiljatelja za sporočilo ob pošiljanju sporočila.
Ko kodo spremenimo, jo poskusimo zagnati, napaka pa bo naslednja:
Neobdelana izjema: RabbitMQ.Client.Exceptions.OperationInterruptedException: Operacija AMQP je bila prekinjena: AMQP close-reason, iniciirana s strani Peer, code=406, text="PRECONDITION_FAILED - inequivalent arg 'durable' for queue 'hello' v vhost 'myserver': prejeto 'true', a current is 'false'", classId=50, methodId=10, cause=
Ker smo določili netrajno čakalno vrsto z imenom hello. RabbitMQ ne omogoča ponovnega definiranja obstoječih vrst z različnimi nastavitvami parametrov.
Obstajata dve rešitvi:
1: Ponovno razglasite vrsto z drugačnim imenom, na primer my_queue 2: Izbrišite določeno "hello" vrsto z naslovom http://localhost:15672 in se prijavite z uporabniškim imenom in geslom. Privzeto geslo in uporabniško ime za RabbitMQ sta gostujoča. Kliknite na stolpec "queue" za ogled seznama vrst, kliknite na čakalno vrsto "hello" za razširitev podrobnosti vrste. Povleci stran na konec, tam je element "Izbriši", klikni nanj, klikni gumb "Izbriši vrstno vrsto" in lahko izbrišeš vrsto. Ko se koda zažene, se ustvari čakalna vrsta, ki podpira obstojnost.
Obstojnost sporočil
Če želite, da sporočilo ostane trajno po ponovnem zagonu, morate nastaviti, da sporočilo ostane trajno. Nastavitev je, ko pošiljatelj pošlje sporočilo, kar je razmeroma preprosto, koda pa je naslednja:
DeliveryMode privzeto nastavi 1, netrajno, nastavitev na 2 pa pomeni, da je sporočilo trajno
Ko spremenimo kodo, poskušamo odpreti program Producer samo za pošiljanje sporočil, nato ponovno zagnati storitev rabbitMQ, ponovno odpreti potrošnika in ugotoviti, da sporočilo ni izgubljeno.
(Konec)
Priložena je izvorna koda C#:
Turisti, če želite videti skrito vsebino te objave, prosim Odgovoriti
|
Prejšnji:Izjema sporočila: "StrongTypingException: IsPrima...Naslednji:Uvod v C# delegate (delegate, Action, Func, predikat)
|