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 Servicemall
javadoc-siden:
Elementer i oppslagstjenesten matches med en forekomst av [Servicemall
]. Et serviceelement (punkt
) samsvarer med en tjenestemal (tmpl
) hvis:
item.serviceID
er liktmpl.serviceID
(eller hvistmpl.serviceID
ernull
)item.service
[tjenesteobjektet] er en forekomst av alle typer itmpl.serviceTypes
item.attributeSets
inneholder minst en matchende oppføring for hver oppføringsmal itmpl.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 Tjenesteregistrator
s 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 Gjenstand
s for det navngitte feltet av alle forekomster av oppføringen som vises i Servicemall
s 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