Προγραμματισμός

Μηνύματα XML, Μέρος 1

Τα μηνύματα XML αντιπροσωπεύουν μια ταχέως αναπτυσσόμενη, δυναμική περιοχή πληροφορικής, μια κατάσταση που την καθιστά συναρπαστική και κουραστική ταυτόχρονα. Καθώς αυξάνονται οι ανταλλαγές B2B και άλλες μορφές ηλεκτρονικής επικοινωνίας μεταξύ επιχειρήσεων, τα μηνύματα XML θα αναπτυχθούν ευρύτερα από ποτέ.

Διαβάστε ολόκληρη τη σειρά "XML Messaging":

  • Μέρος 1: Γράψτε έναν απλό μεσίτη μηνυμάτων XML για προσαρμοσμένα μηνύματα XML
  • Μέρος 2: Αποστολή μηνυμάτων XML με το SOAP
  • Μέρος 3: Το JAXM και το ebXML θέτουν το νέο πρότυπο για τα μηνύματα XML

Σε αυτό το άρθρο, θα διερευνήσουμε πρώτα τα μηνύματα XML και γιατί είναι χρήσιμο. Στη συνέχεια, θα ερευνήσουμε συγκεκριμένες δυνατότητες ανταλλαγής μηνυμάτων XML, συμπεριλαμβανομένης της δρομολόγησης μηνυμάτων, του μετασχηματισμού και της μεσιτείας. Τέλος, θα ολοκληρώσουμε με ένα απλό παράδειγμα μεσίτη XML. Αφού διαβάσετε και κατανοήσετε τις έννοιες, θα πρέπει να καταλάβετε με σαφήνεια ποια σενάρια προσφέρονται για την εφαρμογή μιας λύσης ανταλλαγής μηνυμάτων XML.

Τι είναι τα μηνύματα XML;

Για να ξεκινήσουμε την εξερεύνησή μας, πρέπει να κατανοήσουμε τη βασική προϋπόθεση των μηνυμάτων XML και ποιος είναι ο όρος μηνύματα υποδηλώνει. Για τους σκοπούς αυτού του άρθρου, ορίζω μήνυμα ως εξής:

Μια συλλογή πεδίων δεδομένων που αποστέλλονται ή λαμβάνονται μαζί μεταξύ εφαρμογών λογισμικού. Ένα μήνυμα περιέχει μια κεφαλίδα (η οποία αποθηκεύει πληροφορίες ελέγχου σχετικά με το μήνυμα) και ένα ωφέλιμο φορτίο (το πραγματικό περιεχόμενο του μηνύματος).

Το Messaging χρησιμοποιεί μηνύματα για επικοινωνία με διαφορετικά συστήματα για την εκτέλεση κάποιου είδους λειτουργίας. Αναφερόμαστε στην επικοινωνία ως προσανατολισμένη στα μηνύματα επειδή θα στείλαμε και θα λάβουμε μηνύματα για να εκτελέσουμε τη λειτουργία, σε αντίθεση με μια επικοινωνία με RPC (Απομακρυσμένη διαδικασία κλήσης). Μια απλή αναλογία μπορεί να σας βοηθήσει: να σκεφτείτε τα μηνύματα ως email για εφαρμογές. Πράγματι, η ανταλλαγή μηνυμάτων διαθέτει πολλά από τα χαρακτηριστικά των ατόμων που στέλνουν μηνύματα email μεταξύ τους.

Στο παρελθόν, όταν χρησιμοποιούσατε ή εργαζόσασταν σε ένα σύστημα προσανατολισμένο σε μηνύματα, σήμαινε ότι χρησιμοποιούσατε κάποιο είδος προϊόντος MOM (μεσαίου προσανατολισμού μηνυμάτων) όπως το Tibco's Rendezvous, το MQSeries της IBM ή έναν πάροχο JMS για να στείλετε μηνύματα σε ένα ασύγχρονη (μονόδρομη) μόδα. Τα μηνύματα σήμερα δεν σημαίνει απαραίτητα ότι χρησιμοποιείτε ένα προϊόν MOM και αυτό δεν σημαίνει απαραίτητα ότι επικοινωνείτε ασύγχρονα. Αντίθετα, η ανταλλαγή μηνυμάτων μπορεί να είναι συγχρονισμένη (αμφίδρομη) ή ασύγχρονη και να χρησιμοποιεί πολλά διαφορετικά πρωτόκολλα όπως HTTP ή SMTP, καθώς και προϊόντα MOM.

Γιατί τα μηνύματα XML;

Γιατί θα θέλατε να αναπτύξετε ένα σύστημα χρησιμοποιώντας μηνύματα; Τι κάνει την ανταλλαγή μηνυμάτων μια χρήσιμη τεχνική σχεδιασμού και ποια είναι τα οφέλη; Όπως αναφέρθηκε προηγουμένως, μπορούμε να επιλέξουμε από δύο εναλλακτικές λύσεις όταν απαιτούμε δύο εφαρμογές να μιλούν μεταξύ τους μέσω δικτύου: RPC ή προσανατολισμένο σε μηνύματα. Η χρήση μιας προσέγγισης που βασίζεται σε RPC (το RMI εμπίπτει σε αυτήν την κατηγορία) σημαίνει ότι ο πελάτης (ή καλούντος) της διαδικασίας κλήσης γνωρίζει τη διαδικασία που θέλει να επικαλεστεί και γνωρίζει τις παραμέτρους που επιθυμεί να περάσει στη διαδικασία. Επίσης, ο καλών θέλει να περιμένει ενώ ο διακομιστής που καλείται (η εφαρμογή) ολοκληρώνει το αίτημα.

Στη δεύτερη προσέγγιση - προσανατολισμένη σε μηνύματα - ο καλών δεν γνωρίζει απαραίτητα την ακριβή διαδικασία που θα καλείται, αλλά δημιουργεί ένα μήνυμα συγκεκριμένης μορφής γνωστής τόσο στον πελάτη όσο και στον διακομιστή. Ο πελάτης δημιουργεί το μήνυμα και στη συνέχεια το στέλνει στο διακομιστή μέσω του δικτύου. Επομένως, ο πελάτης δεν εξαρτάται από τον διακομιστή ή τις διαδικασίες του διακομιστή, αλλά εξαρτάται από τη μορφή του μηνύματος. Επίσης, η επικοινωνία πιθανότατα πραγματοποιείται με ασύγχρονο τρόπο, πράγμα που σημαίνει ότι ο πελάτης θα στείλει ένα αίτημα αλλά δεν θα περιμένει (μπλοκ) για την απάντηση. Αυτό δίνει τη δυνατότητα στον πελάτη να συνεχίσει να λειτουργεί ακόμα και αν ο διακομιστής δεν είναι διαθέσιμος (για σφάλματα, για παράδειγμα). Αυτός ο σχεδιασμός, όπου ο πελάτης είναι πιο ανεξάρτητος από τον διακομιστή, θεωρείται ότι είναι πιο χαλαρά συνδεδεμένος.

Κατά την αξιολόγηση του κατά πόσον θα χρησιμοποιήσετε μια σχεδίαση προσανατολισμένη στα μηνύματα, είναι σημαντικό να κατανοήσετε τα πλεονεκτήματα και τα μειονεκτήματα ενός τέτοιου συστήματος. Τα πλεονεκτήματα περιλαμβάνουν:

  • Χαλαρή σύζευξη
  • Ευκολότερη δρομολόγηση και μετατροπή μηνυμάτων
  • Πιο ευέλικτο ωφέλιμο φορτίο (μπορεί να περιλαμβάνει δυαδικά συνημμένα, για παράδειγμα)
  • Μπορεί να χρησιμοποιήσει πολλά μηνύματα μαζί για να επικαλεστεί μια δεδομένη διαδικασία

Σε γενικές γραμμές, μια προσέγγιση προσανατολισμένη στα μηνύματα αποδεικνύεται πιο ευέλικτη από μια προσέγγιση RPC.

Τώρα εδώ είναι μερικά μειονεκτήματα:

  • Απαιτεί περισσότερη δουλειά για την ανάπτυξη αλληλεπίδρασης πελάτη / διακομιστή χρησιμοποιώντας μια προσέγγιση προσανατολισμένη στα μηνύματα σε σύγκριση με μια προσέγγιση RPC όπως το RMI, επειδή η ανάπτυξη αλληλεπίδρασης πελάτη / διακομιστή μέσω μηνύματος αντιπροσωπεύει ένα άλλο επίπεδο έμμεσης από το RPC. Η πολυπλοκότητα προστίθεται μέσω της δημιουργίας του μηνύματος από την πλευρά του πελάτη (έναντι μιας επίκλησης διαδικασίας σε μια προσέγγιση RPC) και από την πλευρά του διακομιστή με κώδικα επεξεργασίας μηνυμάτων. Λόγω της πρόσθετης πολυπλοκότητάς του, ένας σχεδιασμός προσανατολισμένος στα μηνύματα μπορεί να είναι πιο δύσκολο να γίνει κατανοητός και να εντοπιστεί.
  • Υπάρχει κίνδυνος απώλειας πληροφοριών τύπου για τη γλώσσα προγραμματισμού στην οποία εστάλη το μήνυμα. Για παράδειγμα, το διπλό στη Java ενδέχεται να μην μεταφράζεται ως διπλό στο μήνυμα.
  • Στις περισσότερες περιπτώσεις, το πλαίσιο συναλλαγών στο οποίο δημιουργήθηκε το μήνυμα δεν μεταδίδεται στον διακομιστή ανταλλαγής μηνυμάτων.

Λαμβάνοντας υπόψη τα πλεονεκτήματα και τα μειονεκτήματα, πότε πρέπει να χρησιμοποιήσετε μια προσέγγιση προσανατολισμένη στα μηνύματα; Το πιο συνηθισμένο σενάριο εμφανίζεται όταν η επικοινωνία πελάτη / διακομιστή πραγματοποιείται μέσω του Διαδικτύου και ο πελάτης και ο διακομιστής ανήκουν σε διαφορετικές εταιρείες. Σε αυτό το σενάριο θα ήταν αρκετά δύσκολο να συμφωνήσουν οι δύο εταιρείες στη διεπαφή διαδικασίας. Επίσης, είναι πιθανό οι εταιρείες να μην θέλουν να χρησιμοποιούν την ίδια γλώσσα προγραμματισμού. Σε ένα άλλο παράδειγμα, οι εμπλεκόμενες εταιρείες ενδέχεται να θέλουν να χρησιμοποιήσουν ένα ασύγχρονο μοντέλο επικοινωνίας, έτσι ώστε κανένα να μην εξαρτάται από την εφαρμογή του άλλου.

Ένα άλλο ελκυστικό σενάριο ανταλλαγής μηνυμάτων εμφανίζεται όταν αναπτύσσετε ένα σύστημα βάσει συμβάντων στο οποίο τα συμβάντα δημιουργούνται και στη συνέχεια καταναλώνονται από ενδιαφερόμενα μέρη. Τα περισσότερα GUI βασίζονται σε συμβάντα. Για παράδειγμα, μπορεί να δημιουργήσουν ένα συμβάν κλικ με το ποντίκι στο οποίο τα ενδιαφερόμενα μέρη ακούνε το συμβάν και να εκτελέσουν κάποια ενέργεια βάσει αυτού. Σε αυτό το σενάριο, η χρήση μιας προσέγγισης ανταλλαγής μηνυμάτων σάς επιτρέπει να καταργήσετε την εξάρτηση μεταξύ ενός συμβάντος (ή ενέργειας σε ένα σύστημα) και της αντίδρασης του συστήματος στο συμβάν που εκτελείται στο διακομιστή.

Τώρα που καταλαβαίνουμε λίγο για τα μηνύματα, είμαστε έτοιμοι να προσθέσουμε XML στην εξίσωση. Η προσθήκη XML στα μηνύματα σημαίνει ότι μπορούμε να χρησιμοποιήσουμε μια ευέλικτη γλώσσα μορφοποίησης δεδομένων για τα μηνύματά μας. Στα μηνύματα, τόσο ο πελάτης όσο και ο διακομιστής πρέπει να συμφωνήσουν για τη μορφή μηνύματος. Το XML το καθιστά ευκολότερο αποφασίζοντας πολλά ζητήματα μορφοποίησης δεδομένων και με την προσθήκη άλλων προτύπων XML όπως το Rosetta Net. Δεν απαιτείται επιπλέον εργασία για να βρείτε μια μορφή μηνύματος.

Τι κάνει ένας μεσίτης μηνυμάτων XML;

Ένας μεσίτης μηνυμάτων ενεργεί ως διακομιστής σε ένα σύστημα προσανατολισμένο στα μηνύματα. Το λογισμικό μεσιτών μηνυμάτων εκτελεί λειτουργίες σε μηνύματα που λαμβάνει. Αυτές οι λειτουργίες περιλαμβάνουν:

  • Επεξεργασία κεφαλίδας
  • Έλεγχοι ασφαλείας και κρυπτογράφηση / αποκρυπτογράφηση
  • Σφάλμα και χειρισμός εξαιρέσεων
  • Δρομολόγηση
  • Επίκληση
  • Μεταμόρφωση

Επεξεργασία κεφαλίδας

Η επεξεργασία κεφαλίδας είναι συνήθως μία από τις πρώτες λειτουργίες που εκτελούνται στο μήνυμα κατά την παραλαβή του σε έναν μεσίτη XML. Η επεξεργασία κεφαλίδας περιλαμβάνει την εξέταση των πεδίων κεφαλίδας των εισερχόμενων μηνυμάτων και την εκτέλεση ορισμένων λειτουργιών. Η επεξεργασία κεφαλίδας θα μπορούσε να περιλαμβάνει την προσθήκη ενός αριθμού παρακολούθησης σε ένα εισερχόμενο μήνυμα ή τη διασφάλιση ότι υπάρχουν όλα τα πεδία κεφαλίδας που είναι απαραίτητα για την επεξεργασία του μηνύματος. Στο παρακάτω παράδειγμα XML μήνυμα, ο μεσίτης μηνυμάτων θα μπορούσε να ελέγξει το προς την πεδίο κεφαλίδας για να βεβαιωθείτε ότι αυτός είναι ο κατάλληλος προορισμός για αυτό το μήνυμα.

Έλεγχοι ασφαλείας και κρυπτογράφηση / αποκρυπτογράφηση

Από την άποψη της ασφάλειας, ένας μεσίτης μηνυμάτων μπορεί να εκτελέσει πολλές διαφορετικές λειτουργίες, αλλά πιθανότατα θα θελήσετε να ολοκληρώσετε τα "μεγάλα τρία" της ασφάλειας: έλεγχος ταυτότητας, εξουσιοδότηση και κρυπτογράφηση. Πρώτον, μόλις προσδιορίσει ότι το μήνυμα περιέχει δεδομένα που μπορούν να χρησιμοποιηθούν για έλεγχο ταυτότητας, ο μεσίτης μηνυμάτων θα ελέγχει τα μηνύματα σε μια βάση δεδομένων ή κατάλογο ασφαλείας. Δεύτερον, ο μεσίτης μηνυμάτων θα εγκρίνει λειτουργίες που μπορούν να εκτελεστούν με αυτόν τον τύπο μηνύματος και εξουσιοδοτημένο κύριο. Τέλος, το μήνυμα που φτάνει στον μεσίτη μηνυμάτων μπορεί να κρυπτογραφηθεί χρησιμοποιώντας κάποιο σχήμα κρυπτογράφησης. Θα είναι ευθύνη του μεσίτη να αποκρυπτογραφήσει το μήνυμα για να το επεξεργαστεί περαιτέρω.

Σφάλμα και χειρισμός εξαιρέσεων

Ο χειρισμός σφαλμάτων και εξαιρέσεων είναι ένα άλλο σημαντικό κομμάτι λειτουργικότητας που εκτελείται από τον μεσίτη μηνυμάτων. Γενικά, το μήνυμα θα ανταποκρίνεται στον πελάτη (υποθέτοντας μια σύγχρονη επίκληση) με ένα μήνυμα σφάλματος, που προκαλείται όταν το μήνυμα που αποστέλλεται στον μεσίτη δεν περιέχει επαρκείς ή ακριβείς πληροφορίες. Μια άλλη αιτία για σφάλματα ή εξαιρέσεις θα συνέβαινε κατά την εξυπηρέτηση του αιτήματος (πράγματι επικαλούμενη μια διαδικασία / μέθοδο που βασίζεται στο ωφέλιμο φορτίο του μηνύματος).

Δρομολόγηση

Η δρομολόγηση μηνυμάτων διακλαδίζεται λογική για μηνύματα. Εμφανίζεται σε δύο διαφορετικά επίπεδα σε ένα μήνυμα. Η πρώτη δρομολόγηση επιπέδου κεφαλίδας, καθορίζει εάν ένα εισερχόμενο μήνυμα δεσμεύεται για αυτήν την εφαρμογή ή πρέπει να αποσταλεί εκ νέου σε άλλη εφαρμογή. Το δεύτερο, δρομολόγιο ωφέλιμου φορτίου, καθορίζει ποια διαδικασία ή μέθοδο θα επικαλεστεί όταν ο μεσίτης καθορίσει ότι το μήνυμα δεσμεύεται για αυτήν την εφαρμογή. Μαζί, αυτοί οι δύο τύποι δρομολόγησης επιτρέπουν ένα πλούσιο σύνολο λειτουργιών κατά την αντιμετώπιση μηνυμάτων.

Επίκληση

Επίκληση σημαίνει πραγματικά να καλέσετε ή να καλέσετε μια μέθοδο με τα δεδομένα (ωφέλιμο φορτίο) που περιέχονται στο εισερχόμενο μήνυμα. Αυτό θα μπορούσε να παράγει ένα αποτέλεσμα που στη συνέχεια επιστρέφεται μέσω του μεσίτη πίσω στον πελάτη. Αυτό που γίνεται επίκληση μπορεί να είναι οτιδήποτε, συμπεριλαμβανομένου ενός φασολιού EJB Session, μιας μεθόδου τάξης και ούτω καθεξής.

Μεταμόρφωση

Ο μετασχηματισμός μετατρέπει ή αντιστοιχίζει το μήνυμα σε κάποια άλλη μορφή. Με το XML, το XSLT χρησιμοποιείται συνήθως για την εκτέλεση λειτουργιών μετασχηματισμού.

Ένα παράδειγμα XML μηνύματος

Παρακάτω θα βρείτε ένα μήνυμα XML που χρησιμοποιείται στο δείγμα εφαρμογής που ακολουθεί. Παρατηρήστε τα τμήματα κεφαλίδας και σώματος. Αυτό το παράδειγμα είναι ένας τύπος μηνύματος "saveInvoice", στον οποίο το σώμα περιέχει ένα τιμολόγιο που πρέπει να αποθηκευτεί.

   εταιρείαΠαραδέκτης αποστολήςΑποθήκευση αποστολήςΤιμολόγιο John Smith 123 George St. Mountain View CA 94041 Company A 100 Main St. Washington DC 20015 IBM A20 Laptop 1 2000.00 

Ίσως αναρωτιέστε εάν υπάρχει ένα πλεονέκτημα στην ανάπτυξη ενός προσαρμοσμένου μηνύματος XML. Γιατί να μην χρησιμοποιήσετε ένα από τα υπάρχοντα πρότυπα μηνυμάτων όπως το ebXML ή το SOAP για να ενσωματώσετε το ωφέλιμο φορτίο (το τιμολόγιο); Υπάρχουν δύο λόγοι. Το πρώτο είναι να δείξουμε μερικά από τα περιεχόμενα που χρειάζονται σε ένα μήνυμα χωρίς όλη την πολυπλοκότητα της εξήγησης ενός πλήρους βιομηχανικού προτύπου. Δεύτερον, παρόλο που τα υπάρχοντα πρότυπα καλύπτουν τις περισσότερες ανάγκες, θα εξακολουθούν να υπάρχουν σενάρια στα οποία η χρήση ενός προσαρμοσμένου μηνύματος θα ταιριάζει καλύτερα στις ανάγκες μιας κατάστασης, όπως και οι ανταλλαγές μεταξύ της χρήσης ενός πρωτοκόλλου υψηλότερου επιπέδου όπως HTTP ή SMTP και της χρήσης ακατέργαστων υποδοχών.

Ένα πρωτότυπο XML μεσίτης υλοποίησης

Έχοντας συζητήσει τους λόγους για τη χρήση ενός σχεδιασμού ανταλλαγής μηνυμάτων στην εφαρμογή σας, θα προχωρήσουμε τώρα σε μια εφαρμογή πρωτότυπου XML ανταλλαγής μηνυμάτων.

Γιατί πρέπει να αναπτύξετε μια εφαρμογή προσαρμοσμένου μεσίτη μηνυμάτων αντί να χρησιμοποιήσετε μια υπάρχουσα; Λοιπόν, επειδή πολλές από τις εφαρμογές για προϊόντα ανταλλαγής μηνυμάτων XML είναι νέες, οπότε είναι σημαντικό να γνωρίζετε τι πηγαίνει σε μια βασική εφαρμογή. Επίσης, είναι πιθανό ότι επειδή οι μεσίτες μηνυμάτων XML είναι κάπως ανώριμα προϊόντα, θα πρέπει να αναπτύξετε το δικό σας για να λάβετε τις δυνατότητες που θέλετε.

Ο βασικός μεσίτης που παρουσιάζεται εδώ μπορεί να εξυπηρετήσει δύο τύπους μηνυμάτων: ένα αίτημα για δημιουργία τιμολογίου, το οποίο αποθηκεύει στο σύστημα αρχείων και ένα στοιχείο κώδικα πελάτη, το οποίο διαβάζει απλώς το μήνυμα XML από ένα αρχείο και το στέλνει.

Ο μεσίτης περιλαμβάνει τρία κύρια μέρη: ένα κομμάτι ακροατή που λαμβάνει εισερχόμενα μηνύματα σε κάποια μεταφορά (σε αυτό το παράδειγμα θα υπάρχει μόνο μια εφαρμογή HTTP). το κύριο κομμάτι του μεσίτη, το οποίο θα αποφασίσει τι θα κάνει με ένα εισερχόμενο μήνυμα. και το κομμάτι επίκλησης που θα κάνει πραγματικά κάποια λογική με βάση το εισερχόμενο μήνυμα. Ας δούμε το καθένα με περισσότερες λεπτομέρειες.

Λάβετε το μήνυμα από τη μεταφορά

Ένα μήνυμα θα συναντήσει πρώτα το τμήμα ακρόασης του μεσίτη. Οι περισσότεροι μεσίτες μηνυμάτων XML παρέχουν υποστήριξη για πολλές διαφορετικές μεταφορές (πρωτόκολλα) όπως HTTP, SMTP, JMS (εφαρμογή συγκεκριμένου προμηθευτή) και ούτω καθεξής. Ο μεσίτης μας το επιτρέπει αυτό, απομονώνοντας το τμήμα μεταφοράς. Το κομμάτι που φαίνεται παρακάτω λαμβάνει απλώς το μήνυμα σε μια δεδομένη μεταφορά, τοποθετεί το εισερχόμενο μήνυμα σε μια μεταβλητή συμβολοσειράς και καλεί το μεμονωμένο μεσίτη: