ΕΝΟΤΗΤΑ 8 – MULTICASTING AND PARALLEL MULTICASTING

Πολύ συχνά σε enterprise εφαρμογές, χρειάζεται να στείλουμε την πληροφορία σε πολλαπλές κατευθύνσεις ταυτόχρονα. 
 Στο δικό μας παράδειγμα, ίσως υπήρχε μια απαίτηση, αμέσως μετά από το final confirmation για την κράτηση της θέσης, να στείλουμε την πληροφορία ταυτόχρονα στο Travel Agency γραφείο και στο λογιστήριο για να προχωρήσει με την διαδικασία της χρέωσης.

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



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







Archive

Contact Form

Send