ΕΝΟΤΗΤΑ 3 – ΠΩΣ ΝΑ ΣΤΕΙΛΟΥΜΕ ΑΡΧΕΙΑ ΣΕ ΕΝΑ QUEUE ΜΕ ΤΟ APACHE CAMEL
Το πιο σημαντικό
πλεονέκτημα που έχουμε όταν χρησιμοποιούμε
το Apache Camel είναι ότι μας
ενδιαφέρει πολύ λιγότερο πως λειτουργούν
τα συστήματα στα οποία ενωνόμαστε και
περισσότερο να δημιουργήσουμε μια
συμβατή γέφυρα επικοινωνίας μεταξύ
τους.
Η καρδία λειτουργίας
του 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 αρχείο.
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.
Μιχάλης Κασάπογλου