ΕΝΟΤΗΤΑ 6 – USING A CONTENT-BASED ROUTER
Μέχρι τώρα δρομολογούσαμε
το μήνυμα σε ένα μόνο queue για
να μπορέσουμε να εξηγήσουμε κάποιες
βασικές αρχές και δομές του 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
που μόλις αναφέραμε.
Μιχάλης
Κασάπογλου