|
|
Zverejnené 9. 4. 2018 10:23:21
|
|
|
|

Predvolene sa správy rabbitMQ fronty neuchovávajú na pevnom disku, čo znamená, že po reštarte služby rabbitMQ sa správy stratia.
Pretrvávanie frontov
Napríklad je identifikovaná perzistencia frontydurableis nastavený na true, čo znamená, že ide o perzistentnú frontu, potom po reštarte služby tiež existuje, pretože služba uloží pretrvávajúcu frontu na pevný disk a po reštarte služby obnoví to, čo bolo predtým ponechané. Fronta môže byť zachovaná, ale či sú správy vo vnútri perzistentné, závisí od nastavení perzistencie správy. Inými slovami, ak pred reštartom v rade nebola odoslaná žiadna správa, či pôvodná správa po reštarte stále existuje vo fronte, závisí od nastavení správy, ktoré nastali pri odoslaní správy. Ak chcete, aby správy zostali pretrvávajúce aj po reštarte, musíte nastaviť identitu, že správa je zachovaná.
Nastavte perzistenciu fronty:
Štvrtý parameter metódy, autoDelete, sa zvyčajne zadáva false. Dokumentácia popisuje tento parameter, ak je pravdivý, čo znamená, že ak sa fronta už nepoužíva (nie je prihlásená na odber), server ju vymaže. Počas môjho testovania, pokiaľ sú všetci príjemcovia fronty na zmenu pripojenia odpojení, fronta sa maže, aj keď v nej stále sú nespracované správy. Reštarty RabbitMQ ich tiež odstránia. Ak sa zadá falošné, služba frontu nevymaže a správy v rade budú existovať, ak sú všetci klienti pripojení k nej odpojení. Odosielateľ môže tiež vložiť správy do zmeny fronty, keď neexistuje klientské pripojenie, a keď sa klient zobrazí, dostane tieto správy. Ak sa však služba RabbitMQ reštartuje, fronta zmizne a správy v nej prirodzene zmiznú.
Tretí parameter je exkluzívny a dokumentácia uvádza, že ak je pravda, spojenie fronty je prerušené a fronta sa vymaže vrátane správ vo vnútri.
Druhý parameter, trvanlivý, je v dokumentácii opísaný tak, že ak je pravda, predstavuje trvalú frontu, ktorá bude existovať aj po reštarte služby. Pretože služba uloží trvalú frontu na pevný disk a po reštarte služby túto frontu potvrdí. Samozrejme, musí to tak byť, keď sú autoDelete aj exkluzívne nepravdivé. Fronta môže byť zachovaná, ale či sú správy vo vnútri perzistentné, závisí od nastavení perzistencie správy. Inými slovami, ak sú správy stále odoslané vo fronte pred reštartom, či pôvodná správa stále existuje vo fronte po reštarte, závisí od nastavení odosielateľa správy pri jej odoslaní.
Po úprave kódu sa ho pokúsime spustiť a chyba bude nasledovná:
Nespracovaná výnimka: RabbitMQ.Client.Exceptions.OperationInterruptedException: Operácia AMQP bola prerušená: AMQP uzavretý dôvod, iniciovaná Peerom, kód=406, text="PRECONDITION_FAILED - inequivalent arg 'durable' pre queue 'hello' vo vhost 'myserver': prijaté 'true', ale current is 'false'", classId=50, methodId=10, cause=
Pretože sme definovali nepretrvávanú frontu nazvanú hello. RabbitMQ neumožňuje redefinovanie existujúcich frontov s odlišnými nastaveniami parametrov.
Existujú dve riešenia:
1: Znovu deklarovať frontu s iným názvom, napríklad my_queue 2: Vymažte definovanú "hello" frontu s adresou http://localhost:15672 a prihláste sa s používateľským menom a heslom. Predvolené heslo a používateľské meno pre RabbitMQ sú hosť. Kliknite na stĺpec "queue" pre zobrazenie zoznamu frontov, kliknite na "hello" queue pre rozšírenie detailov fronty. Potiahni stránku na koniec, je tam položka "Vymazať", klikni na ňu, klikni na tlačidlo "Vymazať frontu" a môžeš frontu vymazať. Keď sa kód spustí, vytvorí sa hello fronta, ktorá podporuje perzistenciu.
Pretrvávanie správ
Ak chcete, aby správa zostala pretrvávajúca aj po reštarte, musíte ju nastaviť, aby pretrvala. Nastavenie je, keď odosielateľ posiela signál, čo je relatívne jednoduché, a kód je nasledovný:
DeliveryMode je predvolene nastavený na 1, netrvalý, a nastavenie na 2 znamená, že správa je trvalá
Po úprave kódu sa snažíme otvoriť len program Producer na odoslanie správ, potom reštartovať službu rabbitMQ, znova otvoriť spotrebiteľa a zistiť, že správa nie je stratená.
(Koniec)
Priložený je zdrojový kód C#:
Turisti, ak chcete vidieť skrytý obsah tohto príspevku, prosím. Odpoveď
|
Predchádzajúci:Správa výnimky: "StrongTypingException: IsPrima...Budúci:Úvod do C# delegátov (delegovať, Akcia, Func, predikát)
|