|
|
Δημοσιεύτηκε στις 9/4/2018 10:23:21 π.μ.
|
|
|
|

Από προεπιλογή, τα μηνύματα ουράς rabbitMQ δεν διατηρούνται στον σκληρό δίσκο, πράγμα που σημαίνει ότι μόλις γίνει επανεκκίνηση της υπηρεσίας rabbitMQ, τα μηνύματα θα χαθούν.
Διατήρηση ουρών
Για παράδειγμα, προσδιορίζεται η διατήρηση της ουράςdurableέχει οριστεί σε true, που σημαίνει ότι είναι μια μόνιμη ουράκαι, στη συνέχεια, μετά την επανεκκίνηση της υπηρεσίας, θα υπάρχει επίσης, επειδή η υπηρεσία θα αποθηκεύσει την ουρά που διατηρείται στον σκληρό δίσκο και όταν γίνει επανεκκίνηση της υπηρεσίας, θα αποκαταστήσει την ουρά που είχε διατηρηθεί προηγουμένως. Η ουρά μπορεί να διατηρηθεί, αλλά το αν τα μηνύματα μέσα είναι μόνιμα εξαρτάται από τις ρυθμίσεις επιμονής του μηνύματος. Με άλλα λόγια, εάν δεν έχει σταλεί μήνυμα στην ουρά πριν από την επανεκκίνηση, εάν το αρχικό μήνυμα εξακολουθεί να υπάρχει στην ουρά μετά την επανεκκίνηση εξαρτάται από τις ρυθμίσεις μηνυμάτων που προέκυψαν κατά την αποστολή του μηνύματος. Εάν θέλετε να διατηρήσετε τα μηνύματα μόνιμα μετά από επανεκκίνηση, πρέπει να ορίσετε την ταυτότητα ότι το μήνυμα διατηρείται.
Ρύθμιση διατήρησης ουράς:
Η τέταρτη παράμετρος της μεθόδου, autoDelete, συνήθως εισάγεται false. Η τεκμηρίωση περιγράφει αυτή την παράμετρο εάν είναι αληθής, πράγμα που σημαίνει ότι εάν η ουρά δεν χρησιμοποιείται πλέον (δεν είναι εγγεγραμμένη), ο διακομιστής θα τη διαγράψει. Κατά τη διάρκεια της δοκιμής μου, εφόσον όλοι οι παραλήπτες της ουράς αλλαγής σύνδεσης είναι αποσυνδεδεμένοι, η ουρά διαγράφεται, ακόμα κι αν εξακολουθούν να υπάρχουν μη επεξεργασμένα μηνύματα σε αυτήν. Οι επανεκκινήσεις του RabbitMQ θα τα αφαιρέσουν επίσης. Εάν εισαχθεί false, η υπηρεσία δεν θα διαγράψει την ουρά και τα μηνύματα στην ουρά θα υπάρχουν εάν αποσυνδεθούν όλοι οι πελάτες που είναι συνδεδεμένοι σε αυτήν. Ο αποστολέας μπορεί επίσης να βάλει μηνύματα στην ουρά αλλαγών όταν δεν υπάρχει σύνδεση πελάτη και όταν εμφανιστεί ο πελάτης, θα λάβει αυτά τα μηνύματα. Ωστόσο, εάν γίνει επανεκκίνηση της υπηρεσίας RabbitMQ, η ουρά θα εξαφανιστεί και τα μηνύματα σε αυτήν θα εξαφανιστούν φυσικά.
Η τρίτη παράμετρος είναι αποκλειστική και η τεκμηρίωση αναφέρει ότι εάν είναι αληθής, τότε η σύνδεση της ουράς διακόπτεται και, στη συνέχεια, η ουρά διαγράφεται, συμπεριλαμβανομένων των μηνυμάτων μέσα.
Η δεύτερη παράμετρος, ανθεκτική, περιγράφεται στην τεκμηρίωση λέγοντας ότι εάν είναι αληθής, αντιπροσωπεύει μια μόνιμη ουρά, η οποία θα υπάρχει επίσης μετά την επανεκκίνηση της υπηρεσίας. Επειδή η υπηρεσία θα αποθηκεύσει τη μόνιμη ουρά στον σκληρό δίσκο και όταν γίνει επανεκκίνηση της υπηρεσίας, θα επιβεβαιώσει εκ νέου αυτήν την ουρά. Φυσικά, πρέπει να συμβαίνει όταν τόσο η αυτόματη διαγραφή όσο και η αποκλειστική είναι ψευδείς. Η ουρά μπορεί να διατηρηθεί, αλλά το αν τα μηνύματα μέσα είναι μόνιμα εξαρτάται από τις ρυθμίσεις επιμονής του μηνύματος. Με άλλα λόγια, εάν εξακολουθούν να αποστέλλονται μηνύματα στην ουρά πριν από την επανεκκίνηση, εάν το αρχικό μήνυμα εξακολουθεί να υπάρχει στην ουρά μετά την επανεκκίνηση εξαρτάται από τις ρυθμίσεις του αποστολέα για το μήνυμα κατά την αποστολή του μηνύματος.
Αφού τροποποιήσουμε τον κώδικα, προσπαθούμε να τον εκτελέσουμε και το σφάλμα θα είναι το εξής:
Μη χειριζόμενη εξαίρεση: RabbitMQ.Client.Exceptions.OperationInterruptedException: Η λειτουργία AMQP διακόπηκε: AMQP close-reason, που ξεκίνησε από τον Peer, code=406, text="PRECONDITION_FAILED - ανισοδύναμο arg 'durable' για ουρά 'hello' στο vhost 'myserver': έλαβε 'true' αλλά το τρέχον είναι 'false'", classId=50, methodId=10, cause=
Επειδή έχουμε ορίσει μια μη μόνιμη ουρά που ονομάζεται hello. Το RabbitMQ δεν επιτρέπει τον επαναπροσδιορισμό υπαρχουσών ουρών με διαφορετικές ρυθμίσεις παραμέτρων.
Υπάρχουν δύο λύσεις:
1: Δηλώστε ξανά μια ουρά με διαφορετικό όνομα, όπως my_queue 2: Διαγράψτε την καθορισμένη ουρά "hello" με τη διεύθυνση του http://localhost:15672 και συνδεθείτε με το όνομα χρήστη και τον κωδικό πρόσβασης. Ο προεπιλεγμένος κωδικός πρόσβασης και το όνομα χρήστη για το RabbitMQ είναι επισκέπτης. Κάντε κλικ στη στήλη "ουρά" για να δείτε τη λίστα ουράς, κάντε κλικ στην ουρά "γεια" για να αναπτύξετε τις λεπτομέρειες της ουράς. Τραβήξτε τη σελίδα μέχρι το τέλος, υπάρχει ένα στοιχείο "Διαγραφή", κάντε κλικ σε αυτό, κάντε κλικ στο κουμπί "Διαγραφή ουράς" και μπορείτε να διαγράψετε την ουρά. Στη συνέχεια, όταν εκτελείται ο κώδικας, δημιουργείται μια ουρά hello που υποστηρίζει την επιμονή.
Διατήρηση μηνυμάτων
Εάν θέλετε να διατηρήσετε το μήνυμα μόνιμο μετά από επανεκκίνηση, πρέπει να ρυθμίσετε το μήνυμα σε μόνιμο. Η ρύθμιση είναι όταν το στέλνει ο αποστολέας, κάτι που είναι σχετικά απλό και ο κωδικός έχει ως εξής:
Το DeliveryMode έχει οριστεί από προεπιλογή σε 1, μη μόνιμο και η ρύθμιση σε 2 σημαίνει ότι το μήνυμα είναι μόνιμο
Αφού τροποποιήσουμε τον κώδικα, προσπαθούμε να ανοίξουμε μόνο το πρόγραμμα παραγωγού για την αποστολή μηνυμάτων και, στη συνέχεια, να επανεκκινήσουμε την υπηρεσία rabbitMQ, να ανοίξουμε ξανά τον καταναλωτή και να διαπιστώσουμε ότι το μήνυμα δεν έχει χαθεί.
(Τέλος)
Επισυνάπτεται ο πηγαίος κώδικας C#:
Τουρίστες, αν θέλετε να δείτε το κρυφό περιεχόμενο αυτής της ανάρτησης, παρακαλώ Απάντηση
|
Προηγούμενος:Μήνυμα εξαίρεσης: "StrongTypingException: IsPrima...Επόμενος:Εισαγωγή στους αντιπροσώπους C# (εκπρόσωπος, Δράση, Func, κατηγόρημα)
|