ΕΝΟΤΗΤΑ 2 – ΠΩΣ ΝΑ ΜΕΤΑΦΕΡΟΥΜΕ ΑΡΧΕΙΑ ΜΕ ΤΟ APACHE CAMEL
Αν
και υπάρχει αρκετή θεωρία και integration
patterns στην οποία στηρίζεται το Apache
Camel, θα μπορούσαμε για αρχή να δώσουμε
ένα απλό παράδειγμα για το πόσο εύκολα
μπορούμε να πραγματοποιήσουμε ορισμένες
διενέργειες που κάτω από διαφορετικές
συνθήκες θα έπρεπε να γράψουμε αρκετές
γραμμές κώδικα.
Τα
παραδείγματα που θα δείξουμε τώρα και
σε μελλοντικές ενότητες στηρίζονται
σε αυτά που βρίσκονται στο Camel
in Action βιβλίο
(https://github.com/camelinaction/camelinaction)
αλλά θα τα τροποποιήσουμε έτσι ώστε να
παίζουν στον Wildfly.
Το
πιο απλό σενάριο που θα μπορούσαμε να
αναπτύξουμε είναι η μεταφορά ενός
αρχείου από έναν τοπικό φάκελο σε έναν
άλλον φάκελο. Αργότερα θα δούμε και πιο
προχωρημένες τεχνικές όπως το διάβασμα
ενός αρχείου, την ανάλυση του, την
πρόσθεση έξτρα στοιχείων σε αυτό και
μετά την τελική μεταφορά του είτε σε
ένα άλλο φάκελο είτε σε ένα JMS
Queue. Για τώρα ας δούμε τα βήματα που
χρειάζεται να ακολουθήσουμε για να
δημιουργούμε τέτοιου είδους projects.
Όπως
είπαμε στην προηγούμενη ενότητα, θα
χρησιμοποιήσουμε το NetBeans για
να παρουσιάσουμε τα παραδείγματα μας.
Ακολουθούμε λοιπόν τα παρακάτω βήματα:
και
πατάμε Next.
2.
Στο search ψάχνουμε για
wildfly-camel και επιλέγουμε
την επιλογή wildfly-camel-archetype-cdi.
πατάμε
Next.
3.
Στο τελικό παράθυρο, πατήστε Finish
να δημιουργήσετε το project.
Βασικά
αυτό που έχουμε καταφέρει είναι να
δημιουργήσουμε με την βοήθεια του Maven
ένα απλό αλλά ολοκληρωμένο web
project που χρησιμοποιεί Apache
Camel και τρέχει στον Wildfly.
Επειδή όμως ο κώδικας που μας
προσφέρει το project δεν
είναι ακριβώς αυτό που θέλουμε πρέπει
να κάνουμε μερικές αλλαγές. Πάμε λοιπόν
να δούμε βήμα προς βήμα πως να αλλάξουμε
το project μας για να εκτελέσει
την μεταφορά αρχείων.
1.
Για αρχή, ας κάνουμε δεξί κλικ επάνω
στο project και ας επιλέξουμε
rename για να δώσουμε ένα
πιο κατάλληλο όνομα στο project
μας.
2. Ανοίξτε
το POM.xml αρχείο (βρίσκετε
στο Project Files) και αλλάξτε
το version.wildfly.camel σε 6.1.0
(είναι 6.0.0).
3.
Διαγράψτε τα αρχεία MyServlet και
MyBean από το πακέτο
com.mycompany.mavenproject1
4.
Τέλος σβήνουμε το κώδικα που υπάρχει
μέσα στην μέθοδο configure( ) και
γράφουμε το εξής:
Όπως
καταλαβαίνετε η μόνη γραμμή που έπρεπε
να προσθέσω για να πετύχω τον τελικό
σκοπό του project ήταν ο απλός
κώδικας from("file:E:\\testdata1").to("file:E:\\testdata2");
Φυσικά
για να παίξει ο πιο πάνω κώδικας θα
πρέπει να έχετε δημιουργήσει δύο φακέλους
στον σκληρό σας δίσκο και να τους δηλώσετε
μέσα στον κώδικα.
5.
Κάνουμε δεξί κλικ επάνω στο project
και επιλέγουμε clean and
build. Αυτή η διαδικασία θα μας
δημιουργήσει το απαραίτητο WAR
αρχείο το οποίο θα κάνουμε deploy
στον Wildfly. Το WAR
αρχείο μπορείτε να το βρείτε στην
διεύθυνση που δηλώνεται στο output.
6.
Βρίσκουμε αυτό το αρχείο και το κάνουμε
paste μέσα στο deployments
φάκελο του Wildfly (Wildfly |
standalone | deployments)
Ξεκινάμε
τον Wildfly με την εξής εντολή:
standalone.bat
-c standalone-full-camel.xml
Θα
μπορούσατε να κάνετε και deploy
το WAR αρχείο ενώ ο
Wildfly τρέχει κάνοντας το
απλά paste μέσα στο deployments
φάκελο. Ο Wildfly θα το
αναγνώριζε αμέσως.
Δημιουργήστε
ένα απλό txt αρχείο και
πετάξτε το μέσα στον πρώτο φάκελο. Αμέσως
θα ενεργοποιηθεί το route του
Camel και θα το μεταφέρει
στον δεύτερο φάκελο. Αργότερα θα βάλουμε
και απλά logs components στα
routes για να μπορέσουμε να
παρακολουθούμε το αποτέλεσμα και από
την κονσόλα του Wildfly.
Από
την πιο πάνω αντίδραση του προγράμματος,
είναι εύκολο να καταλάβουμε ότι υπάρχει
εσωτερικά στο Camel ένας
routing μηχανισμός που, αφού
επιλέξει σε ποιο μήνυμα θα ενεργήσει
με βάση τα κριτήρια που έχουμε θέσει,
ενεργοποιείται και πράττει επάνω σε
αυτό. Ο μηχανισμός του Route
είναι συνδυασμός δύο πραγμάτων: (α)
μια domain-specific γλώσσα
προγραμματισμού και (β) υλοποίηση
συγκεκριμένων enterprise integration
patterns.
Η
Camel domain-specific
language (DSL) προσφέρει την ευελιξία να
γραφτεί χρησιμοποιώντας διάφορες
γλώσσες προγραμματισμού όπως Java,
Scala, κτλ. Ο κύριος σκοπός ύπαρξης της
DSL είναι να μπορεί να
ελευθερώνει τον προγραμματιστή από την
γλώσσα προγραμματισμού (κάνοντας την
πιο εύκολη στην σύνταξη) έτσι ώστε να
μπορεί ο προγραμματιστής να συγκεντρωθεί
στην πρακτική λύση του εκάστοτε
προβλήματος που συνήθως είναι integration
πρόβλημα. Όπως ήδη είδαμε στο
παράδειγμα, με την Java και
με απλές εντολές όπως from και
to μπορέσαμε να ορίσουμε
ένα ολοκληρωμένο route.
Τώρα
για να καταλάβουμε λίγο καλύτερα τα
Enterprise Integration Patterns (EIP), καλό
θα ήταν ρίξουμε μια γρήγορη ματιά στο
εξής site:
http://www.enterpriseintegrationpatterns.com/.
Αν κάνετε κλικ σε κάποιο από τα
Patterns που προσφέρονται
στην δεξιά στήλη της οθόνης, θα δείτε
ένα διάγραμμα και μια μικρή θεωρία που
το ακολουθεί (πχ. Το Message
Translator)
Τα
EIPs είναι χρήσιμα όχι μόνο
επειδή παρέχουν μια αποδεδειγμένη λύση
για ένα συγκεκριμένο πρόβλημα, αλλά και
επειδή συμβάλλουν στην παρουσίαση και
επικοινωνία του ίδιου προβλήματος με
γραφικό και εύκολο τρόπο.
Γυρνώντας
πίσω στον κώδικα μας τώρα, θα προσέξουμε
ότι το Camel προσφέρει CDI
dependency injection framework έτσι ώστε
να έχουμε την δυνατότητα να χρησιμοποιήσουμε
Camel routes και να τα καλέσουμε
μέσα από CDI beans. Για να
μπορέσουμε να γράψουμε Camel Routes,
χρειάζεται η κλάση μας να
κληρονομεί (extends) από την
RouteBuilder κλάση. Ο κώδικας
μας θα γραφτεί μέσα στην μέθοδο configure(
) που είναι η μόνη μέθοδο που
χρειάζεται να υλοποιηθεί.
Τέλος
θα μπορούσαμε να δούμε την υλοποίηση
του Camel Route με πιο γραφικό
τρόπο που ονομάζεται hawtio κονσόλα
και η οποία εγκαταστάθηκε αυτόματα όταν
κάναμε unzip το Apache Camel
μέσα στο φάκελο του Wildfly.
Με τον Wildfly να
τρέχει και το project να είναι
ήδη deployed, πηγαίνετε στο
εξής URL: http://localhost:8080/hawtio/login
Εδώ
μας ζητάει τα στοιχεία με τα οποία είχαμε
εγκαταστήσει τον Wildfly. Εγώ
είχα χρησιμοποιήσει το όνομα μου και
το password : welcome1.
Αφού
μπείτε στο γραφικό περιβάλλον του hawtio
αν κάνετε κλικ στα αριστερά επάνω
στο route1 και μετά από στο
route diagram θα μπορείτε να
δείτε το route.
Θα
επισκεφτούμε αυτή την κονσόλα αρκετές
φορές στο μέλλον για να πάρουμε διάφορες
πληροφορίες γύρω από τα routes
των εφαρμογών μας.
Για
τώρα νομίζω ότι καλύψαμε αρκετά θέματα
σε αυτή την ενότητα. Από την επόμενη
ενότητα θα προσπαθήσουμε να ενωθούμε
σε ένα JMS Queue και να στείλουμε
όπως και να λάβουμε μηνύματα από αυτό.
Μιχάλης
Κασάπογλου