Pronađite usluge pomoću usluge pretraživanja Jini

Usluga pretraživanja Jini, središnja komponenta Jinijeve runtime infrastrukture, nudi klijentima Jini fleksibilan i moćan način pronalaska Jini usluga. Pružateljima usluga omogućuje oglašavanje njihovih usluga, a klijentima omogućuje pronalaženje i traženje pomoći tih usluga.

Da bi stupio u interakciju s uslugom pretraživanja, klijent mora prvo dobiti objekt registra usluge putem otkrivanja, protokola na mrežnoj razini koji koristi Jinijeva runtime infrastruktura. Discovery omogućuje klijentima i uslugama lociranje usluga pretraživanja. (Za više informacija o otkrivanju pogledajte Resursi.) service registrarObjekt koji implementira net.jini.core.lookup.ServiceRegistrarsučelje omogućuje klijentu interakciju s uslugom pretraživanja. Da bi pronašli željene usluge, klijenti grade ServiceTemplateprimjerak klase net.jini.core.lookup.ServiceTemplatei prosljeđuju ga jednoj od dvije lookup()metode deklarirane u ServiceRegistrarsučelju. Svaka lookup()metoda šalje predložak usluge usluzi pretraživanja koja izvršava upit i vraća klijentu odgovarajuće objekte usluge.

Općenito, klijent traži uslugu prema tipu Java, obično sučelju. Na primjer, ako klijent treba koristiti pisač, on sastavlja predložak usluge koji uključuje Classobjekt za dobro poznato sučelje s uslugama pisača. Sve usluge pisača implementiraju sučelje. Usluga pretraživanja vraća objekt usluge (ili objekte) koji implementiraju ovo sučelje. Atribute možete uključiti u predložak usluge da biste suzili broj podudaranja za takvo pretraživanje zasnovano na tipu. Klijent koristi uslugu pisača pozivajući se na objekt usluge metodama deklariranim u poznatom sučelju.

Klasa ServiceTemplate

Pomoću ServiceTemplatepredavanja možete izraziti kriterije pretraživanja za Jini pretrage. Predmet se sastoji samo od ova tri javna polja:

javni unos [] attributeSetTemplates; javni ServiceID serviceID; javna klasa [] vrsta usluge;

ServiceTemplatenema metode, a njegovi primjerci samo služe kao "strukturni" spremnici za upite usluge pretraživanja. Utakmice se izvode kako je opisano u sljedećem odlomku ServiceTemplates javadoc stranice:

Stavke u usluzi pretraživanja podudaraju se pomoću instance [ ServiceTemplate]. Stavka usluge ( item) odgovara predlošku usluge ( tmpl) ako:

  • item.serviceIDjednako tmpl.serviceID(ili ako tmpl.serviceIDjest null)
  • item.service [objekt usluge] je instanca svake vrste u tmpl.serviceTypes
  • item.attributeSets sadrži najmanje jedan odgovarajući unos za svaki predložak unosa u tmpl.attributeSetTemplates

Unos se podudara s predloškom unosa ako je klasa predloška ista kao ili nadklasa klase unosa, a svako ne null polje u predlošku jednako je odgovarajućem polju unosa. Svaki se unos može upotrijebiti za podudaranje s više predložaka. Imajte na umu da je u predlošku usluge, za serviceTypesi attributeSetTemplates, null polje ekvivalentno praznom nizu; oboje predstavljaju zamjenski znak.

Kao što je ovdje opisano, predložak usluge može sadržavati referencu na niz Classobjekata. Ti objekti ukazuju na uslugu pretraživanja tip Java (ili tipove) objekta usluge koji klijent želi. Predložak usluge također može sadržavati ID usluge koji jedinstveno identificira uslugu i atribute koji se moraju točno podudarati s atributima koje je davatelj usluga učitao u stavku usluge. Predložak usluge može sadržavati i zamjenske znakove za bilo koje od tih polja. Zamjenski znak u polju ID usluge, na primjer, odgovarat će bilo kojem ID usluge.

Metode pretraživanja ()

U ServiceRegistrar„s lookup()metodama uzeti dva preopterećene oblika. Ta se dva oblika uglavnom razlikuju po broju podudaranja i servisnih predmeta koje svaki vraća. Obrazac s dva parametra može vratiti više podudaranja upita izraženog u ServiceTemplate, dok obrazac s jednim parametrom vraća samo jedno podudaranje. Uz to, obrazac s dva parametra vraća cijele stavke usluge; obrazac s jednim parametrom vraća samo objekt usluge.

Dvoparametarski oblik pretraživanja ()

Evo javadoc izvatka koji objašnjava dvoparametarski oblik lookup():

javno pretraživanje ServiceMatches (ServiceTemplate tmpl, int maxMatches) baca java.rmi.RemoteException; 

[Vraća] najviše maxMatchesstavke koje se podudaraju s predloškom, plus ukupan broj stavki koje odgovaraju predlošku. Povratna vrijednost nikad nije null, a niz vraćenih predmeta samo je nullako maxMatchesje nula. Ako se objekt usluge ne može deserijalizirati, za svaku vraćenu stavku postavlja se servisno polje stavke nulli ne izuzima se iznimka. Slično tome, ako se skup atributa ne može deserijalizirati, taj se element attributeSetsniza postavlja na nulli ne izbacuje se iznimka.

Evo ServiceMatchesklase:

paket net.jini.core.lookup;

javna klasa ServiceMatches proširuje java.lang.Object implementira java.io.Serializable {

stavke javnog servisaItem []; javni int totalMatches; }

I evo ServiceItemklase:

paket net.jini.core.lookup;

javna klasa ServiceMatches proširuje java.lang.Object implementira java.io.Serializable {

javni unos [] attributeSets; javna java.lang.Objekt usluga; javni ServiceID serviceID; }

Kao što je prethodno spomenuto, svaki element itemsniza koji vraća obrazac s dva parametra predstavlja cjelovitu stavku usluge, koja uključuje objekt usluge, ID usluge i sve skupove atributa. maxMatchesPolje pomaže klijentima upravljati broj predmeta vratio to lookup().

Duljina itemsniza u vraćenom ServiceMatchesobjektu manja je ili jednaka vrijednosti proslijeđenoj lookup()u maxMatches. Ukupan broj podudarnih stavki usluge (vraćenih totalMatches) veći je ili jednak duljini itemsniza.

Na primjer, ako maxMatchesje 50, a predložak usluge odgovara 25 stavki, duljina vraćenog itemspolja i vrijednost totalMatchesobje su 25. Alternativno, ako maxMatchesje 50, ali predložak usluge odgovara 100 predmeta, duljina vraćenog itemspolja je 50 i vrijednost totalMatchesje 100. Kada se predložak usluge podudara s više od maxMatchesstavki usluge, stavke usluge vraćene dvoparametarskim lookup()odabiru se slučajnim odabirom iz cijelog skupa podudarnih stavki usluge.

Jednoparametarski oblik pretraživanja ()

Metoda s jednim parametrom lookup()vraća jedan uslužni objekt koji se podudara slučajno odabran od svih podudaranja. Evo javadoc izvatka koji objašnjava ovaj oblik:

pretraživanje javnog objekta (ServiceTemplate tmpl) baca java.rmi.RemoteException; 
Vraća objekt usluge (tj. Samo ServiceItem.service) iz stavke koja odgovara predlošku ili nullako nema podudaranja. Ako se više predmeta podudara s predloškom, proizvoljno je koji se uslužni objekt vraća. Ako se vraćeni objekt ne može deserijalizirati, UnmarshalExceptionizbacuje se sa standardnom RMI semantikom.

Budući da jedan parametar lookup()vraća samo jedan odgovarajući objekt usluge, klijenti mogu smanjiti broj preuzetih stanja i datoteka klase. Ali budući da je vraćeni objekt usluge odabran proizvoljno, a nije identificiran ID-om usluge ili opisan pridruženim skupovima atributa, klijent mora biti siguran da će bilo koji odgovarajući objekt usluge biti dovoljan.

Načini pregledavanja

In addition to the two lookup() methods, the ServiceRegistrar has three browsing methods, which yield information about registered service items. The three methods -- getServiceTypes(), getEntryClasses(), and getFieldValues() -- are called browsing methods because they enable clients to browse the services and attributes in the lookup service.

The getServiceTypes() method takes a ServiceTemplate (the same ServiceTemplate that is passed to the lookup() methods) and a String prefix. It returns an array of Class instances representing the most specific types (classes or interfaces) of the service objects that match the template. These service objects are neither equal to, nor a superclass of, any of the types specified in the template, and they have names that start with the specified prefix. The service object or objects for which Class instances are returned are all instances of all the types (if any) passed in the template, but the Class instances are all more specific than (and are subclasses or subinterfaces of) those types. Each class appears only once in the returned array, and in arbitrary order.

Here's what getServiceTypes() looks like:

public java.lang.Class[] getServiceTypes(ServiceTemplate tmpl, java.lang.String prefix) throws java.rmi.RemoteException; 

The getEntryTypes() method takes a ServiceTemplate and returns an array of Class instances that represent the most specific classes of entries for the service items that match the template, which either don't match any entry template or are a subclass of one. Each class appears only once in the returned array, again in arbitrary order.

Here's what getEntryClasses() looks like:

public java.lang.Class[] getEntryClasses(ServiceTemplate tmpl) throws java.rmi.RemoteException; 

The getFieldValues() method takes a ServiceTemplate, an integer index, and a String field name. It returns an array of Objects for the named field of all instances of the entry that appears in the ServiceTemplate's Entry[] array at any matching service item's passed index. Each object of a particular class and value appears only once in the returned array, and in arbitrary order.

Here's what getFieldValues() looks like:

public java.lang.Object[] getFieldValues(ServiceTemplate tmpl, int setIndex, java.lang.String field) throws java.lang.NoSuchFieldException, java.rmi.RemoteException; 

The behavior and purpose of these browsing methods can be obscure. You might think of them as tools that incrementally narrow queries of the lookup service.

For example, a client such as a graphical lookup service browser could first invoke getServiceTypes() with an empty template. The getServiceTemplate() method returns all possible service types registered in the lookup service, which the browser could display. The user could select one or more types, then push the Requery button. The browser would add that type (or types) to the service template and invoke getServiceTypes() again. A smaller list of types would be returned and displayed by the browser. The user could select one and press an Entries button. The browser would form a template with the most recently selected service type or types, and then invoke getEntryTypes(). The getEntryTypes() method would return an array of entry classes, which the browser could then display.

The user could select some entries -- and a field of a selected entry -- and push a Fields button. The browser would build a template using the currently selected service and entry types. It would then pass the index of the entry class in which the user selected the field, and the name of the selected field, to getFieldValues(). The browser would display all the values that getFieldValues() returned. With those values the user could further narrow the search for a service, eventually choosing a particular service. Thus, these methods help clients, whether or not a human user is involved, to browse the services registered in a lookup service. The arrays returned from the browsing methods can help the client further refine its queries, ultimately resulting in a ServiceTemplate that, when passed to lookup(), returns the most appropriate service object.

The notify() method

In addition to the lookup and browsing methods, the ServiceRegistrar interface also has a notify() method that notifies clients when new services register or unregister with a lookup service:

public EventRegistration notify(ServiceTemplate tmpl, int transitions, RemoteEventListener listener, MarshalledObject handback, long leaseDuration) throws RemoteException; 

You invoke notify() to register yourself (or another listener) to receive a distributed event whenever the services that match the passed ServiceTemplate undergo a state change described by the transitions parameter.

The transitions parameter is a bitwise OR of any nonempty set of these three values, defined as constants in ServiceRegistrar:

TRANSITION_MATCH_MATCH TRANSITION_MATCH_NOMATCH TRANSITION_NOMATCH_MATCH 

You build the ServiceTemplate for notify() in the same way you build it for lookup(). You can indicate explicit types, a service ID, attributes (which must exactly match), or wild cards (which match anything) in any of those fields. The transitions are based on a change (or nonchange) in the status of whatever matches your ServiceTemplate before and after any operation is performed on the lookup service.

Na primjer, TRANSITION_MATCH_MATCHoznačava da se barem jedna stavka usluge podudarala s vašim predloškom prije i nakon operacije. TRANSITION_MATCH_NOMATCHoznačava da, iako se barem jedna određena stavka usluge podudarala s vašim predloškom prije operacije, više se nije podudarala s vašim predloškom nakon operacije. Da biste primili obavijest kada se nove usluge dodaju u uslugu pretraživanja, jednostavno odredite predložak koji se podudara s bilo kojom uslugom i proslijedite TRANSITION_NOMATCH_MATCHkao prijelaz na notify()metodu.

SUBHEAD_BREAK: Usluga pretraživanja naspram poslužitelja imena