Programování

Přehled JNDI, Část 3: Pokročilé JNDI

Tento měsíc musím hodně pokrýt půdu, takže vynechám chmýří a stříhám přímo po kulkách. Zaprvé, rozhraní Java Naming and Directory Interface hraje důležitou roli v několika technologiích Java. Podíváme se na tuto roli, abychom lépe porozuměli strategické pozici JNDI v celkovém obrazu Javy. Dále vám jako uznání vaší potřeby fungující služby JNDI představím volně dostupnou přenosnou implementaci LDAP a naučím vás, jak se připojit a používat poskytovatele služeb JNDI. Nakonec vás podrobně prozkoumám vazbou objektů na položky v JNDI.

TEXTOVÉ POLE:

TEXTBOX_HEAD: Přehled JNDI: Přečtěte si celou sérii!

  • Část 1. Úvod do pojmenování služeb

  • Část 2. Použijte adresářové služby JNDI k lepší správě distribuovaných aplikací

  • Část 3. Použijte JNDI k ukládání objektů distribuované aplikace

  • Část 4. Spojte to, co jste se naučili, s aplikací podporující JNDI

: END_TEXTBOX

Než začnu, je v pořádku trochu doublethink. Během posledních dvou měsíců jsem se vás pokusil přesvědčit, že pojmenování a adresářové služby jsou zhruba elektronickým ekvivalentem karetních katalogů nalezených v knihovnách. Nyní, když začínáme prohlídku pokročilých funkcí JNDI, chci, abyste na tuto analogii úplně zapomněli - hrubě nedostatečně ilustruje sílu JNDI.

Začněme pohledem na to, jak se JNDI objevuje v jiných technologiích Java.

JNDI všude

JNDI hraje roli v řadě technologií Java. Zvažme tři z nich: JDBC (balíček Java Database Connectivity), JMS (Java Messaging Service) a EJB (Enterprise JavaBeans).

JDBC je technologie Java pro relační databáze. JNDI se poprvé objevilo ve volitelném balíčku JDBC 2.0 (viz Zdroje) ve spojení s Zdroj dat rozhraní. A Zdroj dat instance, jak naznačuje její název, představuje zdroj dat - často z databáze, ale ne vždy. A Zdroj dat instance ukládá informace o zdroji dat - například jeho název, ovladač, který se má načíst a používat, a jeho umístění - a umožňuje aplikaci získat připojení ke zdroji dat bez ohledu na základní podrobnosti. Specifikace JDBC doporučuje k ukládání používat JNDI Zdroj dat předměty.

JMS je technologie Java pro zasílání zpráv. Specifikace JMS popisuje spravované objekty - objekty, které obsahují konfigurační informace JMS a používají je klienti JMS k vyhledání konkrétních front zpráv a témat. Stejně jako v případě JDBC, specifikace doporučuje lokalizovat spravované objekty JMS prostřednictvím JNDI.

Nakonec zvažte Enterprise JavaBeans. Všechny podnikové fazole publikují domácí rozhraní - jediné umístění, pomocí kterého klienti vyhledávají konkrétní podnikové fazole - prostřednictvím JNDI.

Co přináší JNDI na stůl, který způsobuje, že je tak vysoce ceněn?

Za prvé, JNDI propaguje představu centrálně spravovaného zdroje informací - klíčový požadavek pro podnikové aplikace. Centrálně spravovaný zdroj informací je snadněji spravovatelný než distribuovaná sbírka informačních zdrojů. Pro klienty je také jednodušší najít potřebné informace, pokud se musí dívat pouze na jedno místo.

Zadruhé, jak uvidíte, schopnost JNDI přímo ukládat objekty Java umožňuje téměř transparentní integraci do aplikací Java.

Bod poskytovatele

Chcete-li používat JNDI, potřebujete službu pojmenování a adresářů a poskytovatele služeb JNDI. Sun dodává několik poskytovatelů běžných pojmenovacích a adresářových služeb (pojmenování COS, NIS, registr RMI, LDAP a další). Usadil jsem se na LDAP.

LDAP (Lightweight Directory Access Protocol) má dvojí výhodu v tom, že je široce implementován (v komerční i bezplatné formě) a je poměrně snadno použitelný. Jeho funkce také dobře podporuje poskytovatel služeb Sun LDAP a JNDI.

Vzhledem k tomu, že získání a konfigurace serveru LDAP není ve skutečnosti tématem Java, přivedu vás pouze správným směrem a poskytnu vám odkazy na internetové zdroje.

K dispozici je řada implementací LDAP. Mnoho z nich je komerčních produktů, jako je Netscape Directory Server a IBM Secure Way Directory. Některé jsou zabaleny jako součást větších nabídek (služba Active Directory společnosti Microsoft je součástí systému Windows 2000). Pokud máte přístup k takové implementaci, můžete většinu této části přeskočit. Jinak popíšu OpenLDAP - volně dostupnou implementaci LDAP založenou na referenční implementaci University of Michigan - stejně jako jeho instalaci a konfiguraci.

OpenLDAP je k dispozici z OpenLDAP Foundation (viz zdroje). Jeho licence je založena na „umělecké licenci“ společnosti Perl, což znamená, že OpenLDAP je bezplatný (nebo open source) software. Předbalené binární soubory jsou k dispozici pro různé verze Linuxu (Debian, Red Hat) i BSD Unix. Probíhá práce na portu k Windows NT.

Pokud plánujete instalaci OpenLDAP, měli byste si přečíst Příručka pro správce SLAPD a SLURPD (slapd je název spustitelného serveru LDAP a slurpd je název replikačního serveru LDAP; viz Zdroje pro umístění).

Mám jeden konečný návrh, aby byla vaše celá zkušenost příjemnější: bez ohledu na to, jakou implementaci LDAP používáte, otočte kontrolu schématu vypnuto. Schéma LDAP, podobně jako schéma databáze, definuje omezení uložených informací. Při normálním používání pomáhá kontrola schématu zajistit, aby položky (myslím na položky v adresáři) odpovídaly správnému formátu. Vzhledem k tomu, že budete pravděpodobně hrát spíše než stavět něco trvalého významu, kontrola schématu vám bude překážet. Vezměte si slovo.

Připojení k kontextu JNDI

V předchozích článcích jsem se snažil vyhnout se podrobnému vysvětlování, jak komunikovat s poskytovatelem služeb JNDI, jako je poskytovatel služeb LDAP. Zmínil jsem, že k provádění operací JNDI potřebujete počáteční kontext, ale nestrávil jsem mnoho času tím, abych vám řekl, jak je získat. Dovolte mi vyplnit mezery. (Další informace o počátečních kontextech najdete v prvních dvou článcích této série.)

Než budete moci s JNDI dělat cokoli, potřebujete počáteční kontext. Všechny operace se provádějí vzhledem k kontextu nebo k jednomu z jeho podkontextů.

Získání počátečního kontextu vyžaduje tři kroky:

  1. Nejprve vyberte poskytovatele služeb. Pokud budete používat OpenLDAP nebo jinou implementaci LDAP, Sun dodává referenčního poskytovatele služeb LDAP (viz Zdroje). Přidejte název poskytovatele služeb do sady vlastností prostředí (uložených v Hashtable instance):

     Hashtable hashtableEnvironment = new Hashtable (); hashtableEnvironment.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
  2. Přidejte jakékoli další informace, které poskytovatel služeb vyžaduje. U protokolu LDAP zahrnuje adresu URL, která identifikuje službu, kořenový kontext a jméno a heslo pro připojení:

     // služba: ldap: // localhost: 389 / // kořenový kontext: dc = etcee, dc = com hashtableEnvironment.put (Context.PROVIDER_URL, "ldap: // localhost: 389 / dc = etcee, dc = com "); hashtableEnvironment.put (Context.SECURITY_PRINCIPAL, "name"); hashtableEnvironment.put (Context.SECURITY_CREDENTIALS, "heslo"); 
  3. Nakonec získejte počáteční kontext. Pokud máte v úmyslu provést operace pojmenování, budete potřebovat pouze a Kontext instance. Pokud máte v úmyslu provést také operaci adresáře, budete potřebovat DirContext instance místo. Ne všichni poskytovatelé dodávají obojí:

     Kontextový kontext = nový InitialContext (hashtableEnvironment); 

    Nebo:

     DirContext dircontext = new InitialDirContext (hashtableEnvironment); 

To je vše. Nyní se podívejme na to, jak aplikace ukládají objekty a načítají objekty z JNDI.

Práce s objekty

Schopnost ukládat objekty Java je užitečná: úložiště objektů poskytuje trvalost a umožňuje sdílení objektů mezi aplikacemi nebo mezi různými spouštěními stejné aplikace.

Z hlediska použitého kódu je úložiště objektů překvapivě snadné:

 context.bind ("jméno", objekt) 

The svázat() operace váže jméno na objekt Java. Syntaxe příkazu připomíná RMI, ale sémantika není tak jasně definována. Je to přípustné pro svázat() operace pro uložení například snímku objektu nebo odkazu na „živý“ objekt.

Uvědomte si, že svázat() operace vyvolá a NamingException pokud dojde k výjimce během provádění operace.

Nyní se podívejme na svázat() doplněk provozu - vzhlédnout():

 Objekt object = context.lookup ("name") 

The vzhlédnout() operace načte objekt vázaný na zadaný název. Syntaxe opět připomíná RMI, ale sémantika metody není tak jasně definovaná.

Stejně jako u svázat()vzhlédnout() operace vyvolá a NamingException pokud dojde k výjimce během provádění operace.

Úložiště objektů

Co to znamená uložit objekt do služby pojmenování a adresáře JNDI? Již jsme zmínili, že přesná sémantika svázat() a vzhlédnout() operace nejsou přesně definovány; je na poskytovateli služeb JNDI, aby definoval jejich sémantiku.

Podle specifikace JNDI se poskytovatelům služeb doporučuje (ale není to nutné), aby podporovali ukládání objektů v jednom z následujících formátů:

  • Serializovaná data
  • Odkaz
  • Atributy v kontextu adresáře

Pokud všichni poskytovatelé služeb JNDI podporují tyto standardní mechanismy, programátoři Java mohou vyvíjet obecná řešení, která fungují, i když se změní základní vrstva poskytovatele služeb.

Každá z výše uvedených metod má své výhody i nevýhody. Nejlepší metoda bude záviset na požadavcích vyvíjené aplikace.

Uvažujme každý po druhém.

Jako serializovaná data

Nejviditelnějším přístupem k ukládání objektu v adresáři je ukládání serializované reprezentace objektu. Jediným požadavkem je, aby třída objektu implementovala Serializovatelné rozhraní.

Když je objekt serializován, jeho stav se transformuje na proud bajtů. Poskytovatel služeb převezme proud bajtů a uloží jej do adresáře. Když klient vyhledá objekt, poskytovatel služby jej rekonstruuje z uložených dat.

Následující kód ukazuje, jak svázat a Spojový seznam k záznamu ve službě JNDI:

 // vytvořit propojený seznam LinkedList linkedlist = nový LinkedList (); . . . // bind context.bind ("cn = foo", linkedlist); . . . // lookup linkedlist = (LinkedList) context.lookup ("cn = foo"); 

Je to tak snadné!

Další dvě metody jsou bohužel komplikovanější. Stručně je popíšu, ale podrobnou diskusi si vyhrazuji pro pozdější datum.

Jako reference

Někdy není vhodné (nebo možné) serializovat objekt. Pokud objekt poskytuje službu například v síti, nemá smysl ukládat stav samotného objektu. Zajímají nás informace potřebné k nalezení a komunikaci s objektem.

Příkladem je připojení k externímu prostředku (jednomu mimo rozsah Java Virtual Machine), jako je databáze nebo soubor. Zjevně nemá smysl pokoušet se uložit databázi nebo samotný soubor do služby JNDI. Místo toho chceme uložit informace potřebné k rekonstrukci připojení.

V takovém případě by měl programátor buď svázat a Odkaz instance, která odpovídá objektu nebo má třídu objektu implementovat Odkazovatelné rozhraní (ve kterém objekt generuje a poskytuje a Odkaz například na žádost poskytovatele služeb).

The Odkaz instance obsahuje dostatek informací k opětovnému vytvoření reference. Pokud byl uložen odkaz na soubor, obsahuje odkaz dostatek informací k vytvoření souboru Soubor objekt, který ukazuje na správný soubor.

Jako atributy

Pokud používáte poskytovatele služeb, který poskytuje funkce adresáře namísto pouze funkce pojmenování, můžete objekt také uložit jako kolekci atributů na DirContext objekt (a DirContext instance se liší od a Kontext například v tom, že může mít atributy).

Chcete-li použít tuto metodu, musíte vytvořit objekty, které implementují DirContext rozhraní a obsahují kód nutný k zápisu jejich vnitřního stavu jako Atributy objekt. Musíte také vytvořit továrnu na objekty, abyste objekt rekonstituovali.

Tento přístup je užitečný, když musí být objekt přístupný jinými aplikacemi než Java.

Závěr

Pokud jste si tuto sérii přečetli, měli byste pochopit a ocenit sílu a důležitost JNDI - neslyšíte o ní mnoho, ale je to tam pod kryty.

Příští měsíc se podíváme na aplikaci založenou na JNDI. Mezitím byste se měli pokusit spustit a spustit JNDI na serveru LDAP.

Další informace o tomto tématu

  • Volitelný balíček JDBC 2.0

    //java.sun.com/products/jdbc/articles/package2.html

  • Přejít na OpenLDAP Foundation a stáhnout OpenLDAP

    //www.openldap.org/

  • Ke stažení Příručka pro správce SLAPD a SLURPD, jít do

    //www.umich.edu/~dirsvcs/ldap/doc/guides/

  • Informace o JNDI, poskytovatelé služeb atd

    //java.sun.com/products/jndi/

Tento příběh, „Přehled JNDI, Část 3: Pokročilé JNDI“, původně publikoval JavaWorld.