ΕΝΟΤΗΤΑ 7 – ALLOWING A ROUTE TO CONTINUE AFTER A CONTENT-BASED ROUTER
Στην προηγούμενη
ενότητα είχαμε δει πως μπορούμε με έναν
content-based router να δρομολογήσουμε
σε διαφορετικά queues μηνύματα
με βάση το περιεχόμενο τους. Όμως αυτή
η λύση δεν μας αρκεί.
Για να κατανοήσουμε
καλύτερα το πρόβλημα αλλά και την λύση
ας γυρίσουμε πίσω στο σενάριο μας όπου
με βάση το περιεχόμενο του μηνύματος
θέλουμε να κάνουμε ένα flight
reservation είτε για την Aegean
airlines είτε για την KLM.
Στέλνοντας λοιπόν το μήνυμα στο
route, αυτό θα αποφασίσει
αν θα πάει στο AegeanReservations
queue, στο KLMReservations queue ή
πολύ απλά θα καταλήξει στο DoesNotExist
queue αφού το route δεν
υποστηρίζει καμία άλλη αεροπορική
εταιρεία.
Τώρα θέλουμε, αν το
μήνυμα είναι μέσα στο AegeanReservations
queue ή στο KLMReservations queue να
προχωρήσει σε ένα ακόμα queue
που το ονομάζουμε Confirmations
ενώ αν είναι μέσα στο DoesNotExist
queue να μην προχωρήσει στο Confirmations
queue. Πριν αναλύσουμε το πως λύνεται
αυτό το πρόβλημα, ας δούμε τον κώδικα.
Η πιο εύκολη λύση σε
αυτό το πρόβλημα είναι να κλείσουμε το
block των choice
επιλογών με την end( ) μέθοδο.
Αυτό θα μας δώσει την δυνατότητα να
μπορούμε να προσθέσουμε ακόμα ένα ή και
περισσότερα components στο
ίδιο route. Τώρα για να
σταματήσουμε την ροή εκείνων των
μηνυμάτων που δεν θέλουμε να προχωρήσουμε
άλλο (στην προκειμένη περίπτωση το
DoesNotExist) σταματάμε την ροή
των μηνυμάτων με την stop( )
μέθοδο.
Ο
υπόλοιπος κώδικας περιέχει processors
που διαβάζουν τα μηνύματα που
βρίσκονται μέσα στα queues.
Στέλνουμε λοιπόν από
το Servlet, που χρησιμοποιούμε
σαν client, τρία μηνύματα.
Και περιμένουμε να
δούμε ότι μόνο τα δύο πρώτα θα φτάσουνε
στο Confirmations queue όπως και
συμβαίνει.
Πριν κλείσουμε αυτή
την ενότητα, ας προσθέσουμε ακόμα μια
δυνατότητα στο route που
έχουμε δημιουργήσει. Αφού λοιπόν τα
μηνύματα μας έχουν φτάσει στο Confirmations
queue θέλουμε τώρα να φιλτράρουμε
εκείνα που περιέχουν την λέξη BUSINESS
και αναφέρονται σε business
seats και να τα αφήσουμε να προχωρήσουν
σε ένα ακόμα queue που
ονομάζεται BusinessClass. Όσα
δεν περιέχουν την λέξη BUSINESS
πολύ απλά θα παραμείνουν στο
confirmations queue. Για να το
πετύχουμε αυτό χρησιμοποιούμε την
μέθοδο filter( ). Αν και στο
δικό μας απλό παράδειγμα φιλτράρουμε
για strings μέσα στο body
του μηνύματος, θα μπορούσαμε να
φιλτράρουμε και XML μηνύματα
με Xquery ή ακόμα και με
regular expressions. Μην νιώθετε
λοιπόν περιορισμένοι στις επιλογές που
έχετε όταν φιλτράρετε μηνύματα.
Επίσης κάπου εδώ πρέπει να προσθέσουμε και την πληροφορία ότι το message filter
ανήκει στα Enterprise Integration
Patterns (https://www.enterpriseintegrationpatterns.com/patterns/messaging/Filter.html)
και μπορείτε να βρείτε
περισσότερες πληροφορίες γύρω από αυτό πατώντας επάνω στο link.
Πίσω στο παράδειγμα μας τώρα, στο Servlet
έχουμε δημιουργήσει
δύο reservations για την Aegean
(άρα και τα δύο είναι έγκυρα και θα
φτάσουν μέχρι το confirmations) αλλά
το ένα μήνυμα περιέχει την λέξη BUSINESS
που σημαίνει ότι θα προχωρήσει ένα
queue ακόμα και θα αποθηκευτεί
στο BusinessClass queue. Ας δούμε
λοιπόν τον κώδικα.
Μιχάλης Κασάπογλου