|
|
Paskelbta 2018-04-09 10:23:21
|
|
|
|

Pagal numatytuosius nustatymus rabbitMQ eilės pranešimai neišlieka standžiajame diske, o tai reiškia, kad iš naujo paleidus rabbitMQ paslaugą, pranešimai bus prarasti.
Eilių išlikimas
Pavyzdžiui, nustatomas eilės patvarumaspatvarusyra nustatytas kaip true, o tai reiškia, kad tai yra nuolatinė eilė, tada paleidus paslaugą iš naujo, ji taip pat egzistuos, nes paslauga išsaugos nuolatinę eilę standžiajame diske, o paleidus paslaugą iš naujo, ji iš naujo nustatys tai, kas anksčiau buvo nuolatinė eilė. Eilė gali būti išlaikyta, tačiau ar viduje esantys pranešimai yra nuolatiniai, priklauso nuo pranešimo patvarumo nustatymų. Kitaip tariant, jei prieš paleidimą iš naujo eilėje nėra išsiųsto pranešimo, ar pradinis pranešimas vis dar yra eilėje po paleidimo iš naujo, priklauso nuo pranešimo parametrų, kurie įvyko siunčiant pranešimą. Jei norite, kad pranešimai būtų nuolatiniai po paleidimo iš naujo, turite nustatyti tapatybę, kad pranešimas bus išlaikytas.
Nustatyti eilės patvarumą:
Ketvirtasis metodo parametras "autoDelete" paprastai įvedamas klaidingas. Dokumentacijoje aprašomas šis parametras, jei teisinga, o tai reiškia, kad jei eilė nebenaudojama (neužsiprenumeruojama), serveris ją ištrins. Mano bandymo metu, kol visi ryšio keitimo eilės gavėjai yra atjungti, eilė ištrinama, net jei joje vis dar yra neapdorotų pranešimų. "RabbitMQ" paleidimas iš naujo taip pat juos pašalins. Jei įvedama klaidinga, paslauga neištrins eilės, o pranešimai eilėje egzistuos, jei visi prie jos prijungti klientai bus atjungti. Siuntėjas taip pat gali įdėti pranešimus į pakeitimų eilę, kai nėra kliento ryšio, o kai klientas pasirodys, jis gaus šiuos pranešimus. Tačiau jei "RabbitMQ" paslauga bus paleista iš naujo, eilės nebeliks, o joje esantys pranešimai natūraliai išnyks.
Trečiasis parametras yra išskirtinis, o dokumentuose teigiama, kad jei tiesa, tada eilės ryšys nutrūksta, tada eilė ištrinama, įskaitant viduje esančius pranešimus.
Antrasis parametras, patvarus, dokumentacijoje aprašytas taip, kad jei tiesa, tai reiškia nuolatinę eilę, kuri taip pat egzistuos paleidus paslaugą iš naujo. Kadangi tarnyba nuolatinę eilę saugos standžiajame diske, o paleidus paslaugą iš naujo, ji iš naujo patvirtins šią eilę. Žinoma, taip turi būti, kai tiek automatinis ištrynimas, tiek išskirtinis yra klaidingi. Eilė gali būti išlaikyta, tačiau ar viduje esantys pranešimai yra nuolatiniai, priklauso nuo pranešimo patvarumo nustatymų. Kitaip tariant, jei prieš paleidimą iš naujo eilėje vis dar yra pranešimų, ar pradinis pranešimas vis dar egzistuoja eilėje po paleidimo iš naujo, priklauso nuo siuntėjo pranešimo parametrų siunčiant pranešimą.
Pakeitę kodą, bandome jį paleisti, o klaida bus tokia:
Neapdorota išimtis: RabbitMQ.Client.Exceptions.OperationInterruptedException: AMQP operacija buvo nutraukta: AMQP uždarymo priežastis, inicijavo Peer, code=406, text="PRECONDITION_FAILED - nelygiavertis arg 'patvarus' eilėje 'labas' vhost 'myserver': gavo 'true', bet dabartinis yra 'false'", classId=50, methodId=10, cause=
Nes apibrėžėme nenuolatinę eilę, vadinamą labas. "RabbitMQ" neleidžia iš naujo apibrėžti esamų eilių su skirtingais parametrų nustatymais.
Yra du sprendimai:
1: Iš naujo paskelbkite eilę kitu pavadinimu, pvz., my_queue 2: Ištrinkite apibrėžtą "labas" eilę su http://localhost:15672 adresu ir prisijunkite naudodami vartotojo vardą ir slaptažodį. Numatytasis RabbitMQ slaptažodis ir vartotojo vardas yra svečiai. Spustelėkite stulpelį "eilė", kad pamatytumėte eilių sąrašą, spustelėkite eilę "labas", kad išplėstumėte eilės informaciją. Patraukite puslapį iki galo, yra elementas "Ištrinti", spustelėkite jį, spustelėkite mygtuką "Ištrinti eilę" ir galėsite ištrinti eilę. Tada, kai kodas paleidžiamas, sukuriama "labas" eilė, palaikanti patvarumą.
Pranešimų patvarumas
Jei norite, kad pranešimas išliktų nuolatinis po paleidimo iš naujo, turite nustatyti, kad pranešimas išliktų. Nustatymas yra tada, kai siuntėjas jį siunčia, o tai yra gana paprasta, o kodas yra toks:
Numatytasis "DeliveryMode" yra 1, nenuolatinis, o nustačius 2 reiškia, kad pranešimas yra nuolatinis
Pakeitę kodą, bandome atidaryti tik gamintojo programą, kad siųstume pranešimus, tada iš naujo paleiskite rabbitMQ paslaugą, vėl atidarykite vartotoją ir pastebėsime, kad pranešimas neprarastas.
(Pabaiga)
Pridedamas C# šaltinio kodas:
Turistai, jei norite pamatyti paslėptą šio įrašo turinį, prašome Atsakyti
|
Ankstesnis:Išimties pranešimas: "StrongTypingException: IsPrima...Kitą:Įvadas į C# delegatus (delegatas, veiksmas, funkcija, predikatas)
|