ΕΝΟΤΗΤΑ 6 – USING A CONTENT-BASED ROUTER

Μέχρι τώρα δρομολογούσαμε το μήνυμα σε ένα μόνο queue για να μπορέσουμε να εξηγήσουμε κάποιες βασικές αρχές και δομές του Apache Camel.  
 Από την σημερινή ενότητα θα αναλύσουμε και θα δώσουμε παραδείγματα για τα περισσότερα από τα Enterprise Integration Patterns (https://www.enterpriseintegrationpatterns.com/) πάνω στα οποία στηρίζονται τα components του Apache Camel.

 Το πιο βασικό από όλα τα components είναι το Content-Based router (https://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentBasedRouter.html) που έχει την δυνατότητα να δρομολογεί το μήνυμα σε διαφορετικό κανάλι κάθε φορά με βάση το περιεχόμενο του μηνύματος. Όπως δείχνει και η πιο κάτω εικόνα από το enterprise integration patterns, σκεφτείτε ότι έχετε μια παραγγελία που μπορεί να είναι είτε για ένα widget είτε για να gadget. Ανάλογα με την περιγραφή του μηνύματος, το Apache Camel μπορεί να αποφασίσει σε ποιο κανάλι να στείλει την παραγγελία. Φυσικά και η δρομολόγηση μπορεί να στηρίζεται σε πολλά διαφορετικά είδη ελέγχων όπως αν υπάρχουν συγκεκριμένα πεδία μέσα σε ένα XML αρχείο, συγκεκριμένες λέξεις μέσα σε ένα text μήνυμα, ή ακόμα συγκεκριμένες τιμές και λέξεις κλειδιά όπως π.χ vip member.



Για να δούμε όμως το content-router στην πράξη ας αναλύσουμε ένα μικρό και πρακτικό παράδειγμα. 

Ας υποθέσουμε λοιπόν ότι έχουμε ένα σύστημα για κράτηση αεροπορικών εισιτηρίων. Για να απλοποιήσουμε τον κώδικα μας χρησιμοποιούμε δύο μόνο αεροπορικές εταιρείες από τις οποίες μπορεί ο κάθε πελάτης να διαλέξει. Στο δικό σας κώδικα μπορεί να προσθέσετε όσες ακόμα θέλετε.

Το request με ποια αεροπορική εταιρεία ενδιαφέρεται να κάνει κράτηση ο πελάτης, παράγεται από ένα Servlet. 




Όπως βλέπετε και από τον πιο πάνω κώδικα, αφού δημιουργήσουμε ένα ProducerTemplate αντικείμενο με το όνομα producer, στέλνουμε το text “Reservation for Aegean” στο direct:start component.

 Ας δούμε τώρα πως το route στο Apache Camel αποφασίζει σε ποιο κανάλι να στείλει το request. Πριν αναλύσουμε την θεωρία, ας παρουσιάσουμε τον κώδικα.





Το direct:start component δέχεται το request από το Servlet και το μεταφέρει σε ένα προσωρινό queue με το όνομα vm:incomingRequests. Από εκεί αφού μετατρέψουμε το μήνυμα σε string μορφή, ελέγχουμε το περιεχόμενο του μηνύματος και πιο συγκεκριμένα την τελευταία λέξη. Αν το κείμενο τελειώνει σε “Aegean” τότε το Apache Camel route θα προωθήσει το μήνυμα στο vm:AegeanReservations queue, ενώ αν τελειώνει σε “KLM” τότε το μήνυμα θα προωθηθεί στο vm:KLMReservations queue. Για να βεβαιωθούμε ότι τα μηνύματα φτάνουν στον σωστό τελικό προορισμό έχουμε δημιουργήσει δύο processors που διαβάζουν τα μηνύματα από τα queues.

Αν και το route που δημιουργήσαμε είναι αρκετά βολικό και μας διευκολύνει στην δρομολόγηση των μηνυμάτων, δεν είναι πάρα πολύ ασφαλισμένο από τυχόν λανθασμένες επιλογές. Για παράδειγμα, τι θα γίνει στην εφαρμογή αν ο χρήστης στείλει μήνυμα για να κάνει κράτηση με την British Airways? Το πρόγραμμα δεν είναι προετοιμασμένο να δεχτεί άλλες επιλογές εκτός από αυτές που μας διαθέτει. Όμως θα μπορούσαμε να το προστατέψουμε προσθέτοντας την επιλογή otherwise. Ας δούμε λοιπόν πως θα μπορούσαμε να τροποποιήσουμε τον κώδικα μας.








Όπως είναι φανερό από τον πιο πάνω κώδικα, οτιδήποτε δεν είναι Aegean ή KLM θα δρομολογηθεί στο vm:DoesNotExist queue. Προσθέσαμε έναν ακόμα processor έτσι ώστε να παρακολουθούμε τα μηνύματα που φτάνουν στο queue που μόλις αναφέραμε.

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


Archive

Contact Form

Send