|
|
Pubblicato su 09/04/2018 10:23:21
|
|
|
|

Di default, i messaggi della coda rabbitMQ non vengono persistiti sul disco rigido, il che significa che una volta riavviato il servizio rabbitMQ, i messaggi andranno persi.
Persistenza delle code
Ad esempio, viene identificata la persistenza della codadurableis è impostato su true, il che significa che è una coda persistente, poi, dopo il riavvio del servizio, esisterà anch'esso, perché il servizio memorizzerà la coda persistente sul disco rigido e, quando il servizio viene riavviato, ristabilirà ciò che era precedentemente la coda persistente. La coda può essere mantenuta, ma se i messaggi all'interno siano persistenti dipende dalle impostazioni di persistenza del messaggio. In altre parole, se non viene inviato alcun messaggio in coda prima del riavvio, se il messaggio originale esiste ancora in coda dopo il riavvio dipende dalle impostazioni del messaggio avvenute al momento dell'invio. Se vuoi mantenere i messaggi persistenti dopo un riavvio, devi impostare l'identità che indica che il messaggio è stato mantenuto.
Imposta la persistenza della coda:
Il quarto parametro del metodo, autoDelete, viene solitamente inserito falso. La documentazione descrive questo parametro se vero, il che significa che se la coda non viene più utilizzata (non abbonata), il server la cancellerà. Durante i miei test, finché tutti i destinatari della coda di cambio connessione sono disconnessi, la coda viene cancellata, anche se ci sono ancora messaggi non elaborati. Anche i riavvii di RabbitMQ li rimuovono. Se viene inserito falso, il servizio non eliminerà la coda e i messaggi presenti in coda esisteranno se tutti i client collegati ad essa vengono disconnessi. Il mittente può anche inserire messaggi nella coda di modifica quando non c'è connessione client, e quando il client si attiva, riceverà questi messaggi. Tuttavia, se il servizio RabbitMQ viene riavviato, la coda sparisce e i messaggi in esso scompariranno naturalmente.
Il terzo parametro è esclusivo, e la documentazione afferma che, se vero, la connessione della coda viene interrotta e la coda viene eliminata, inclusi i messaggi all'interno.
Il secondo parametro, durabile, è descritto nella documentazione come affermando che, se vero, rappresenta una coda persistente, che esisterà anche dopo il riavvio del servizio. Poiché il servizio memorizzerà la coda persistente sul disco rigido e, quando il servizio viene riavviato, riaffermerà questa coda. Ovviamente, deve essere così quando sia autoDelete che esclusivo sono false. La coda può essere mantenuta, ma se i messaggi all'interno siano persistenti dipende dalle impostazioni di persistenza del messaggio. In altre parole, se ci sono ancora messaggi inviati in coda prima del riavvio, se il messaggio originale esiste ancora in coda dopo il riavvio dipende dalle impostazioni del mittente per il messaggio al momento dell'invio.
Dopo aver modificato il codice, proviamo a eseguirlo, e l'errore sarà il seguente:
Eccezione non gestita: RabbitMQ.Client.Exceptions.OperationInterruptedException: L'operazione AMQP è stata interrotta: AMQP close-reason, avviata da Peer, code=406, text="PRECONDITION_FAILED - arg inequivalente 'durable' per la coda 'hello' in vhost 'myserver': received 'true' ma corrente è 'false'", classId=50, methodId=10, cause=
Perché abbiamo definito una coda non persistente chiamata hello. RabbitMQ non consente di ridefinire code esistenti con impostazioni di parametri diverse.
Ci sono due soluzioni:
1: Ridichiarare una coda con un nome diverso, come my_queue 2: Elimina la coda "hello" definita con l'indirizzo di http://localhost:15672 e accedi con il nome utente e la password. La password predefinita e il nome utente di RabbitMQ sono ospiti. Clicca sulla colonna "coda" per vedere la lista delle code, clicca sulla coda "ciao" per espandere i dettagli della coda. Porta la pagina alla fine, c'è un elemento "Elimina", clicca sopra, clicca sul pulsante "Elimina coda" e puoi eliminare la coda. Poi, quando il codice viene eseguito, viene creata una coda hello che supporta la persistenza.
Persistenza dei messaggi
Se vuoi mantenere il messaggio persistente dopo un riavvio, devi impostare il messaggio per essere persistente. L'impostazione è quando il mittente lo invia, che è relativamente semplice, e il codice è il seguente:
DeliveryMode di default è 1, non persistente, e impostando 2 il messaggio è persistente
Dopo aver modificato il codice, cerchiamo di aprire solo il programma produttore per inviare messaggi, poi riavviiamo il servizio rabbitMQ, riapriamo il consumer e scopriamo che il messaggio non è andato perso.
(Fine)
Allegato è il codice sorgente C#:
Turisti, se volete vedere il contenuto nascosto di questo post, vi prego Risposta
|
Precedente:Messaggio eccezione: "StrongTypingException: IsPrima...Prossimo:Introduzione ai delegati C# (delegato, Azione, Func, predicato)
|