|
|
Postat pe 09.04.2018 10:23:21
|
|
|
|

Implicit, mesajele rabbitMQ nu sunt păstrate pe hard disk, ceea ce înseamnă că, odată ce serviciul rabbitMQ este repornit, mesajele se vor pierde.
Persistența cozilor
De exemplu, persistența cozii este identificatădurableis este setat pe true, ceea ce înseamnă că este o coadă persistentă, apoi, după ce serviciul este repornit, acesta va exista de asemenea, deoarece serviciul va stoca coada persistentă pe hard disk, iar când serviciul este repornit, va restabili ceea ce a fost coada persistentă anterior. Coada poate fi menținută, dar dacă mesajele din interior sunt persistente depinde de setările de persistență ale mesajului. Cu alte cuvinte, dacă nu există niciun mesaj trimis în coadă înainte de repornire, dacă mesajul original mai există în coadă după repornire depinde de setările mesajului care au apărut la momentul trimiterii. Dacă doriți să păstrați mesajele persistente după repornire, trebuie să setați identitatea pentru care mesajul este menținut.
Setează persistența cozii:
Al patrulea parametru al metodei, autoDelete, este de obicei introdus fals. Documentația descrie acest parametru dacă este adevărat, ceea ce înseamnă că dacă coada nu mai este folosită (nu este abonată), serverul îl va șterge. În timpul testelor mele, atâta timp cât toți destinatarii cozii de schimbare a conexiunii sunt deconectați, coada este ștearsă, chiar dacă mai sunt mesaje neprocesate în ea. Repornirile RabbitMQ le vor elimina și ele. Dacă se introduce false, serviciul nu va șterge coada, iar mesajele din coadă vor exista dacă toți clienții conectați la el sunt deconectați. Expeditorul poate, de asemenea, să pună mesaje în coada de schimbare când nu există conexiune cu clientul, iar când clientul apare, va primi aceste mesaje. Totuși, dacă serviciul RabbitMQ este repornit, coada va dispărea, iar mesajele din ea vor dispărea natural.
Al treilea parametru este exclusiv, iar documentația afirmă că, dacă este adevărat, atunci conexiunea cozii este întreruptă, iar coada este ștearsă, inclusiv mesajele din interior.
Al doilea parametru, durabil, este descris în documentație ca spunând că, dacă este adevărat, reprezintă o coadă persistentă, care va exista și după repornirea serviciului. Pentru că serviciul va stoca coada persistentă pe hard disk, iar când serviciul este repornit, va reafirma această coadă. Desigur, trebuie să fie atunci când atât autoDelete, cât și exclusiv sunt false. Coada poate fi menținută, dar dacă mesajele din interior sunt persistente depinde de setările de persistență ale mesajului. Cu alte cuvinte, dacă mai sunt mesaje trimise în coadă înainte de repornire, dacă mesajul original mai există în coadă după repornire depinde de setările expeditorului pentru mesajul la trimitere al mesajului.
După ce modificăm codul, încercăm să-l rulăm, iar eroarea va fi următoarea:
Excepție negestionată: RabbitMQ.Client.Exceptions.OperationInterruptedException: Operația AMQP a fost întreruptă: AMQP close-reason, inițiată de Peer, code=406, text="PRECONDITION_FAILED - arg inechivalent 'durable' pentru coada 'hello' în vhost 'myserver': received 'true' but current is 'false'", classId=50, methodId=10, cause=
Pentru că am definit o coadă nepersistentă numită hello. RabbitMQ nu permite redefinirea cozilor existente cu setări diferite de parametri.
Există două soluții:
1: Redeclară o coadă cu un alt nume, cum ar fi my_queue 2: Șterge coada definită "hello" cu adresa http://localhost:15672 și conectează-te cu numele de utilizator și parola. Parola implicită și numele de utilizator pentru RabbitMQ sunt invitați. Apasă pe coloana "coadă" pentru a vedea lista cozii, apoi pe coada "hello" pentru a extinde detaliile cozii. Trage pagina la final, există un element "Șterge", dă click pe el, apasă butonul "Șterge coada" și poți șterge coada. Apoi, când codul este rulat, se creează o coadă hello care susține persistența.
Persistența mesajelor
Dacă vrei să păstrezi mesajul persistent după o repornire, trebuie să setezi mesajul să persiste. Setarea este când expeditorul îl trimite, ceea ce este relativ simplu, iar codul este următorul:
DeliveryMode este implicit 1, nepersistent, iar setarea lui 2 înseamnă că mesajul este persistent
După ce modificăm codul, încercăm să deschidem doar programul producător pentru a trimite mesaje, apoi să repornim serviciul rabbitMQ, să deschidem din nou consumatorul și să constatăm că mesajul nu s-a pierdut.
(Sfârșit)
Atașat este codul sursă C#:
Turiști, dacă vreți să vedeți conținutul ascuns al acestei postări, vă rog Răspunde
|
Precedent:Mesaj excepție: "StrongTypingException: IsPrima...Următor:Introducere în delegații C# (delegat, Acțiune, Func, predicat)
|