ΕΝΟΤΗΤΑ 7 – ALLOWING A ROUTE TO CONTINUE AFTER A CONTENT-BASED ROUTER

Στην προηγούμενη ενότητα είχαμε δει πως μπορούμε με έναν content-based router να δρομολογήσουμε σε διαφορετικά queues μηνύματα με βάση το περιεχόμενο τους. Όμως αυτή η λύση δεν μας αρκεί. 
 Ας υποθέσουμε πως αφού το μήνυμα έχει εισέλθει στο κατάλληλο queue χρειάζεται να το προωθήσουμε σε ένα ακόμα queue? Πως θα μπορούσαμε να το κάνουμε αυτό?

Για να κατανοήσουμε καλύτερα το πρόβλημα αλλά και την λύση ας γυρίσουμε πίσω στο σενάριο μας όπου με βάση το περιεχόμενο του μηνύματος θέλουμε να κάνουμε ένα 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. Ας δούμε λοιπόν τον κώδικα.









Μιχάλης Κασάπογλου

Archive

Contact Form

Send