Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 44647|Atsakyti: 8

[WinForm] rabbitMQ eilės eilės pranešimų patvarumas [su šaltinio kodu]

[Kopijuoti nuorodą]
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šomeAtsakyti





Ankstesnis:Išimties pranešimas: "StrongTypingException: IsPrima...
Kitą:Įvadas į C# delegatus (delegatas, veiksmas, funkcija, predikatas)
Paskelbta 2018-04-09 13:17:51 |
Išmokite mokytis
Paskelbta 2019-06-25 23:22:47 |
Išmokite mokytis
Paskelbta 2019-06-29 09:36:23 |
Kodėl nemačiau demonstracinės versijos, turiu atsakyti, kad pamatyčiau
Paskelbta 2019-07-09 17:34:42 |
Noriu C# šaltinio kodo
Paskelbta 2019-07-24 14:21:51 |
Tai gerai, tai yra būtent tai, ko man reikia
Paskelbta 2020-04-11 14:34:54 |
Išmokite
Paskelbta 2022-01-01 14:45:24 |
1111111111111111
 Savininkas| Paskelbta 2023-05-03 22:12:22 |
RabbitMQ eilės parametrai ir jų reikšmės


/**
* Sukurkite naują eilę, suteikdami pavadinimą, patvarumo vėliavėlę ir automatinio naikinimo vėliavėlę bei argumentus.
* @param pavadinti eilės pavadinimą - neturi būti nulinis; Nustatykite į "", kad brokeris sugeneruotų pavadinimą.
* @param patvari tiesa, jei deklaruojame patvarią eilę (eilė išliks po serverio paleidimo iš naujo)
* @param išskirtinė tiesa, jei deklaruojame išskirtinę eilę (eilė bus naudojama tik deklaruojančio asmens
* ryšys)
* @param autoDelete true, jei serveris turėtų panaikinti eilę, kai ji nebenaudojama
* @param argumentai Argumentai, naudojami deklaruoti eilę
*/
public Queue(Eilutės pavadinimas, Bulio logikos ilgalaikis, Bulio logikos išskirtinis, Bulio logikos automatinis naikinimas, Žemėlapis<Eilutė, Objektas> argumentai) {
   Assert.notNull(pavadinimas, "vardas" negali būti nulinis");
   this.name = pavadinimas;
   this.actualName = StringUtils.hasText(pavadinimas) ? vardas, pavadinimas
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = patvarus;
   this.exclusive = išskirtinis;
   this.autoDelete = automatinis ištrynimas;
   this.arguments = argumentai != null ? argumentai : naujas HashMap<>();
}

Parametrų įvadas:
1. pavadinimas: eilės pavadinimas;
2. actualName: Tikrasis eilės pavadinimas, pavadinimo parametras naudojamas pagal numatytuosius nustatymus, jei pavadinimas tuščias, vienas generuojamas pagal taisykles;
3. patvarus: ar jis yra patvarus;
4. Išskirtinis: ar jis yra išskirtinis, ar išskirtinis;
5. automatinis ištrynimas: ar ištrinti automatiškai;
6. Argumentai: Kiti eilės atributų parametrai turi šias parinktis, žr. Argumentai 2 paveiksle:
(1) x-message-ttl: pranešimo galiojimo laikas milisekundėmis;
(2) x-expires: eilės galiojimo laikas, kiek laiko eilė bus ištrinta, jei ji nebus pasiekiama, vienetas: milisekundės;
(3) x-max-length: maksimalus eilės ilgis, jei jis viršija didžiausią vertę, pranešimas bus ištrintas iš eilės antraštės;
(4) x-max-length-bytes: eilės pranešimo turinys užima maksimalią vietą, kurią riboja atminties dydis, ir jei jis viršija šią ribą, pranešimas bus ištrintas iš eilės antraštės;
(5) x-overflow: nustatykite eilės perpildymo veikimą. Tai nustato, kas nutinka pranešimui, kai pasiekiamas maksimalus eilės ilgis. Leistinos reikšmės yra drop-head, reject-publish arba reject-publish-dlx. Kvorumo eilės tipai palaiko tik "drop-head";
(6) x-dead-letter-exchange: negyvų laiškų mainų pavadinimas ir pranešimai, kurių galiojimo laikas pasibaigė arba buvo ištrinti (dėl ilgos eilės ilgio arba vietos, viršijančios ribą), gali būti nurodyti siųsti biržai;
(7) x-dead-letter-routing-key: negyvos raidės pranešimo maršruto raktas, kuris bus naudojamas, kai pranešimas siunčiamas į negyvų raidžių keitiklį, jei nenustatytas, bus naudojama pradinė pranešimo maršruto parinkimo rakto reikšmė
(8) x-single-active-consumer: nurodo, ar eilėje yra vienas aktyvus vartotojas, jei true, pranešimus vartoja tik vienas registruotos vartotojų grupės vartotojas, kiti ignoruojami, o klaidinga, kai pranešimas platinamas visiems vartotojams cikle (numatytasis false)
(9) x-max prioritetas – didžiausias eilėje palaikomų prioritetų skaičius; Jei nenustatyta, eilė nepalaikys pranešimo prioriteto;
(10) x-queue-mode (tingus režimas): nustatykite eilę į uždelsimo režimą, diske laikykite kuo daugiau pranešimų, kad sumažintumėte RAM naudojimą; Jei nenustatyta, eilė išsaugos atminties talpyklą, kad pranešimai būtų pristatyti kuo greičiau;
(11) x-queue-master-locator: nustatykite veidrodinės eilės pagrindinio mazgo informaciją klasterio režimu.


Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com