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

Επισκόπηση JNDI, Μέρος 3: Προηγμένο JNDI

Πρέπει να καλύψω πολύ έδαφος αυτό το μήνα, οπότε θα αφήσω το χνούδι και θα κόψω μέχρι τα σημεία. Πρώτον, το Java Naming and Directory Interface παίζει σημαντικό ρόλο σε αρκετές τεχνολογίες Java. Θα ρίξουμε μια ματιά σε αυτόν τον ρόλο για να κατανοήσουμε καλύτερα τη στρατηγική θέση της JNDI στη συνολική εικόνα της Java. Στη συνέχεια, αναγνωρίζοντας την ανάγκη σας για μια λειτουργική υπηρεσία JNDI για να παίξετε, θα σας παρουσιάσω σε μια ελεύθερα διαθέσιμη, φορητή εφαρμογή LDAP και θα σας διδάξω πώς να συνδεθείτε και να χρησιμοποιήσετε έναν πάροχο υπηρεσιών JNDI. Τέλος, θα σας πάω για μια προσεκτική ματιά σε δεσμευτικά αντικείμενα σε καταχωρήσεις στο JNDI.

ΠΛΑΙΣΙΟ ΚΕΙΜΕΝΟΥ:

TEXTBOX_HEAD: Επισκόπηση JNDI: Διαβάστε ολόκληρη τη σειρά!

  • Μέρος 1. Εισαγωγή στις υπηρεσίες ονομασίας

  • Μέρος 2. Χρησιμοποιήστε τις υπηρεσίες καταλόγου JNDI για να διαχειριστείτε καλύτερα τις κατανεμημένες εφαρμογές σας

  • Μέρος 3. Χρησιμοποιήστε το JNDI για να αποθηκεύσετε τα αντικείμενα της κατανεμημένης εφαρμογής σας

  • Μέρος 4. Συγκεντρώστε ό, τι έχετε μάθει με μια εφαρμογή με δυνατότητα JNDI

: END_TEXTBOX

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

Ας ξεκινήσουμε με μια ματιά στο πώς εμφανίζεται το JNDI σε άλλες τεχνολογίες Java.

JNDI παντού

Το JNDI παίζει ρόλο σε διάφορες τεχνολογίες Java. Ας εξετάσουμε τρία από αυτά: JDBC (το πακέτο σύνδεσης βάσης δεδομένων Java), JMS (η υπηρεσία μηνυμάτων Java) και EJB (Enterprise JavaBeans).

Το JDBC είναι η τεχνολογία Java για σχεσιακές βάσεις δεδομένων. Το JNDI εμφανίστηκε για πρώτη φορά στο προαιρετικό πακέτο JDBC 2.0 (βλ. Πόρους) σε συνδυασμό με το Πηγή δεδομένων διεπαφή. ΕΝΑ Πηγή δεδομένων Για παράδειγμα, όπως υποδηλώνει το όνομά του, αντιπροσωπεύει μια πηγή δεδομένων - συχνά από μια βάση δεδομένων αλλά όχι πάντα. ΕΝΑ Πηγή δεδομένων Το στιγμιότυπο αποθηκεύει πληροφορίες σχετικά με μια πηγή δεδομένων - όπως το όνομά του, το πρόγραμμα οδήγησης για φόρτωση και χρήση και τη θέση του - και επιτρέπει σε μια εφαρμογή να αποκτήσει σύνδεση με την πηγή δεδομένων χωρίς να λαμβάνει υπόψη τις υποκείμενες λεπτομέρειες. Η προδιαγραφή JDBC συνιστά τη χρήση του JNDI για αποθήκευση Πηγή δεδομένων αντικείμενα.

Το JMS είναι η τεχνολογία Java για ανταλλαγή μηνυμάτων. Η προδιαγραφή JMS περιγράφει διαχειριζόμενα αντικείμενα - αντικείμενα που περιέχουν πληροφορίες διαμόρφωσης JMS και χρησιμοποιούνται από πελάτες JMS για τον εντοπισμό συγκεκριμένων ουρών μηνυμάτων και θεμάτων. Όπως συμβαίνει με το JDBC, η προδιαγραφή συνιστά τον εντοπισμό αντικειμένων που διαχειρίζονται το JMS μέσω του JNDI.

Τέλος, εξετάστε το Enterprise JavaBeans. Όλα τα εταιρικά φασόλια δημοσιεύουν μια οικιακή διεπαφή - τη μοναδική τοποθεσία μέσω της οποίας οι πελάτες εντοπίζουν ένα συγκεκριμένο φασόλι - μέσω του JNDI

Τι φέρνει το JNDI στο τραπέζι που το κάνει να θεωρείται τόσο πολύ;

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

Δεύτερον, όπως θα δείτε, η ικανότητα του JNDI να αποθηκεύει απευθείας αντικείμενα Java της επιτρέπει να ενσωματώνεται σχεδόν με διαφάνεια σε εφαρμογές Java.

Το σημείο του παρόχου

Για να χρησιμοποιήσετε το JNDI, χρειάζεστε μια υπηρεσία ονομάτων και καταλόγου και έναν πάροχο υπηρεσιών JNDI. Η Sun παρέχει αρκετούς παρόχους κοινών υπηρεσιών ονομάτων και καταλόγου (ονομασία COS, NIS, μητρώο RMI, LDAP και άλλα). Έχω εγκατασταθεί στο LDAP.

Το LDAP (Lightweight Directory Access Protocol) έχει τα διπλά πλεονεκτήματα της ευρείας εφαρμογής του (τόσο σε εμπορική όσο και σε δωρεάν μορφή) και είναι εύλογα εύκολο στη χρήση. Τα χαρακτηριστικά του υποστηρίζονται επίσης από τον πάροχο υπηρεσιών LDAP της Sun και το JNDI.

Δεδομένου ότι η απόκτηση και η διαμόρφωση ενός διακομιστή LDAP δεν είναι πραγματικά θέμα Java, θα σας οδηγήσω μόνο στη σωστή κατεύθυνση και θα σας παραδώσω αναφορές σε πόρους Διαδικτύου.

Υπάρχουν πολλές εφαρμογές LDAP. Πολλά είναι εμπορικά προϊόντα, όπως ο διακομιστής καταλόγου Netscape και ο κατάλογος ασφαλών τρόπων της IBM. Ορισμένες συσκευάζονται ως μέρος μεγαλύτερων προσφορών (η υπηρεσία Active Directory της Microsoft αποτελεί μέρος των Windows 2000). Εάν έχετε πρόσβαση σε μια τέτοια εφαρμογή, μπορείτε να παραλείψετε το μεγαλύτερο μέρος αυτής της ενότητας. Διαφορετικά, θα περιγράψω το OpenLDAP - μια ελεύθερα διαθέσιμη εφαρμογή του LDAP με βάση την εφαρμογή αναφοράς του Πανεπιστημίου του Michigan - καθώς και την εγκατάσταση και τη διαμόρφωσή του.

Το OpenLDAP είναι διαθέσιμο από το Ίδρυμα OpenLDAP (βλ. Πόρους). Η άδεια χρήσης βασίζεται στην «καλλιτεχνική άδεια» της Perl, που σημαίνει ότι το OpenLDAP είναι δωρεάν (ή ανοιχτού κώδικα) λογισμικό. Τα προσυσκευασμένα δυαδικά αρχεία διατίθενται για διάφορες γεύσεις του Linux (Debian, Red Hat) καθώς και για το BSD Unix. Οι εργασίες βρίσκονται σε εξέλιξη σε μια θύρα στα Windows NT.

Εάν σκοπεύετε να εγκαταστήσετε το OpenLDAP, θα πρέπει να διαβάσετε το Οδηγός διαχειριστή SLAPD και SLURPD (το slapd είναι το όνομα του εκτελέσιμου διακομιστή LDAP και το slurpd είναι το όνομα του διακομιστή αναπαραγωγής LDAP. ανατρέξτε στην ενότητα Πόροι για την τοποθεσία).

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

Σύνδεση σε περιβάλλον JNDI

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

Προτού μπορέσετε να κάνετε οτιδήποτε με το JNDI, χρειάζεστε ένα αρχικό πλαίσιο. Όλες οι λειτουργίες εκτελούνται σε σχέση με το περιβάλλον ή ένα από τα υπο-περιεχόμενά του.

Η απόκτηση ενός αρχικού περιβάλλοντος απαιτεί τρία βήματα:

  1. Αρχικά, επιλέξτε έναν πάροχο υπηρεσιών. Εάν πρόκειται να χρησιμοποιήσετε το OpenLDAP ή κάποια άλλη εφαρμογή LDAP, η Sun παρέχει έναν πάροχο υπηρεσιών LDAP αναφοράς (ανατρέξτε στην ενότητα Πόροι). Προσθέστε το όνομα του φορέα παροχής υπηρεσιών στο σύνολο ιδιοτήτων περιβάλλοντος (αποθηκευμένο σε ένα Hashtable παράδειγμα):

     Hashtable hashtableEnvironment = νέο Hashtable (); hashtableEnvironment.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
  2. Προσθέστε τυχόν επιπλέον πληροφορίες που απαιτεί ο πάροχος υπηρεσιών. Για το LDAP, αυτό περιλαμβάνει τη διεύθυνση URL που προσδιορίζει την υπηρεσία, το ριζικό περιβάλλον και το όνομα και τον κωδικό πρόσβασης για σύνδεση:

     // η υπηρεσία: ldap: // localhost: 389 / // το ριζικό περιβάλλον: dc = etcee, dc = com hashtableEnvironment.put (Context.PROVIDER_URL, "ldap: // localhost: 389 / dc = etcee, dc = com "); hashtableEnvironment.put (Context.SECURITY_PRINCIPAL, "όνομα"); hashtableEnvironment.put (Context.SECURITY_CREDENTIALS, "κωδικός πρόσβασης"); 
  3. Τέλος, πάρτε το αρχικό πλαίσιο. Εάν απλώς σκοπεύετε να εκτελέσετε εργασίες ονομασίας, θα χρειαστείτε μόνο ένα Συμφραζόμενα παράδειγμα. Εάν σκοπεύετε να εκτελέσετε και μια λειτουργία καταλόγου, θα χρειαστείτε ένα DirContext αντί για παράδειγμα. Δεν παρέχουν όλοι οι πάροχοι και τα δύο:

     Περιεχόμενο περιβάλλοντος = νέο InitialContext (hashtableEnvironment); 

    Ή:

     DirContext dircontext = νέο InitialDirContext (hashtableEnvironment); 

Αυτό είναι το μόνο που υπάρχει. Τώρα ας δούμε πώς οι εφαρμογές αποθηκεύουν αντικείμενα και ανακτούν αντικείμενα από το JNDI.

Εργαστείτε με αντικείμενα

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

Από την άποψη του σχετικού κώδικα, η αποθήκευση αντικειμένων είναι εκπληκτικά εύκολη:

 context.bind ("όνομα", αντικείμενο) 

ο δένω() Η λειτουργία δεσμεύει ένα όνομα σε ένα αντικείμενο Java. Η σύνταξη της εντολής θυμίζει RMI, αλλά η σημασιολογία δεν είναι τόσο σαφής. Επιτρέπεται για το δένω() λειτουργία για να αποθηκεύσετε είτε ένα στιγμιότυπο του αντικειμένου είτε μια αναφορά σε ένα "ζωντανό" αντικείμενο, για παράδειγμα.

Να γνωρίζετε ότι το δένω() η λειτουργία ρίχνει ένα ΟνομασίαException εάν προκύψει εξαίρεση κατά την εκτέλεση της λειτουργίας.

Τώρα ας ρίξουμε μια ματιά στο δένω() συμπλήρωμα λειτουργίας - ψάχνω():

 Object αντικείμενο = context.lookup ("όνομα") 

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

Όπως και με δένω(), ο ψάχνω() η λειτουργία ρίχνει ένα ΟνομασίαException εάν προκύψει εξαίρεση κατά την εκτέλεση της λειτουργίας.

Αποθήκευση αντικειμένων

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

Σύμφωνα με την προδιαγραφή JNDI, οι πάροχοι υπηρεσιών ενθαρρύνονται (αλλά δεν απαιτείται) να υποστηρίζουν την αποθήκευση αντικειμένων σε μία από τις ακόλουθες μορφές:

  • Σειριακά δεδομένα
  • Αναφορά
  • Χαρακτηριστικά σε περιβάλλον καταλόγου

Εάν όλοι οι πάροχοι υπηρεσιών JNDI υποστηρίζουν αυτούς τους τυπικούς μηχανισμούς, οι προγραμματιστές Java είναι ελεύθεροι να αναπτύξουν γενικές λύσεις που λειτουργούν ακόμη και όταν αλλάξει το επίπεδο του υποκείμενου παρόχου υπηρεσιών.

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

Ας εξετάσουμε το κάθε ένα με τη σειρά.

Ως σειριακά δεδομένα

Η πιο προφανής προσέγγιση για την αποθήκευση ενός αντικειμένου σε έναν κατάλογο είναι η αποθήκευση της σειριακής αναπαράστασης ενός αντικειμένου. Η μόνη απαίτηση είναι ότι η κλάση του αντικειμένου εφαρμόζει το Σειριοποιήσιμο διεπαφή.

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

Ο παρακάτω κώδικας δείχνει πώς να συνδέσετε ένα Συνδεδεμένη λίστα σε μια καταχώριση σε μια υπηρεσία JNDI:

 // δημιουργία συνδεδεμένης λίστας LinkedList Linkedlist = νέο LinkedList (); . . . // bind konteks.bind ("cn = foo", Linkedlist); . . . // lookup Linkedlist = (LinkedList) konteks.lookup ("cn = foo"); 

Είναι τόσο εύκολο!

Δυστυχώς, οι άλλες δύο μέθοδοι είναι πιο περίπλοκες. Θα τα περιγράψω εν συντομία, αλλά διατηρώ μια λεπτομερή συζήτηση για μεταγενέστερη ημερομηνία.

Ως αναφορά

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

Ένα παράδειγμα είναι μια σύνδεση με έναν εξωτερικό πόρο (εκτός του πεδίου εφαρμογής της Java Virtual Machine) όπως μια βάση δεδομένων ή ένα αρχείο. Προφανώς δεν έχει νόημα να προσπαθήσουμε να αποθηκεύσουμε τη βάση δεδομένων ή το ίδιο το αρχείο στην υπηρεσία JNDI. Αντ 'αυτού, θέλουμε να αποθηκεύσουμε τις απαραίτητες πληροφορίες για την ανακατασκευή της σύνδεσης.

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

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

Ως χαρακτηριστικά

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

Για να χρησιμοποιήσετε αυτήν τη μέθοδο, πρέπει να δημιουργήσετε αντικείμενα που εφαρμόζουν το DirContext διασύνδεση και περιέχει τον απαραίτητο κωδικό για να γράψει την εσωτερική τους κατάσταση ως Γνωρίσματα αντικείμενο. Πρέπει επίσης να δημιουργήσετε ένα εργοστάσιο αντικειμένων για την ανασύσταση του αντικειμένου.

Αυτή η προσέγγιση είναι χρήσιμη όταν το αντικείμενο πρέπει να είναι προσβάσιμο από εφαρμογές εκτός Java.

συμπέρασμα

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

Τον επόμενο μήνα θα ρίξουμε μια ματιά σε μια εφαρμογή που βασίζεται στο JNDI. Εν τω μεταξύ, θα πρέπει να προσπαθήσετε να ενεργοποιήσετε το JNDI σε διακομιστή LDAP.

Μάθετε περισσότερα σχετικά με αυτό το θέμα

  • Το προαιρετικό πακέτο JDBC 2.0

    //java.sun.com/products/jdbc/articles/package2.html

  • Μεταβείτε στο OpenLDAP Foundation για λήψη του OpenLDAP

    //www.openldap.org/

  • Για να κατεβάσετε Ο οδηγός διαχειριστή SLAPD και SLURPD, παω σε

    //www.umich.edu/~dirsvcs/ldap/doc/guides/

  • Πληροφορίες JNDI, πάροχοι υπηρεσιών και ούτω καθεξής

    //java.sun.com/products/jndi/

Αυτή η ιστορία, "Επισκόπηση JNDI, Μέρος 3: Advanced JNDI" δημοσιεύθηκε αρχικά από το JavaWorld.