ΕΝΟΤΗΤΑ 8 – MULTICASTING AND PARALLEL MULTICASTING
Πολύ συχνά σε enterprise
εφαρμογές, χρειάζεται να στείλουμε
την πληροφορία σε πολλαπλές κατευθύνσεις
ταυτόχρονα.
Αυτή την
απαίτηση μπορούμε πολύ εύκολα να την
υλοποιήσουμε χρησιμοποιώντας το
multicast component του Apache
Camel. Το multicast είναι ένα
πιο light version του Recipient
List component που είναι το standard
component στα Enterprise Integration
Patterns
(https://www.enterpriseintegrationpatterns.com/patterns/messaging/RecipientList.html).
Για το Recipient
List θα μιλήσουμε αφότου έχουμε
αναλύσει και καταλάβει την λειτουργία
του multicasting.
Η αλλαγή που πρέπει να
κάνουμε στο πρόγραμμα μας είναι πολύ
μικρή και βασικά περικλείεται μέσα σε
μόνο μια γραμμή κώδικα:
.to("vm:BusinessClass").multicast().to("vm:Accounting",
"vm:TravelAgency");
Διαβάζουμε λοιπόν την
πληροφορία που έχει φτάσει το BusinessClass
queue και προσθέτουμε το multicast
component. Αμέσως μετά ορίζουμε, μέσα σε
μια κοινή παρένθεση, όλους προορισμούς
στους οποίους θέλουμε ταυτόχρονα να
στείλουμε την πληροφορία. Στο δικό μας
παράδειγμα οι προορισμοί είναι το
Accounting department και το Travel
Agency. Η εικόνα που ακολουθεί, είναι
ολόκληρος ο κώδικας του route
μαζί με το αποτέλεσμα όταν τρέξουμε
το παράδειγμα.
Σε αυτή την προσέγγιση,
ναι μεν λύσαμε το πρόβλημα, αλλά το
multicast από μόνο του δεν
στέλνει ταυτόχρονα – με την πραγματική
σημασία της ορολογίας – την πληροφορία
στους τελικούς προορισμούς. Απλά διαβάζει
την λίστα με τους προορισμούς και στέλνει
την πληροφορία σε κάθε έναν προορισμό
με την σειρά που διαβάζει την λίστα.
Οπότε πρώτα θα πάει στο Accounting
και μετά στο TravelAgency.
Αν τώρα είναι πολύ
σημαντικό να πάρουν όλοι οι προορισμοί
την πληροφορία ταυτόχρονα και όχι να
υπάρχει μια χρονική διαφορά μεταξύ
τους, τότε μπορούμε να προσθέσουμε ακόμα
μια μέθοδο στον κώδικα μας που ονομάζεται
parallelProcessing( )
Το αποτέλεσμα στην
εκτέλεση του προγράμματος είναι ακριβώς
η ίδια όπως και στο προηγούμενο παράδειγμα
που τρέξαμε.
Ο αριθμός των threads
που χρησιμοποιούνται εξ ορισμού
εάν και εφόσον εμείς δε ορίσουμε τίποτα
είναι δέκα ( 10 ) . Αν τώρα επιθυμούμε να
αυξήσουμε τον αριθμό των threads,
για παράδειγμα σε είκοσι ( 20 ), για
να μπορέσουμε να εκτελέσουμε την
πληροφορία πιο γρήγορα, τότε θα χρειαστεί
να καλέσουμε το ExecutorService της
java. Το πιο κάτω παράδειγμα
δείχνει πόσο εύκολο είναι να το ορίσουμε.
Αν εκτελέσουμε το πιο κάτω κώδικα θα
πάρουμε το ίδιο αποτέλεσμα όπως πριν.
Τέλος, ίσως θέλουμε να
θεωρήσουμε και το εξής σενάριο: Αν η
πληροφορία που στέλνουμε αποτύχει να
φτάσει σε έναν από τους παράλληλους
προορισμούς τότε θέλουμε να σταματήσει
το multicast μέχρι να διορθώσουμε
το λάθος. Αυτό ίσως να μην είναι μόνο
απαίτηση του πελάτη αλλά και δική σας,
σαν προγραμματιστή, αφού γνωρίζεται,
και είναι γεγονός, ότι το mutlicast
θα συνεχίσει να στέλνει μηνύματα
στους τελικούς προορισμούς άσχετα αν
κάποιοι από αυτούς παρουσιάζουν πρόβλημα.
Δηλαδή θα υπάρχουν κάποιοι προορισμοί
που θα λάβουν την πληροφορία και κάποιοι
που δεν θα έχουν λάβει τίποτα. Αυτή η
default συμπεριφορά του
multicast δεν νομίζω να είναι
και πολύ επιθυμητή. Πως μπορούμε λοιπόν
να σταματήσουμε και να ελέγξουμε μια
τέτοια συμπεριφορά στο σύστημα?
Εδώ θα χρειαστεί να
προσθέσουμε την stopOnException
ιδιότητα του multicast. Όταν
ενεργοποιείται αυτή η ιδιότητα, τότε
το multicast σταματάει στο
πρώτο exception που θα
παρουσιαστεί. Αυτό μας δίνει χρόνο να
αντιδράσουμε και να διορθώσουμε το
πρόβλημα. Ο τελικός κώδικας της εφαρμογής
αλλάζει ως εξής:
Μιχάλης Κασάπογλου