Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 44647|Răspunde: 8

[WinForm] Persistența mesajelor rabbitMQ Queue Queue [cu cod sursă]

[Copiază linkul]
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ă rogRăspunde





Precedent:Mesaj excepție: "StrongTypingException: IsPrima...
Următor:Introducere în delegații C# (delegat, Acțiune, Func, predicat)
Postat pe 09.04.2018 13:17:51 |
Învață să înveți
Postat pe 25.06.2019 23:22:47 |
Învață să înveți
Postat pe 29.06.2019 09:36:23 |
De ce nu am văzut demo-ul, trebuie să răspund ca să-l văd
Postat pe 09.07.2019 17:34:42 |
Vreau cod sursă C#
Postat pe 24.07.2019 14:21:51 |
E bine, e exact ce am nevoie
Postat pe 11.04.2020 14:34:54 |
Învață-l
Postat pe 01.01.2022 14:45:24 |
1111111111111111
 Proprietarul| Postat pe 03.05.2023 22:12:22 |
Parametrii cozii RabbitMQ și semnificațiile lor


/**
* Construiește o coadă nouă, primește un nume, un steag de durabilitate și un steag de ștergere automată, precum și argumente.
* @param numește numele cozii - nu trebuie să fie nul; setați pe "" pentru ca brokerul să genereze numele.
* @param adevărat durabil dacă declarăm o coadă durabilă (coada va supraviețui unei reporniri a serverului)
* @param exclusiv adevărat dacă declarăm o coadă exclusivă (coada va fi folosită doar de declaratorii
* conexiune)
* @param autoDelete adevărat dacă serverul trebuie să șteargă coada când aceasta nu mai este folosită
* @param argumente argumentele folosite pentru a declara coada
*/
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(nume, "'nume' nu poate fi nul");
   this.name = nume;
   this.actualName = StringUtils.hasText(name) ? nume
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = durabil;
   this.exclusiv = exclusiv;
   this.autoDelete = autoDelete;
   this.arguments = arguments != null ? argumente : noul HashMap<>();
}

Introducere parametri:
1. Nume: numele cozii;
2. actualName: Numele real al cozii, parametrul de nume este folosit implicit, dacă numele este gol, se generează unul conform regulilor;
3. durabilă: dacă este persistentă;
4. Exclusiv: dacă este exclusiv sau exclusiv;
5. autoDelete: dacă să fie șters automat;
6. Argumente: Alți parametri de atribut ai cozii au următoarele opțiuni, vezi Argumente în Figura 2:
(1) x-message-ttl: timpul de expirare al mesajului, în milisecunde;
(2) x-expirații: timpul de expirare al cozii, cât timp va fi ștearsă coada dacă nu este accesată, unitate: milisecunde;
(3) x-max-length: lungimea maximă a cozii, dacă depășește valoarea maximă, mesajul va fi șters din antetul cozii;
(4) X-max-lungime-bytes: conținutul mesajului din coadă ocupă spațiul maxim, limitat de dimensiunea memoriei, iar dacă depășește acest prag, mesajul va fi șters din antetul cozii;
(5) x-overflow: Setează comportamentul de overflow la coadă. Aceasta determină ce se întâmplă cu mesajul atunci când se atinge lungimea maximă a cozii. Valorile valide sunt drop-head, reject-publish sau reject-publish-dlx. Tipurile de cozi pentru quorum suportă doar drop-head;
(6) schimb de litere moarte x: numele schimbului de litere moarte și mesajele care au expirat sau au fost șterse (din cauza lungimii lungi a cozii sau a spațiului care depășește pragul) pot fi specificate pentru a fi trimise către centrală;
(7) cheia de rutare cu litere moarte: Cheia de rutare a mesajului cu litere moarte, care va fi folosită atunci când mesajul este trimis către schimbătorul de litere moarte, dacă nu este setată, valoarea originală a cheii de rutare a mesajului va fi folosită
(8) x-unul-singur-consumator activ: indică dacă coada este un singur consumator activ, dacă este adevărat, doar un consumator din grupul de consumatori înregistrați consumă mesaje, ceilalți sunt ignorați, iar fals când mesajul este distribuit tuturor consumatorilor într-o buclă (fals implicit)
(9) prioritate x-max: numărul maxim de priorități care trebuie susținute de coadă; Dacă nu este setat, coada nu va suporta prioritatea mesajului;
(10) mod x-queue (mod leneș): setează coada pe modul de întârziere, păstrează cât mai multe mesaje pe disc pentru a reduce consumul de RAM; Dacă nu este setat, coada va păstra un cache de memorie pentru a livra mesajele cât mai rapid posibil;
(11) x-queue-master-locator: Setează informațiile nodului principal ale cozii oglindă în modul cluster.


Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com