ΕΝΟΤΗΤΑ 3 – ΠΩΣ ΝΑ ΣΤΕΙΛΟΥΜΕ ΑΡΧΕΙΑ ΣΕ ΕΝΑ QUEUE ΜΕ ΤΟ APACHE CAMEL

Το πιο σημαντικό πλεονέκτημα που έχουμε όταν χρησιμοποιούμε το Apache Camel είναι ότι μας ενδιαφέρει πολύ λιγότερο πως λειτουργούν τα συστήματα στα οποία ενωνόμαστε και περισσότερο να δημιουργήσουμε μια συμβατή γέφυρα επικοινωνίας μεταξύ τους.

  Όπως ήδη έχουμε αναφέρει, το Camel Framework είναι ένα routing engine builder που επιτρέπει, με τους κανόνες που δημιουργούμε, να δέχεται μηνύματα (σε διάφορες μορφές) από ένα σύστημα και να τα στέλνει σε ένα ή περισσότερα συστήματα αφού πρώτα έχει επεξεργαστεί τα μηνύματα. Για να μπορεί να υποστηρίξει τον ευέλικτο τρόπο επικοινωνίας με εξωτερικά συστήματα, προσφέρει πάνω από 80 διαφορετικά πρωτόκολλα και είδη δεδομένων έτοιμα για χρήση χωρίς έξτρα προγραμματισμό.

Η καρδία λειτουργίας του Apache Camel είναι το routing engine που μεταφέρει τα μηνύματα με βάση τους κανόνες που έχουμε ορίσει. Για ορίσουμε τους κανόνες πρέπει να χρησιμοποιήσουμε μια από τις Domain Specific Languages (DSL) στις οποίες καταλαβαίνει το Apache Camel όπως Java, Scala, Groovy, Spring, etc. Τα δικά μας παραδείγματα είναι όλα γραμμένα σε Java DSL.

Στο παράδειγμα που είχαμε εκτελέσει στο προηγούμενο tutorial (http://kassapoglou.blogspot.com/2018/07/2-apache-camel.html) μπορούμε τώρα να προσθέσουμε λίγη ακόμα θεωρία. 

 


Κάθε Camel εφαρμογή χρησιμοποιεί το CamelContext το οποίο σταματάει και ξεκινάει ανάλογα με πόσα μηνύματα έχει το route να εκτελέσει. Τα routes στο Camel τα διαβάζουμε ακριβώς όπως τα έχουμε γράψει στον κώδικα μας: διάβασε από το data1 φάκελλο ότι αρχεία υπάρχουν και μετάφερε τα στο φάκελλο data2. Όταν ολοκληρωθεί η μεταφορά, δείξε μας στην κονσόλα το μήνυμα “Transfer is completed”.

Για να εκτελεστεί σωστά αυτό το πρόγραμμα, πρέπει να συμπεριλάβουμε τις σωστές
Camel βιβλιοθήκες στο project μας. Στο πρώτο μας παράδειγμα είχαμε συμπεριλάβει τις εξής βιβλιοθήκες στο pom.xml αρχείο.

 



Οτιδήποτε άλλο υπάρχει στο pom.xml δημιουργείται αυτόματα από το maven οπότε και δεν υπάρχει λόγος να αλλάξουμε τίποτα άλλο.

Θέλουμε τώρα να αλλάξουμε λίγο τον κώδικα μας, έτσι ώστε αντί να στέλνουμε το αρχείο σε ένα άλλο folder να το στέλνουμε σε ένα JMS Queue. Τι είναι όμως το JMS? Το JMS (Java Message Service) είναι ένα API που μας επιτρέπει να δημιουργούμε, να στέλνουμε, να λαμβάνουμε και να διαβάζουμε μηνύματα. Γενικότερα χρησιμοποιούμε το JMS όταν θέλουμε να υλοποιήσουμε μια ασύγχρονη λύση στο σύστημα μας.

Όταν λοιπόν έχουμε ένα JMS διαθέσιμο, οι δημιουργοί των μηνυμάτων (producers) όσο και εκεί που τα διαβάζουν (consumers) χρησιμοποιούν ένα κοινό προορισμό που ονομάζεται JMS destination. Τα JMS destinations χωρίζονται σε δύο κατηγορίες: Queues και Topics.

Όταν χρησιμοποιούμε Queue για να στείλουμε και να λάβουμε μηνύματα τότε έχουμε τον περιορισμό ότι μόνο ένας consumer μπορεί να διαβάζει κάθε μήνυμα και από την στιγμή που θα διαβαστεί θα διαγραφεί από το Queue και δεν θα είναι διαθέσιμο για κανέναν άλλον.

Ενώ εάν χρησιμοποιήσουμε ένα Topic τότε κάθε μήνυμα μπορεί να διαβαστεί από πολλαπλούς consumers. Για να διαβάσει κάποιος τα μηνύματα σε ένα Topic θα πρέπει πρώτα να έχει δηλώσει συμμετοχή (subscription) στον συγκεκριμένο Topic.

Ο Wildfly Application Server που χρησιμοποιούμε έχει ενσωματωμένο ήδη ένα JMS broker (όπως ονομάζεται κάθε JMS server που προσφέρει messaging υπηρεσίες) με το όνομα ActiveMQ Artemis. Αυτό μπορούμε να το δούμε στα logs του Wildfly όταν ξεκινάμε τον server.

 


Για να ενωθούμε επάνω στο JMS broker θα πρέπει να το ορίσουμε μέσα στον κώδικα μας καλώντας το ConnectionFactory το εκάστοτε JMS broker που χρησιμοποιούμε. Στα δικά μας παραδείγματα θα κάνουμε χρήση του ενσωματωμένου JMS borker που υπάρχει μέσα στον Wildfly. Μπορείτε να εγκαταστήσετε και αυτόνομα JMS brokers είτε στον ίδιο υπολογιστή είτε σε κάποιον άλλον με τον οποίο επικοινωνείτε δικτυακά. Τα πιο διάσημα και δωρεάν JMS brokers είναι το ActiveMQ και το RabbitMQ.

Τώρα για να βρούμε πιο είναι το ConnectionFactory με το οποίο το Apache Camel μπορεί να καλέσει για να ενωθεί στο JMS Broker, όπως και σε ποιο Queue μπορούμε ενωθούμε χρειάζεται να πάμε στο directory όπου έχουμε εγκαταστήσει τον Wildfly και μέσα στον φάκελλο configuration να βρείτε και να ανοίξετε το αρχείο standalone-full-camel.xml

 




 




Βλέπουμε λοιπόν ότι μπορούμε να καλέσουμε το InVmConnectionFactory για να ενωθούμε στο JMS broker. Επειδή δεν θέλουμε να χρησιμοποιήσουμε τα ήδη υπάρχον queues ας αντιγράψουμε το configuration του DQL και ας δημιουργήσουμε ένα δικό μας queue με το όνομα TestQueue.


 



Ας ξεκινήσουμε τώρα τον Wildfly και ας πάμε στο Running Configuration να βεβαιωθούμε ότι το Queue με το όνομα TestQueue είναι διαθέσιμο.


 



Σε περίπτωση που το δικό σας περιβάλλον είναι λίγο διαφορετικό είναι απλά γιατί έχω εγκαταστήσει την πιο τελευταία έκδοση του Wildfly 14.0.1 και το Wildfly-Camel 8.0.0.
Ας βεβαιωθούμε επίσης ότι τα ConnectionFactories είναι αυτά που είδαμε και στο xml αρχείο. Η μόνη διαφορά είναι ότι δεν θα καλέσουμε το ίδιο το όνομα του ConnectionFactory αλλά τον ορισμό του (το όνομα στο entries attribute).


 



Τέλεια! Τώρα είμαστε έτοιμοι να γράψουμε τον κώδικα με τον οποίο μπορούμε να στέλνουμε μηνύματα σε ένα Queue και συγκεκριμένα στο TestQueue.

Σαν πρώτο βήμα θα πρέπει να προσθέσουμε μερικά ακόμα dependencies στο POM αρχείο γιατί θα χρειαστούμε εκτός από το Apache Camel Core και της βιβλιοθήκες του JMS.

 



Σαν δεύτερο βήμα, αλλάζουμε τον κώδικα μας όπως βλέπετε πιο κάτω:


 



Βάζοντας 4 φορές διαφορετικά αρχεία στο data1 φάκελλο, θα πρέπει να δούμε 4 μηνύματα στην κονσόλα και 4 messages μέσα στο TestQueue.

 

 



Η εξήγηση του κώδικα νομίζω ότι είναι απλή: Στην αρχή δημιουργούμε ένα ActiveMQComponent το οποίο θα έχει την δυνατότητα να καταλαβαίνει το format ενός μηνύματος. Με βάση το documentation του Wildfly-Camel θα μπορούσαμε να είχαμε χρησιμοποιήσει και ένα απλό JMSComponent.


 



Επειδή όμως γνωρίζουμε ότι ο Wildfly έχει ενσωματωμένο το ActiveMQ broker τότε το ActiveMQComponent θα μπορεί να διαμορφώσει το μήνυμα σωστά. Δηλώνουμε στο CamelContext (με τη getContext( ) μέθοδο) το καινούργιο component με το όνομα jms. Θεωρείστε ότι το CamelContext είναι αυτό που επικοινωνεί και συντονίζει όλα τα components του Camel. Αυτό το component χρησιμοποιώντας το factory “java:/ConnectionFactory” ξέρει να μεταφέρει το μήνυμα στο TestQueue. Όταν φτάσει το μήνυμα στο TestQueue θα εμφανιστεί ένα log μήνυμα στο terminal.


 



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

Archive

Contact Form

Send