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

Εντοπίστε υπηρεσίες με την υπηρεσία αναζήτησης Jini

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

Για να αλληλεπιδράσει με την υπηρεσία αναζήτησης, ο πελάτης πρέπει πρώτα να αποκτήσει ένα καταχωρητής υπηρεσίας αντικείμενο μέσω ανακάλυψη, ένα πρωτόκολλο επιπέδου δικτύου που χρησιμοποιείται από την υποδομή χρόνου εκτέλεσης του Jini. Το Discovery επιτρέπει στους πελάτες και τις υπηρεσίες να εντοπίζουν υπηρεσίες αναζήτησης. (Για περισσότερες πληροφορίες σχετικά με την ανακάλυψη, ανατρέξτε στην ενότητα Πόροι.) Το καταχωρητής υπηρεσίας αντικείμενο, το οποίο εφαρμόζει το net.jini.core.lookup.ServiceRegistrar διασύνδεση, επιτρέπει στον πελάτη να αλληλεπιδρά με την υπηρεσία αναζήτησης. Για να βρουν τις επιθυμητές υπηρεσίες, οι πελάτες δημιουργούν ένα Πρότυπο υπηρεσίας, μια παρουσία τάξης net.jini.core.lookup.ServiceTemplateκαι δώστε το σε ένα από τα δύο ψάχνω() μεθόδους που δηλώνονται στο Γραμματέας υπηρεσίας διεπαφή. Καθε ψάχνω() Η μέθοδος στέλνει το πρότυπο υπηρεσίας στην υπηρεσία αναζήτησης, η οποία εκτελεί το ερώτημα και επιστρέφει τα αντίστοιχα αντικείμενα υπηρεσίας στον πελάτη.

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

Η κλάση ServiceTemplate

Με την Πρότυπο υπηρεσίας τάξη, μπορείτε να εκφράσετε τα κριτήρια αναζήτησης για αναζητήσεις Jini. Η τάξη αποτελείται αποκλειστικά από αυτά τα τρία δημόσια πεδία:

δημόσια καταχώριση [] attributeSetTemplates; δημόσιο ServiceID serviceID; δημόσια τάξη [] τύποι υπηρεσίας; 

Πρότυπο υπηρεσίας δεν έχει μεθόδους και οι παρουσίες του χρησιμεύουν απλώς ως "δομή" τύπου κοντέινερ για ερωτήματα αναζήτησης. Οι αγώνες εκτελούνται όπως περιγράφεται από το ακόλουθο απόσπασμα από Πρότυπο υπηρεσίαςσελίδα javadoc:

Τα στοιχεία στην υπηρεσία αναζήτησης αντιστοιχίζονται χρησιμοποιώντας μια παρουσία [Πρότυπο υπηρεσίας]. Ένα στοιχείο υπηρεσίας (είδος) ταιριάζει με ένα πρότυπο υπηρεσίας (tmpl) αν:

  • item.serviceID ισούται tmpl.serviceID (ή αν tmpl.serviceID είναι μηδενικό)
  • item.service [το αντικείμενο υπηρεσίας] είναι μια παρουσία κάθε τύπου tmpl.serviceΤύποι
  • item.attributeSets περιέχει τουλάχιστον μία αντίστοιχη καταχώριση για κάθε πρότυπο καταχώρησης στο tmpl.attributeSetTemplates

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

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

Οι μέθοδοι αναζήτησης ()

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

Η μορφή δύο παραμέτρων αναζήτησης ()

Ακολουθεί ένα απόσπασμα javadoc που εξηγεί τη μορφή δύο παραμέτρων του ψάχνω():

Η αναζήτηση του Public ServiceMatches (ServiceTemplate tmpl, int maxMatches) ρίχνει το java.rmi.RemoteException; 

[Επιστρέφει], το πολύ, maxMatches στοιχεία που ταιριάζουν με το πρότυπο, συν τον συνολικό αριθμό στοιχείων που ταιριάζουν με το πρότυπο. Η τιμή επιστροφής δεν είναι ποτέ μηδενικό, και ο πίνακας στοιχείων που επιστράφηκε είναι μόνο μηδενικό αν maxMatches είναι μηδέν. Για κάθε στοιχείο που επιστρέφεται, εάν το αντικείμενο υπηρεσίας δεν μπορεί να αποστειρωθεί, το πεδίο υπηρεσίας του στοιχείου έχει οριστεί σε μηδενικό και δεν υπάρχει εξαίρεση. Ομοίως, εάν ένα σύνολο χαρακτηριστικών δεν μπορεί να αποστειρωθεί, αυτό το στοιχείο του σύνολο χαρακτηριστικών ο πίνακας έχει οριστεί σε μηδενικό και δεν υπάρχει καμία εξαίρεση.

Εδώ είναι το ServiceMatches τάξη:

πακέτο net.jini.core.lookup;

δημόσια τάξη ServiceMatches επεκτείνει java.lang.Object υλοποιεί java.io.Serializable {

αντικείμενα δημόσιας υπηρεσίας [] δημόσιες int totalMatches? }

Και εδώ είναι το Στοιχείο υπηρεσίας τάξη:

πακέτο net.jini.core.lookup;

δημόσια τάξη ServiceMatches επεκτείνει java.lang.Object υλοποιεί java.io.Serializable {

δημόσια καταχώριση [] attributeSets; δημόσια υπηρεσία java.lang.Object; δημόσιο ServiceID serviceID; }

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

Το μήκος του αντικείμενα πίνακας στο επιστρεφόμενο ServiceMatches αντικείμενο είναι μικρότερο ή ίσο με την τιμή που μεταβιβάζεται στο ψάχνω() σε maxMatches. Ο συνολικός αριθμός των αντίστοιχων στοιχείων υπηρεσίας (επιστράφηκαν σε totalMatches) είναι μεγαλύτερο ή ίσο με το μήκος του αντικείμενα πίνακας.

Για παράδειγμα, εάν maxMatches είναι 50 και το πρότυπο υπηρεσίας ταιριάζει με 25 στοιχεία, το μήκος της επιστροφής αντικείμενα πίνακα και η τιμή του totalMatches είναι και τα δύο 25. Εναλλακτικά, εάν maxMatches είναι 50 αλλά το πρότυπο υπηρεσίας αντιστοιχεί σε 100 στοιχεία, το μήκος των επιστρεφόμενων αντικείμενα ο πίνακας είναι 50 και η τιμή του totalMatches είναι 100. Όταν ένα πρότυπο υπηρεσίας αντιστοιχεί σε περισσότερα από maxMatches στοιχεία υπηρεσίας, τα στοιχεία υπηρεσίας που επιστρέφονται από την παράμετρο δύο ψάχνω() επιλέγονται τυχαία από το πλήρες σύνολο των αντίστοιχων στοιχείων υπηρεσίας.

Η μορφή μιας παραμέτρου αναζήτησης ()

Η μία παράμετρος ψάχνω() Η μέθοδος επιστρέφει ένα αντίστοιχο αντικείμενο υπηρεσίας που επιλέχθηκε τυχαία από όλους τους αγώνες. Ακολουθεί ένα απόσπασμα javadoc που εξηγεί αυτήν τη φόρμα:

αναζήτηση Αντικειμένου (ServiceTemplate tmpl) ρίχνει το java.rmi.RemoteException; 
Επιστρέφει το αντικείμενο υπηρεσίας (δηλαδή, ακριβώς ServiceItem.service) από ένα στοιχείο που ταιριάζει με το πρότυπο, ή μηδενικό αν δεν υπάρχει αντιστοιχία. Εάν πολλά στοιχεία ταιριάζουν με το πρότυπο, είναι αυθαίρετο το αντικείμενο υπηρεσίας που επιστρέφεται. Εάν το επιστρεφόμενο αντικείμενο δεν μπορεί να αποστειρωθεί, ένα UnmarshalException ρίχνεται με την τυπική σημασιολογία RMI.

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

Οι μέθοδοι περιήγησης

Εκτός από τα δύο ψάχνω() μεθόδους, το Γραμματέας υπηρεσίας έχει τρία μέθοδοι περιήγησης, που αποδίδουν πληροφορίες σχετικά με καταχωρημένα στοιχεία υπηρεσίας. Οι τρεις μέθοδοι - getServiceTypes (), getEntryClasses (), και getFieldValues ​​() -- λέγονται μέθοδοι περιήγησης επειδή επιτρέπουν στους πελάτες να αναζητούν τις υπηρεσίες και τα χαρακτηριστικά στην υπηρεσία αναζήτησης.

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

Εδώ είναι τι getServiceTypes () μοιάζει με:

δημόσιο java.lang.Class [] getServiceTypes (ServiceTemplate tmpl, java.lang.String prefix) ρίχνει java.rmi.RemoteException; 

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

Εδώ είναι τι getEntryClasses () μοιάζει με:

δημόσια java.lang.Class [] getEntryClasses (ServiceTemplate tmpl) ρίχνει java.rmi.RemoteException; 

ο getFieldValues ​​() η μέθοδος παίρνει ένα Πρότυπο υπηρεσίας, έναν ακέραιο δείκτη και ένα Σειρά όνομα πεδίου. Επιστρέφει μια σειρά από Αντικείμενοs για το ονομαστικό πεδίο όλων των παρουσιών της καταχώρησης που εμφανίζεται στο Πρότυπο υπηρεσίας'μικρό Είσοδος[] πίνακας σε ευρετήριο οποιουδήποτε αντίστοιχου στοιχείου υπηρεσίας. Κάθε αντικείμενο μιας συγκεκριμένης κλάσης και τιμής εμφανίζεται μόνο μία φορά στον πίνακα που επιστρέφεται και με αυθαίρετη σειρά.

Εδώ είναι τι getFieldValues ​​() μοιάζει με:

δημόσιο java.lang.Object [] getFieldValues ​​(ServiceTemplate tmpl, int setIndex, java.lang.String field) ρίχνει java.lang.NoSuchFieldException, java.rmi.RemoteException; 

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

Για παράδειγμα, ένας πελάτης όπως ένα πρόγραμμα περιήγησης γραφικών αναζήτησης θα μπορούσε πρώτα να επικαλεστεί getServiceTypes () με ένα κενό πρότυπο. ο getServiceTemplate () Η μέθοδος επιστρέφει όλους τους πιθανούς τύπους υπηρεσιών που έχουν καταχωριστεί στην υπηρεσία αναζήτησης, τους οποίους θα μπορούσε να εμφανίσει το πρόγραμμα περιήγησης. Ο χρήστης θα μπορούσε να επιλέξει έναν ή περισσότερους τύπους και, στη συνέχεια, να πατήσει το κουμπί Requery. Το πρόγραμμα περιήγησης θα προσθέσει αυτόν τον τύπο (ή τύπους) στο πρότυπο υπηρεσίας και θα επικαλεστεί getServiceTypes () πάλι. Μια μικρότερη λίστα τύπων θα επιστρέφεται και θα εμφανίζεται από το πρόγραμμα περιήγησης. Ο χρήστης θα μπορούσε να επιλέξει ένα και να πατήσει ένα κουμπί Καταχωρήσεις. Το πρόγραμμα περιήγησης θα σχηματίσει ένα πρότυπο με τον πιο πρόσφατα επιλεγμένο τύπο ή τύπους υπηρεσίας και στη συνέχεια θα επικαλεστεί getEntryTypes (). ο getEntryTypes () Η μέθοδος θα επέστρεφε μια σειρά από τάξεις εισόδου, τις οποίες το πρόγραμμα περιήγησης θα μπορούσε στη συνέχεια να εμφανίσει.

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

Η μέθοδος ειδοποίησης ()

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

δημόσια ειδοποίηση EventRegistration (ServiceTemplate tmpl, int transitions, ακροατής RemoteEventListener, MarshalledObject handback, long leaseDuration) ρίχνει το RemoteException. 

Επικαλέσατε κοινοποιώ() για να εγγραφείτε (ή άλλος ακροατής) για να λάβετε ένα διανεμημένο συμβάν όποτε οι υπηρεσίες που ταιριάζουν με το πέρασμα Πρότυπο υπηρεσίας υποβάλλονται σε αλλαγή κατάστασης που περιγράφεται από την παράμετρο μεταβάσεων.

Η παράμετρος μεταβάσεων είναι λίγο Ή οποιουδήποτε μη απεριόριστου συνόλου αυτών των τριών τιμών, που ορίζεται ως σταθερές στο Γραμματέας υπηρεσίας:

TRANSITION_MATCH_MATCH TRANSITION_MATCH_NOMATCH TRANSITION_NOMATCH_MATCH 

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

Για παράδειγμα, TRANSITION_MATCH_MATCH υποδεικνύει ότι τουλάχιστον ένα στοιχείο υπηρεσίας ταιριάζει με το πρότυπό σας πριν και μετά από μια λειτουργία. TRANSITION_MATCH_NOMATCH υποδεικνύει ότι, παρόλο που τουλάχιστον ένα συγκεκριμένο στοιχείο υπηρεσίας ταιριάζει με το πρότυπό σας πριν από μια λειτουργία, δεν ταιριάζει πλέον με το πρότυπό σας μετά τη λειτουργία. Για να λαμβάνετε ειδοποίηση όταν προστίθενται νέες υπηρεσίες σε μια υπηρεσία αναζήτησης, απλώς καθορίζετε ένα πρότυπο που ταιριάζει με οποιαδήποτε υπηρεσία και κάρτα πρόσβασης TRANSITION_NOMATCH_MATCH ως η μετάβαση στο κοινοποιώ() μέθοδος.

SUBHEAD_BREAK: Υπηρεσία αναζήτησης έναντι διακομιστών ονομάτων