Vyhledávací služba Jini, hlavní součást běhové infrastruktury Jini, nabízí klientům Jini flexibilní a účinný způsob, jak najít služby Jini. Umožňuje poskytovatelům služeb inzerovat jejich služby a umožňuje klientům vyhledat a získat pomoc s těmito službami.
Pro interakci s vyhledávací službou musí klient nejprve získat a servisní registrátor objekt prostřednictvím objev, protokol na úrovni sítě používaný běhovou infrastrukturou Jini. Discovery umožňuje klientům a službám vyhledávat vyhledávací služby. (Další informace o zjišťování najdete v části Zdroje.) servisní registrátor
objekt, který implementuje net.jini.core.lookup.ServiceRegistrar
rozhraní, umožňuje klientovi komunikovat s vyhledávací službou. K vyhledání požadovaných služeb si klienti sestaví a Šablona služby
, instance třídy net.jini.core.lookup.ServiceTemplate
a předejte ji jednomu ze dvou vzhlédnout()
metody deklarované v ServiceRegistrar
rozhraní. Každý vzhlédnout()
metoda odešle šablonu služby vyhledávací službě, která provede dotaz a vrátí odpovídající objekty služby klientovi.
Obecně platí, že klient vyhledává službu podle typu Java, obvykle rozhraní. Například pokud klient potřebuje použít tiskárnu, vytvoří šablonu služby, která obsahuje a Třída
objekt známého rozhraní se službami tiskárny. Rozhraní implementují všechny tiskové služby. Vyhledávací služba vrací servisní objekt (nebo objekty), které implementují toto rozhraní. Můžete zahrnout atributy do šablony služby, abyste zúžili počet shod pro takové vyhledávání podle typu. Klient používá tiskovou službu vyvoláním na objektu služby metody deklarované ve známém rozhraní.
ServiceTemplate Třída
S Šablona služby
třídy, můžete vyjádřit kritéria vyhledávání pro vyhledávání Jini. Třída se skládá pouze z těchto tří veřejných polí:
public Entry [] attributeSetTemplates; public ServiceID serviceID; public Class [] serviceTypes;
Šablona služby
nemá žádné metody a jeho instance slouží pouze jako kontejnery typu „struct“ pro dotazy vyhledávací služby. Shody se provádějí, jak je popsáno v následujícím výňatku z Šablona služby
stránka javadoc:
Položky ve vyhledávací službě jsou spárovány pomocí instance [Šablona služby
]. Servisní položka (položka
) odpovídá šabloně služby (tmpl
) pokud:
item.serviceID
se rovnátmpl.serviceID
(nebo kdyžtmpl.serviceID
jenula
)item.service
[objekt služby] je instancí každého typutmpl.serviceTypes
item.attributeSets
obsahuje alespoň jednu odpovídající položku pro každou vstupní šablonu vtmpl.attributeSetTemplates
Záznam odpovídá šabloně záznamu, pokud je třída šablony stejná jako třída záznamu nebo nadtřída třídy a každé nenulové pole v šabloně se rovná odpovídajícímu poli záznamu. Každý záznam lze použít k přiřazení více než jedné šablony. Všimněte si, že v šabloně služby pro typy služeb
a attributeSetTemplates
, pole null je ekvivalentní prázdnému poli; oba představují zástupný znak.
Jak je zde popsáno, šablona služby může obsahovat odkaz na pole Třída
předměty. Tyto objekty označují vyhledávací službě typ (typy) Java objektu služby, který si klient přeje. Šablona služby může také obsahovat a ID služby, který jednoznačně identifikuje službu a atributy, které se musí přesně shodovat s atributy nahranými poskytovatelem služby v položce služby. Šablona služby může také obsahovat zástupné karty pro kterékoli z těchto polí. Například zástupná karta v poli ID služby bude odpovídat jakémukoli ID služby.
Metody vyhledávání ()
The ServiceRegistrar
je vzhlédnout()
metody mají dvě přetížené formy. Tyto dvě formy se liší hlavně v počtu shod a položek služeb, které každá z nich vrátí. Formulář se dvěma parametry může vrátit více shod dotazu vyjádřeného v Šablona služby
, zatímco formulář s jedním parametrem vrátí pouze jednu shodu. Dvouparametrový formulář navíc vrací celé servisní položky; formulář s jedním parametrem vrací pouze objekt služby.
Dvouparametrový formulář lookup ()
Zde je ukázka javadoc, která vysvětluje dvouparametrovou formu vzhlédnout()
:
veřejné vyhledávání ServiceMatches (ServiceTemplate tmpl, int maxMatches) hodí java.rmi.RemoteException;
[Vrátí se] nanejvýš maxMatches
položky odpovídající šabloně plus celkový počet položek, které odpovídají šabloně. Návratová hodnota není nikdy nula
a pole vrácených položek je pouze nula
-li maxMatches
je nula. Pokud u každé vrácené položky nelze objekt služby deserializovat, je pole služby u položky nastaveno na nula
a není vyvolána žádná výjimka. Podobně, pokud sadu atributů nelze deserializovat, tento prvek sady atributů
pole je nastaveno na nula
a není vyvolána žádná výjimka.
Zde je Servisní shody
třída:
balíček net.jini.core.lookup;
public class ServiceMatches rozšiřuje java.lang.Object implementuje java.io.Serializable {
public ServiceItem [] položky; public int totalMatches; }
A tady je ServiceItem
třída:
balíček net.jini.core.lookup;
public class ServiceMatches rozšiřuje java.lang.Object implementuje java.io.Serializable {
veřejné položky [] sady atributů; veřejná služba java.lang.Object; public ServiceID serviceID; }
Jak již bylo zmíněno dříve, každý prvek položky
pole vrácené dvouparametrovým formulářem je úplná položka služby, která zahrnuje objekt služby, ID služby a všechny sady atributů. The maxMatches
pole pomáhá klientům spravovat počet objektů vrácených tímto vzhlédnout()
.
Délka položky
pole ve vráceném Servisní shody
objekt je menší nebo roven hodnotě předané vzhlédnout()
v maxMatches
. Celkový počet odpovídajících položek služby (vráceno v totalMatches
) je větší nebo roven délce položky
pole.
Například pokud maxMatches
je 50 a servisní šablona odpovídá 25 položkám, což je délka vráceného zboží položky
pole a hodnota totalMatches
jsou oba 25. Alternativně, pokud maxMatches
je 50, ale servisní šablona odpovídá 100 položkám, což je délka vrácené položky položky
pole je 50 a hodnota totalMatches
je 100. Když se šablona služby shoduje s více než maxMatches
položky služby, položky služby vrácené dvěma parametry vzhlédnout()
jsou náhodně vybrány z celé sady odpovídajících položek služeb.
Jednoparametrová forma vyhledávání ()
Jeden parametr vzhlédnout()
metoda vrátí jeden odpovídající objekt služby vybraný náhodně ze všech shod. Zde je výňatek z javadocu vysvětlující tento formulář:
veřejné vyhledávání objektů (ServiceTemplate tmpl) vyvolá java.rmi.RemoteException;Vrátí objekt služby (tj. Jen
ServiceItem.service
) z položky odpovídající šabloně nebo nula
pokud neexistuje shoda. Pokud šabloně odpovídá více položek, je libovolné, který objekt služby se vrátí. Pokud vrácený objekt nelze deserializovat, an UnmarshalException
je vyvolána standardní sémantikou RMI.Protože jeden parametr vzhlédnout()
vrátí pouze jeden odpovídající objekt služby, klienti mohou minimalizovat počet stažených souborů stavu a souborů tříd. Ale protože vrácený objekt služby je vybrán libovolně a není identifikován ID služby nebo popsán přidruženými sadami atributů, klient musí mít jistotu, že žádný odpovídající servisní objekt bude stačit.
Metody procházení
Kromě těch dvou vzhlédnout()
metody, ServiceRegistrar
má tři metody procházení, které poskytují informace o registrovaných službách. Tyto tři metody - getServiceTypes ()
, getEntryClasses ()
, a getFieldValues ()
-- se nazývají metody procházení protože umožňují klientům procházet služby a atributy ve vyhledávací službě.
The getServiceTypes ()
metoda trvá a Šablona služby
(stejný Šablona služby
který je předán vzhlédnout()
metody) a a Tětiva
předpona. Vrací pole Třída
instance představující nejkonkrétnější typy (třídy nebo rozhraní) objektů služby, které odpovídají šabloně. Tyto objekty služby nejsou ani stejné, ani nadtřídy žádného z typů uvedených v šabloně, a mají názvy, které začínají zadanou předponou. Objekt služby nebo objekty, pro které Třída
jsou vráceny instance jsou všechny instance všech typů (pokud existují) předaných v šabloně, ale Třída
instance jsou konkrétnější než (a jsou to podtřídy nebo podrozhraní) těchto typů. Každá třída se ve vráceném poli objeví pouze jednou a v libovolném pořadí.
Tady je co getServiceTypes ()
vypadá jako:
public java.lang.Class [] getServiceTypes (ServiceTemplate tmpl, prefix java.lang.String) hodí java.rmi.RemoteException;
The getEntryTypes ()
metoda trvá a Šablona služby
a vrátí pole Třída
instance, které představují nejkonkrétnější třídy položek pro položky služby, které odpovídají šabloně, které buď neodpovídají žádné šabloně položky, nebo jsou podtřídou jedné. Každá třída se ve vráceném poli objeví pouze jednou, opět v libovolném pořadí.
Tady je co getEntryClasses ()
vypadá jako:
public java.lang.Class [] getEntryClasses (ServiceTemplate tmpl) hodí java.rmi.RemoteException;
The getFieldValues ()
metoda trvá a Šablona služby
, celočíselný index a Tětiva
název pole. Vrací pole Objekt
s pro pojmenované pole všech instancí položky, která se objeví v Šablona služby
je Vstup[]
pole u libovolného vyhovujícího indexu položky služby. Každý objekt konkrétní třídy a hodnoty se v vráceném poli zobrazí pouze jednou a v libovolném pořadí.
Tady je co getFieldValues ()
vypadá jako:
public java.lang.Object [] getFieldValues (ServiceTemplate tmpl, int setIndex, pole java.lang.String) hodí java.lang.NoSuchFieldException, java.rmi.RemoteException;
Chování a účel těchto metod procházení mohou být nejasné. Můžete si je představit jako nástroje, které postupně zužují dotazy vyhledávací služby.
Například klient, jako je grafický prohlížeč vyhledávací služby, by se mohl nejdříve vyvolat getServiceTypes ()
s prázdnou šablonou. The getServiceTemplate ()
metoda vrací všechny možné typy služeb registrované ve vyhledávací službě, které by prohlížeč mohl zobrazit. Uživatel může vybrat jeden nebo více typů a poté stisknout tlačítko Požadavek. Prohlížeč by přidal tento typ (nebo typy) do šablony služby a vyvolal getServiceTypes ()
znovu. Prohlížeč vrátí a zobrazí menší seznam typů. Uživatel si může jednu vybrat a stisknout tlačítko Záznamy. Prohlížeč by vytvořil šablonu s naposledy vybraným typem nebo typy služeb a poté by vyvolal getEntryTypes ()
. The getEntryTypes ()
metoda vrátí pole vstupních tříd, které by pak prohlížeč mohl zobrazit.
Uživatel může vybrat některé položky - a pole vybrané položky - a stisknout tlačítko Pole. Prohlížeč by vytvořil šablonu pomocí aktuálně vybrané služby a typů záznamů. Poté by předal index vstupní třídy, ve které uživatel pole vybral, a název vybraného pole getFieldValues ()
. Prohlížeč by zobrazil všechny hodnoty, které getFieldValues ()
vrátil. S těmito hodnotami by uživatel mohl dále zúžit hledání služby, případně zvolit konkrétní službu. Tyto metody tedy pomáhají klientům bez ohledu na to, zda se jedná o lidského uživatele, procházet služby registrované ve vyhledávací službě. Pole vrácená z metod procházení mohou klientovi pomoci dále upřesnit jeho dotazy, což nakonec povede k Šablona služby
to, když je předáno vzhlédnout()
, vrátí nejvhodnější objekt služby.
Metoda oznámit ()
Kromě metod vyhledávání a procházení, ServiceRegistrar
rozhraní má také oznámit()
metoda, která upozorní klienty, když se nové služby zaregistrují nebo zruší registraci ve vyhledávací službě:
veřejné upozornění EventRegistration (ServiceTemplate tmpl, int přechody, posluchač RemoteEventListener, předání MarshalledObject, dlouhý pronájemDuration) vyvolá RemoteException;
Vyvoláváte oznámit()
zaregistrovat sebe (nebo jiného posluchače), abyste obdrželi distribuovanou událost, kdykoli služby, které odpovídají předaným Šablona služby
podstoupit změnu stavu popsanou parametrem přechody.
Parametr přechody je bitový NEBO
jakékoli neprázdné sady těchto tří hodnot, definované jako konstanty v ServiceRegistrar
:
TRANSITION_MATCH_MATCH TRANSITION_MATCH_NOMATCH TRANSITION_NOMATCH_MATCH
Vy stavíte Šablona služby
pro oznámit()
stejným způsobem, pro který to stavíte vzhlédnout()
. V jakémkoli z těchto polí můžete uvést explicitní typy, ID služby, atributy (které se musí přesně shodovat) nebo divoké karty (které se shodují s čímkoli). Přechody jsou založeny na změně (nebo nezměněném) stavu toho, co odpovídá vašemu Šablona služby
před a po provedení jakékoli operace ve vyhledávací službě.
Například, TRANSITION_MATCH_MATCH
označuje, že alespoň jedna položka služby odpovídala vaší šabloně před a po operaci. TRANSITION_MATCH_NOMATCH
označuje, že ačkoli se alespoň jedna konkrétní položka služby shodovala s vaší šablonou před operací, po operaci již neodpovídala vaší šabloně. Chcete-li dostávat oznámení, když jsou do vyhledávací služby přidány jakékoli nové služby, stačí zadat šablonu, která odpovídá jakékoli službě a předat TRANSITION_NOMATCH_MATCH
jako přechod k oznámit()
metoda.
SUBHEAD_BREAK: Vyhledávací služba versus jmenné servery