Programmering

Finn tjenester med Jini-oppslagstjenesten

Jini-oppslagstjenesten, den sentrale komponenten i Ninis kjøretidsinfrastruktur, tilbyr Jini-klienter en fleksibel og kraftig måte å finne Jini-tjenester på. Det gjør det mulig for tjenesteleverandører å annonsere for sine tjenester, og gjør det mulig for klienter å finne og verve hjelp fra disse tjenestene.

For å samhandle med oppslagstjenesten, må klienten først skaffe seg en service registrar objekt via oppdagelse, en protokoll på nettverksnivå som brukes av Ninis kjøretidsinfrastruktur. Discovery gjør det mulig for klienter og tjenester å finne oppslagstjenester. (For mer informasjon om oppdagelse, se Ressurser.) The service registrar objekt, som implementerer net.jini.core.lookup.ServiceRegistrar grensesnitt, gjør det mulig for klienten å samhandle med oppslagstjenesten. For å finne ønskede tjenester, bygger klienter en Servicemall, en forekomst av klasse net.jini.core.lookup.ServiceTemplate, og gi den til en av to se opp() metoder erklært i Tjenesteregistrator grensesnitt. Hver se opp() metoden sender tjenestemalen til oppslagstjenesten, som utfører spørringen og returnerer samsvarende tjenesteobjekter til klienten.

Generelt ser en klient opp en tjeneste etter Java-type, vanligvis et grensesnitt. For eksempel, hvis en klient trenger å bruke en skriver, komponerer den en tjenestemal som inkluderer en Klasse objekt for et kjent grensesnitt til skrivertjenester. Alle skrivertjenester implementerer grensesnittet. Oppslagstjenesten returnerer et tjenesteobjekt (eller objekter) som implementerer dette grensesnittet. Du kan inkludere attributter i tjenestemalen for å begrense antall treff for et slikt typebasert søk. Klienten bruker skrivertjenesten ved å påkalle serviceobjektet metodene som er angitt i det velkjente grensesnittet.

ServiceTemplate-klassen

Med Servicemall klasse, kan du uttrykke søkekriteriene for Jini-oppslag. Klassen består utelukkende av disse tre offentlige feltene:

public Entry [] attributeSetTemplates; public ServiceID serviceID; offentlig klasse [] tjenestetyper; 

Servicemall har ingen metoder, og dens forekomster tjener bare som "struktur" -lignende containere for oppslagstjenestespørsmål. Kampene utføres som beskrevet i følgende utdrag fra Servicemalljavadoc-siden:

Elementer i oppslagstjenesten matches med en forekomst av [Servicemall]. Et serviceelement (punkt) samsvarer med en tjenestemal (tmpl) hvis:

  • item.serviceID er lik tmpl.serviceID (eller hvis tmpl.serviceID er null)
  • item.service [tjenesteobjektet] er en forekomst av alle typer i tmpl.serviceTypes
  • item.attributeSets inneholder minst en matchende oppføring for hver oppføringsmal i tmpl.attributeSetTemplates

En oppføring samsvarer med en oppføringsmal hvis klassen til malen er den samme som, eller en superklasse av, oppføringsklassen, og hvert ikke-null-felt i malen tilsvarer det tilsvarende feltet i oppføringen. Hver oppføring kan brukes til å matche mer enn én mal. Legg merke til at i en tjenestemal, for serviceTypes og attributeSetTemplates, tilsvarer et null-felt en tom matrise; begge representerer et jokertegn.

Som beskrevet her kan tjenestemalen inneholde en referanse til en rekke Klasse gjenstander. Disse objektene angir oppslagstjenesten Java-typen (eller typene) av tjenesteobjektet klienten ønsker. Servicemalen kan også inneholde en tjeneste-ID, som unikt identifiserer en tjeneste, og attributter, som nøyaktig må samsvare med attributtene som er lastet opp av tjenesteleverandøren i tjenesteelementet. Servicemalen kan også inneholde jokertegn for alle disse feltene. Et jokertegn i tjeneste-ID-feltet vil for eksempel matche enhver tjeneste-ID.

Oppslag () -metodene

De Tjenesteregistrators se opp() metoder tar to overbelastede former. De to skjemaene skiller seg hovedsakelig ut fra antall kamper og serviceartikler hver enkelt returnerer. To-parameter skjemaet kan returnere flere treff i spørringen uttrykt i Servicemall, mens skjemaet med en parameter bare returnerer en kamp. I tillegg returnerer toparameterskjemaet hele tjenesteelementer; enparameterskjemaet returnerer bare tjenesteobjektet.

To-parameterformen for oppslag ()

Her er et javadoc-utdrag som forklarer toparameterformen av se opp():

offentlig ServiceMatches-oppslag (ServiceTemplate tmpl, int maxMatches) kaster java.rmi.RemoteException; 

[Den] returnerer, på det meste, maxMatches elementer som samsvarer med malen, pluss det totale antallet elementer som samsvarer med malen. Returverdien er aldri null, og matrisen med returnerte varer er bare null hvis maxMatches er null. For hver returnerte vare, hvis tjenesteobjektet ikke kan deserialiseres, er servicefeltet til varen satt til null og det blir ikke kastet noe unntak. Tilsvarende, hvis et attributtsett ikke kan deserialiseres, vil elementet i attributtSett array er satt til null og intet unntak blir kastet.

Her er ServiceMatches klasse:

pakke net.jini.core.lookup;

public class ServiceMatches utvider java.lang.Object implementerer java.io.Serializable {

public ServiceItem [] -artikler; public int totalMatches; }

Og her er ServiceItem klasse:

pakke net.jini.core.lookup;

public class ServiceMatches utvider java.lang.Object implementerer java.io.Serializable {

public Entry [] attributeSets; offentlig java.lang.Object-tjeneste; public ServiceID serviceID; }

Som nevnt tidligere, hvert element av gjenstander array returnert av toparameterskjemaet er et komplett tjenesteelement, som inkluderer serviceobjektet, service-ID og alle attributt sett. De maxMatches feltet hjelper klienter med å administrere antall objekter som returneres av dette se opp().

Lengden på gjenstander array i den returnerte ServiceMatches objektet er mindre enn eller lik verdien som sendes til se opp() i maxMatches. Totalt antall matchende serviceelementer (returnert i totalMatches) er større enn eller lik lengden på gjenstander array.

For eksempel hvis maxMatches er 50 og servicemalen samsvarer med 25 varer, lengden på den returnerte gjenstander array og verdien av totalMatches er begge 25. Alternativt, hvis maxMatches er 50, men tjenestemalen samsvarer med 100 varer, lengden på den returnerte gjenstander array er 50 og verdien av totalMatches er 100. Når en tjenestemal samsvarer med mer enn maxMatches serviceelementer, serviceelementene returnert av to-parameteren se opp() blir valgt tilfeldig fra hele settet med samsvarende serviceelementer.

Enparameterformen for oppslag ()

Enparameteren se opp() metoden returnerer ett matchende tjenesteobjekt valgt tilfeldig fra alle treffene. Her er et javadoc-utdrag som forklarer dette skjemaet:

offentlig objektoppslag (ServiceTemplate tmpl) kaster java.rmi.RemoteException; 
Returnerer tjenesteobjektet (dvs. bare ServiceItem.service) fra et element som samsvarer med malen, eller null hvis det ikke er samsvar. Hvis flere elementer samsvarer med malen, er det vilkårlig hvilket serviceobjekt som returneres. Hvis det returnerte objektet ikke kan deserialiseres, an UnmarshalException blir kastet med standard RMI-semantikk.

Fordi en-parameteren se opp() returnerer bare ett matchende tjenesteobjekt, klienter kan minimere antallet nedlastede objekttilstands- og klassefiler. Men fordi det returnerte tjenesteobjektet er valgt vilkårlig, og ikke identifisert av en service-ID eller beskrevet av tilknyttede attributtsett, må klienten være trygg på at noen matchende tjenesteobjekt vil være tilstrekkelig.

Surfemetodene

I tillegg til de to se opp() metoder, Tjenesteregistrator har tre surfemetoder, som gir informasjon om registrerte serviceartikler. De tre metodene - getServiceTypes (), getEntryClasses (), og getFieldValues ​​() -- er kalt surfemetoder fordi de gjør det mulig for klienter å bla gjennom tjenestene og attributtene i oppslagstjenesten.

De getServiceTypes () metoden tar en Servicemall (det samme Servicemall som sendes til se opp() metoder) og a String prefiks. Det returnerer en rekke Klasse forekomster som representerer de mest spesifikke typene (klasser eller grensesnitt) av tjenesteobjektene som samsvarer med malen. Disse tjenesteobjektene er verken like eller en superklasse av noen av typene som er spesifisert i malen, og de har navn som begynner med det angitte prefikset. Tjenesteobjektet eller objektene som Klasse forekomster returneres er alle forekomster av alle typene (hvis noen) som sendes i malen, men Klasse Forekomster er alle mer spesifikke enn (og er underklasser eller undergrensesnitt av) disse typene. Hver klasse vises bare en gang i den returnerte matrisen, og i vilkårlig rekkefølge.

Her er hva getServiceTypes () ser ut som:

offentlig java.lang.Class [] getServiceTypes (ServiceTemplate tmpl, java.lang.String prefiks) kaster java.rmi.RemoteException; 

De getEntryTypes () metoden tar en Servicemall og returnerer en rekke Klasse forekomster som representerer de mest spesifikke oppføringsklassene for tjenesteelementene som samsvarer med malen, som enten ikke samsvarer med noen oppføringsmal eller er en underklasse av en. Hver klasse vises bare en gang i den returnerte matrisen, igjen i vilkårlig rekkefølge.

Her er hva getEntryClasses () ser ut som:

offentlig java.lang.Class [] getEntryClasses (ServiceTemplate tmpl) kaster java.rmi.RemoteException; 

De getFieldValues ​​() metoden tar en Servicemall, et heltallindeks, og a String feltnavn. Det returnerer en rekke Gjenstands for det navngitte feltet av alle forekomster av oppføringen som vises i Servicemalls Inngang[] matrise på et hvilket som helst samsvarende tjenesteelements bestått indeks. Hvert objekt av en bestemt klasse og verdi vises bare en gang i den returnerte matrisen, og i vilkårlig rekkefølge.

Her er hva getFieldValues ​​() ser ut som:

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

Oppførselen og formålet med disse surfemetodene kan være uklar. Du kan tenke på dem som verktøy som trinnvis begrenser spørsmålene til oppslagstjenesten.

For eksempel kan en klient, for eksempel en nettleser med grafisk oppslagstjeneste, først påberope seg getServiceTypes () med en tom mal. De getServiceTemplate () metoden returnerer alle mulige tjenestetyper som er registrert i oppslagstjenesten, som nettleseren kan vise. Brukeren kan velge en eller flere typer, og deretter trykke på Forespørsel-knappen. Nettleseren vil legge til den typen (eller typene) i tjenestemalen og påkalle getServiceTypes () en gang til. En mindre liste over typer vil bli returnert og vises av nettleseren. Brukeren kan velge en og trykke på en Oppføringer-knapp. Nettleseren vil danne en mal med den siste valgte tjenestetypen eller -typene, og deretter påkalle getEntryTypes (). De getEntryTypes () metoden returnerer en rekke inngangsklasser, som nettleseren deretter kan vise.

Brukeren kunne velge noen oppføringer - og et felt i en valgt oppføring - og trykke på en Fields-knapp. Nettleseren bygger en mal ved hjelp av de valgte tjenestene og oppføringstypene. Det vil da sende indeksen til inngangsklassen der brukeren valgte feltet, og navnet på det valgte feltet, til getFieldValues ​​(). Nettleseren vil vise alle verdiene som getFieldValues ​​() returnert. Med disse verdiene kunne brukeren begrense søket etter en tjeneste ytterligere, og til slutt velge en bestemt tjeneste. Dermed hjelper disse metodene klienter, uansett om det er en menneskelig bruker, eller ikke, å bla gjennom tjenestene som er registrert i en oppslagstjeneste. Arrangementene som returneres fra surfemetodene kan hjelpe klienten med å avgrense spørsmålene sine, og til slutt resultere i en Servicemall det, når det sendes til se opp(), returnerer det mest passende serviceobjektet.

Notify () -metoden

I tillegg til oppslags- og surfemetodene, er Tjenesteregistrator grensesnittet har også en gi beskjed() metode som varsler klienter når nye tjenester registreres eller avregistrerer seg med en oppslagstjeneste:

offentlig EventRegistration-varsling (ServiceTemplate tmpl, int-overganger, RemoteEventListener-lytter, MarshalledObject handback, long leaseDuration) kaster RemoteException; 

Du påberoper deg gi beskjed() å registrere deg selv (eller en annen lytter) for å motta et distribuert arrangement når tjenestene som samsvarer med bestått Servicemall gjennomgå en tilstandsendring beskrevet av parameteren overganger.

Overgangsparameteren er litt klok ELLER av ethvert ikke-fritt sett av disse tre verdiene, definert som konstanter i Tjenesteregistrator:

TRANSITION_MATCH_MATCH TRANSITION_MATCH_NOMATCH TRANSITION_NOMATCH_MATCH 

Du bygger Servicemall til gi beskjed() på samme måte som du bygger den for se opp(). Du kan angi eksplisitte typer, en tjeneste-ID, attributter (som må stemme overens nøyaktig) eller jokertegn (som samsvarer med hva som helst) i et av disse feltene. Overgangene er basert på en endring (eller ikke-endring) i statusen til det som samsvarer med din Servicemall før og etter at noen operasjoner utføres på oppslagstjenesten.

For eksempel, TRANSITION_MATCH_MATCH indikerer at minst ett serviceelement samsvarte med malen din før og etter en operasjon. TRANSITION_MATCH_NOMATCH indikerer at selv om minst ett bestemt tjenesteelement samsvarer med malen din før en operasjon, samsvarer den ikke lenger med malen din etter operasjonen. For å motta varsel når nye tjenester legges til i en oppslagstjeneste, spesifiserer du bare en mal som samsvarer med alle tjenester og pass TRANSITION_NOMATCH_MATCH som overgangen til gi beskjed() metode.

SUBHEAD_BREAK: Oppslagstjeneste versus navneservere

$config[zx-auto] not found$config[zx-overlay] not found