Programiranje

Pregled JNDI, 3. del: Napredni JNDI

Ta mesec moram prekriti veliko zemlje, zato bom pustil puh in sekal do točk. Prvič, Java Naming in Directory Interface igra pomembno vlogo v več Java tehnologijah. Ogledali si bomo to vlogo, da bomo bolje razumeli strateški položaj JNDI v celotni sliki Java. Nato vam bom v znak priznanja vaše potrebe po delujoči storitvi JNDI predstavil prosto dostopno prenosno izvedbo LDAP in vas naučil, kako se povezati s ponudnikom storitev JNDI in ga uporabljati. Na koncu si bom podrobno ogledal vezi predmetov v vnosih v JNDI.

BESEDILO:

TEXTBOX_HEAD: Pregled JNDI: preberite celotno serijo!

  • Del 1. Uvod v storitve poimenovanja

  • Del 2. Uporabite imeniške storitve JNDI za boljše upravljanje porazdeljenih aplikacij

  • Del 3. Uporabite JNDI za shranjevanje predmetov vaše porazdeljene aplikacije

  • Del 4. Spoznajte, kaj ste se naučili, z aplikacijo, ki podpira JNDI

: END_TEXTBOX

Preden začnem, je malo dvojnega razmišljanja. V zadnjih dveh mesecih sem vas poskušal prepričati, da so storitve poimenovanja in imenikov približno elektronski ekvivalent katalogov kartic v knjižnicah. Zdaj, ko začnemo z ogledom naprednih funkcij JNDI, želim, da popolnoma pozabite na to analogijo - močno podčrta moč JNDI.

Začnimo s pogledom, kako se JNDI pojavlja v drugih tehnologijah Java.

JNDI povsod

JNDI igra vlogo pri številnih tehnologijah Java. Upoštevajmo tri izmed njih: JDBC (paket povezljivosti Java Database Connectivity), JMS (Java Messaging Service) in EJB (Enterprise JavaBeans).

JDBC je tehnologija Java za relacijske zbirke podatkov. JNDI se je prvič pojavil v izbirnem paketu JDBC 2.0 (glej vire) v povezavi z Vir podatkov vmesnik. A Vir podatkov kot že ime pove, predstavlja vir podatkov - pogosto iz baze podatkov, vendar ne vedno. A Vir podatkov primerek shranjuje podatke o podatkovnem viru - na primer njegovo ime, gonilnik za nalaganje in uporabo ter njegovo lokacijo - in omogoča aplikaciji, da vzpostavi povezavo z podatkovnim virom, ne glede na osnovne podrobnosti. Specifikacija JDBC priporoča uporabo JNDI za shranjevanje Vir podatkov predmetov.

JMS je tehnologija Java za sporočanje. Specifikacija JMS opisuje upravljane predmete - predmete, ki vsebujejo informacije o konfiguraciji JMS in jih odjemalci JMS uporabljajo za iskanje določenih čakalnih vrst in tem. Tako kot v primeru JDBC, tudi specifikacija priporoča iskanje predmetov, ki jih upravlja JMS, prek JNDI.

Na koncu razmislite še o podjetju JavaBeans. Vsi zrni podjetja objavijo domači vmesnik - eno lokacijo, prek katere stranke poiščejo določen zrn podjetja - prek JNDI.

Kaj JNDI prinese na mizo, zaradi česar je bila tako zelo cenjena?

Najprej JNDI promovira pojem centralno vodenega vira informacij - ključna zahteva za poslovne aplikacije. Centralno vodeni vir informacij je lažje upravljati kot distribuirano zbirko virov informacij. Za stranke je tudi preprosteje najti potrebne informacije, če jih je treba iskati samo na enem mestu.

Drugič, kot boste videli, sposobnost JNDI, da neposredno shranjuje predmete Java, mu omogoča, da se skoraj transparentno vključi v programe Java.

Točka ponudnika

Če želite uporabljati JNDI, potrebujete storitev poimenovanja in imenikov ter ponudnika storitev JNDI. Sun ponuja več ponudnikov skupnih poimenovalnih in imeniških storitev (poimenovanje COS, NIS, register RMI, LDAP in druge). Sem se ustalil na LDAP.

LDAP (lahek protokol za dostop do imenika) ima dvojne prednosti široke uporabe (v komercialnih in brezplačnih oblikah) in je dokaj enostaven za uporabo. Njegove funkcije dobro podpira tudi Sunov ponudnik storitev LDAP in JNDI.

Ker pridobivanje in konfiguriranje strežnika LDAP v resnici ni predmet Java, vas bom le usmeril v pravo smer in vam ponudil sklice na internetne vire.

Na voljo so številne izvedbe LDAP. Mnogi so komercialni izdelki, kot sta Netscape Directory Server in IBM-ov Secure Way Directory. Nekateri so pakirani kot del večje ponudbe (Microsoftov Active Directory je del sistema Windows 2000). Če imate dostop do take izvedbe, lahko preskočite večino tega razdelka. V nasprotnem primeru bom opisal OpenLDAP - prosto dostopno izvedbo LDAP, ki temelji na referenčni izvedbi Univerze v Michiganu, pa tudi njegovo namestitev in konfiguracijo.

OpenLDAP je na voljo pri fundaciji OpenLDAP (glejte Viri). Njegova licenca temelji na Perlovi "umetniški licenci", kar pomeni, da je OpenLDAP brezplačna (ali odprtokodna) programska oprema. Na voljo so predpakirani binarni programi za različne okuse Linuxa (Debian, Red Hat) in BSD Unix. Potekajo dela na vratih za Windows NT.

Če nameravate namestiti OpenLDAP, preberite SLAPD in SLURPD Administrator's Guide (slapd je ime izvršljive strežnika LDAP, slurpd pa ime strežnika replikacije LDAP; za lokacijo glejte Viri).

Imam še zadnji predlog, s katerim boste polepšali celotno izkušnjo: ne glede na to, katero izvedbo LDAP uporabljate, obrnite preverjanje sheme izključeno. Shema LDAP, kot shema baze podatkov, definira omejitve shranjenih informacij. Pri običajni uporabi preverjanje shem pomaga zagotoviti, da so vnosi (pomislite na vnose v imenik) skladni s pravilno obliko. Ker pa se boste verjetno igrali, namesto da bi gradili nekaj trajnega pomena, vam bo preverjanje sheme le oviralo. Verjemite mi na besedo.

Povezava s kontekstom JNDI

V prejšnjih člankih sem se skušal izogniti podrobnim razlagam, kako sodelovati s ponudnikom storitev JNDI, kot je ponudnik storitev LDAP. Omenil sem, da za izvajanje operacij JNDI potrebujete začetni kontekst, vendar nisem porabil veliko časa, da bi vam povedal, kako do njega. Naj zapolnim vrzeli. (Za več o začetnih okoliščinah glejte prva dva članka v tej seriji.)

Preden lahko kar koli naredite z JNDI, potrebujete začetni kontekst. Vse operacije se izvajajo glede na kontekst ali enega od njegovih podkontekstov.

Pridobitev začetnega konteksta zahteva tri korake:

  1. Najprej izberite ponudnika storitev. Če boste uporabljali OpenLDAP ali katero drugo izvedbo LDAP, bo Sun ponudil referenčnega ponudnika storitev LDAP (glejte Viri). Dodajte ime ponudnika storitev naboru lastnosti okolja (shranjenih v Hashtable primer):

     Hashtable hashtableEnvironment = novo Hashtable (); hashtableEnvironment.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
  2. Dodajte dodatne informacije, ki jih zahteva ponudnik storitev. Za LDAP vključuje URL, ki identificira storitev, korenski kontekst ter ime in geslo za povezavo:

     // storitev: ldap: // localhost: 389 / // korenski kontekst: dc = etcee, dc = com hashtableEnvironment.put (Context.PROVIDER_URL, "ldap: // localhost: 389 / dc = etcee, dc = com "); hashtableEnvironment.put (Context.SECURITY_PRINCIPAL, "ime"); hashtableEnvironment.put (Context.SECURITY_CREDENTIALS, "geslo"); 
  3. Na koncu dobite začetni kontekst. Če nameravate izvesti samo poimenovanje, potrebujete le Kontekst primer. Če nameravate izvesti tudi operacijo imenika, boste potrebovali DirContext namesto tega. Vsi ponudniki ne dobavljajo obeh:

     Kontekstni kontekst = novo InitialContext (hashtableEnvironment); 

    Ali:

     DirContext dircontext = novo InitialDirContext (hashtableEnvironment); 

To je vse. Zdaj pa poglejmo, kako aplikacije shranjujejo predmete in jih pridobivajo iz JNDI.

Delo s predmeti

Sposobnost shranjevanja predmetov Java je koristna: shranjevanje objektov zagotavlja trajnost in omogoča skupno rabo predmetov med aplikacijami ali med različnimi izvedbami iste aplikacije.

S stališča vpletene kode je shranjevanje predmetov presenetljivo enostavno:

 context.bind ("ime", objekt) 

The bind () operacija veže ime na objekt Java. Sintaksa ukaza spominja na RMI, vendar semantika ni tako jasno opredeljena. Dovoljeno je za bind () operacija za shranjevanje na primer posnetka predmeta ali sklica na "živi" objekt.

Zavedajte se, da bind () operacija vrže a NamingException če med izvajanjem operacije pride do izjeme.

Zdaj pa si oglejmo bind () dopolnilo operacije - Poglej gor():

 Objekt objekt = context.lookup ("ime") 

The Poglej gor() operacija pridobi objekt, vezan na določeno ime. Tudi tokrat sintaksa spominja na RMI, vendar semantika metode ni tako jasno opredeljena.

Tako kot pri bind (), Poglej gor() operacija vrže a NamingException če med izvajanjem operacije pride do izjeme.

Shranjevanje predmetov

Kaj pomeni shranjevanje predmeta v poimenovanju in imeniški storitvi JNDI? Omenili smo že, da natančna semantika bind () in Poglej gor() operacije niso natančno opredeljene; ponudnik storitev JNDI mora določiti njihovo semantiko.

V skladu s specifikacijo JNDI ponudnike storitev spodbujamo (ne pa tudi obvezno), da podpirajo shranjevanje predmetov v enem od naslednjih formatov:

  • Serializirani podatki
  • Referenca
  • Atributi v kontekstu imenika

Če vsi ponudniki storitev JNDI podpirajo te standardne mehanizme, lahko programerji Java razvijejo generične rešitve, ki delujejo tudi, ko se spremeni osnovni sloj ponudnika storitev.

Vsaka od zgornjih metod ima prednosti in slabosti. Najboljša metoda bo odvisna od zahtev aplikacije, ki se razvija.

Upoštevajmo vsakega po vrsti.

Kot serializirani podatki

Najbolj očiten pristop k shranjevanju predmeta v imeniku je shranjevanje serializirane predstavitve predmeta. Edina zahteva je, da razred predmeta izvaja Serializabilno vmesnik.

Ko je objekt serializiran, se njegovo stanje spremeni v tok bajtov. Ponudnik storitev prevzame tok bajtov in ga shrani v imenik. Ko stranka odkrije predmet, ga ponudnik storitve rekonstruira iz shranjenih podatkov.

Naslednja koda prikazuje, kako vezati a LinkedList za vnos v storitvi JNDI:

 // ustvari povezani seznam LinkedList linkedlist = nov LinkedList (); . . . // veži context.bind ("cn = foo", linkedlist); . . . // iskanje linkedlist = (LinkedList) context.lookup ("cn = foo"); 

Tako enostavno je!

Na žalost sta drugi dve metodi bolj zapleteni. Na kratko jih bom opisal, vendar si pridržujem podrobno razpravo za kasnejši datum.

Kot referenca

Včasih ni primerno (ali mogoče) serializirati predmet. Če objekt na primer ponuja storitev v omrežju, ni smiselno shranjevati stanja samega predmeta. Zanimajo nas informacije, potrebne za iskanje in komunikacijo s predmetom.

Primer je povezava z zunanjim virom (tistim, ki je zunaj obsega navideznega računalnika Java), kot je baza podatkov ali datoteka. Očitno ni smiselno poskušati shraniti zbirke podatkov ali same datoteke v storitev JNDI. Namesto tega želimo shraniti podatke, potrebne za obnovo povezave.

V tem primeru mora programer bodisi vezati a Referenca primerek, ki ustreza predmetu ali ima razred predmeta, ki izvaja Navedljivo vmesnik (v katerem objekt generira in zagotavlja Referenca na zahtevo ponudnika storitev).

The Referenca Primer vsebuje dovolj informacij za ponovno ustvarjanje sklica. Če je bil shranjen sklic na datoteko, vsebuje sklic dovolj informacij za ustvarjanje datoteke mapa predmet, ki kaže na pravilno datoteko.

Kot atributi

Če uporabljate ponudnika storitev, ki namesto funkcije poimenovanja ponuja funkcionalnost imenika, lahko predmet shranite tudi kot zbirko atributov na DirContext predmet (a DirContext primerek razlikuje od a Kontekst primer, ker ima lahko atribute).

Če želite uporabiti to metodo, morate ustvariti predmete, ki izvajajo DirContext in vsebujejo kodo, potrebno za zapis notranjega stanja kot Lastnosti predmet. Za rekonstitucijo predmeta morate ustvariti tudi tovarno predmetov.

Ta pristop je koristen, kadar morajo do predmeta dostopati aplikacije, ki niso Java.

Zaključek

Če ste serijo prebrali, bi morali razumeti in ceniti moč in pomen JNDI - o njem ne slišite veliko, je pa tam pod platnicami.

Naslednji mesec si bomo ogledali aplikacijo, ki temelji na JNDI. V tem času poskusite JNDI zagnati in zagnati na strežniku LDAP.

Preberite več o tej temi

  • Izbirni paket JDBC 2.0

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

  • Pojdite na OpenLDAP Foundation, da prenesete OpenLDAP

    //www.openldap.org/

  • Prenesti SLAPD in SLURPD skrbniški priročnik, Pojdi do

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

  • Informacije JNDI, ponudniki storitev itd

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

To zgodbo, "Pregled JNDI, 3. del: Napredni JNDI", je prvotno objavil JavaWorld.

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