Thursday, July 5, 2018

ΕΝΟΤΗΤΑ 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 και να στείλουμε όπως και να λάβουμε μηνύματα από αυτό.

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