Programavimas

JNDI apžvalga, 3 dalis: Išplėstinė JNDI

Šį mėnesį man reikia padengti daug žemės, todėl paliksiu pūkus ir nukirsiu tiesiai į kulkos taškus. Pirma, „Java“ pavadinimų ir katalogų sąsaja vaidina svarbų vaidmenį keliose „Java“ technologijose. Mes pažvelgsime į šį vaidmenį, kad geriau suprastume JNDI strateginę poziciją bendrame „Java“ paveikslėlyje. Toliau, pripažindamas jūsų poreikį žaisti veikiančią JNDI paslaugą, supažindinsiu jus su laisvai prieinamu, nešiojamuoju LDAP diegimu ir išmokysiu prisijungti prie JNDI paslaugų teikėjo ir juo naudotis. Galiausiai aš jus atidžiai apžiūrėsiu, kaip objektai susiejami su įrašais JNDI.

TEKSTO DĖŽUTĖ:

TEXTBOX_HEAD: JNDI apžvalga: Perskaitykite visą seriją!

  • 1 dalis. Įvadas į vardų teikimo paslaugas

  • 2 dalis. Norėdami geriau valdyti paskirstytas programas, naudokite JNDI katalogų paslaugas

  • 3 dalis. Naudokite JNDI, kad išsaugotumėte paskirstytos programos objektus

  • 4 dalis. Suimkite tai, ką išmokote, naudodamiesi JNDI įgalinta programa

: END_TEXTBOX

Prieš pradedant, šiek tiek dvejojasi. Per pastaruosius du mėnesius bandžiau įtikinti, kad vardų suteikimo ir katalogų paslaugos yra maždaug elektroninis bibliotekose randamų kortelių katalogų atitikmuo. Dabar, kai pradedame pažangiųjų JNDI funkcijų apžvalgą, noriu, kad jūs visiškai pamirštumėte šią analogiją - ji labai nepakankamai įvertina JNDI galią.

Pradėkime nuo to, kaip JNDI atrodo kitose „Java“ technologijose.

JNDI visur

JNDI vaidina svarbų vaidmenį daugelyje „Java“ technologijų. Panagrinėkime tris iš jų: JDBC („Java Database Connectivity“ paketas), JMS („Java Messaging Service“) ir EJB („Enterprise JavaBeans“).

JDBC yra „Java“ technologija, skirta reliacinėms duomenų bazėms. JNDI pirmą kartą pasirodė JDBC 2.0 neprivalomame pakete (žr. Ištekliai) kartu su Duomenų šaltinis sąsaja. A Duomenų šaltinis pavyzdys, kaip rodo jo pavadinimas, yra duomenų šaltinis - dažnai iš duomenų bazės, bet ne visada. A Duomenų šaltinis egzempliorius saugo informaciją apie duomenų šaltinį, pvz., jo pavadinimą, tvarkyklę, kurią reikia įkelti ir naudoti, ir vietą - ir leidžia programai gauti ryšį su duomenų šaltiniu, neatsižvelgiant į pagrindinę informaciją. JDBC specifikacijoje rekomenduojama saugoti JNDI Duomenų šaltinis objektai.

JMS yra „Java“ technologija pranešimams siųsti. JMS specifikacijoje aprašomi administruojami objektai - objektai, kuriuose yra JMS konfigūracijos informacija ir kuriuos JMS klientai naudoja ieškodami konkrečių pranešimų eilių ir temų. Kaip ir JDBC atveju, specifikacijoje rekomenduojama JMS administruojamus objektus rasti per JNDI.

Galiausiai apsvarstykite „Enterprise JavaBeans“. Visos įmonės pupelės per JNDI skelbia namų sąsają - vienintelę vietą, per kurią klientai nustato konkrečią įmonės pupelę.

Ką JNDI pateikia į stalą, dėl kurio jis yra taip vertinamas?

Pirma, JNDI skatina centralizuotai valdomo informacijos šaltinio sampratą - pagrindinį reikalavimą įmonėms. Centralizuotai valdomą informacijos šaltinį lengviau administruoti nei paskirstytą informacijos šaltinių rinkinį. Taip pat klientams paprasčiau rasti reikiamą informaciją, jei jiems tereikia ieškoti vienoje vietoje.

Antra, kaip pamatysite, JNDI galimybė tiesiogiai saugoti „Java“ objektus leidžia beveik skaidriai integruotis į „Java“ programas.

Teikėjo esmė

Norėdami naudoti JNDI, jums reikia pavadinimų ir katalogų paslaugos bei JNDI paslaugų teikėjo. „Sun“ teikia keletą bendrų vardų ir katalogų paslaugų teikėjų (COS pavadinimų suteikimas, NIS, RMI registras, LDAP ir kt.). Aš apsisprendžiau dėl LDAP.

„LDAP“ („Lightweight Directory Access Protocol“) pranašumai yra tai, kad ji yra plačiai įgyvendinama (tiek komercine, tiek laisva forma) ir yra gana paprasta naudoti. Jos savybes taip pat gerai palaiko „Sun“ LDAP paslaugų teikėjas ir JNDI.

Kadangi LDAP serverio gavimas ir konfigūravimas iš tikrųjų nėra „Java“ dalykas, aš jus nukreipsiu tik teisinga linkme ir pateiksiu nuorodas į interneto išteklius.

Yra daugybė LDAP diegimų. Daugelis yra komerciniai produktai, tokie kaip „Netscape Directory Server“ ir „IBM Secure Way Directory“. Kai kurie yra supakuoti kaip didesnių pasiūlymų dalis („Microsoft Active Directory“ yra „Windows 2000“ dalis). Jei turite prieigą prie tokio diegimo, galite praleisti didžiąją dalį šio skyriaus. Kitu atveju aprašysiu „OpenLDAP“ - laisvai prieinamą LDAP diegimą, pagrįstą Mičigano universiteto nuorodų diegimu, taip pat jo diegimą ir konfigūraciją.

„OpenLDAP“ galima gauti iš „OpenLDAP Foundation“ (žr. Ištekliai). Jo licencija grindžiama „Perl“ „menine licencija“, o tai reiškia, kad „OpenLDAP“ yra nemokama (arba atviro kodo) programinė įranga. Fasuoti dvejetainiai failai yra prieinami įvairiems „Linux“ („Debian“, „Red Hat“) ir „BSD Unix“ skoniams. Vyksta darbas su „Windows NT“ prievadu.

Jei planuojate įdiegti „OpenLDAP“, turėtumėte perskaityti SLAPD ir SLURPD administratoriaus vadovas (slapd yra LDAP serverio vykdomojo failo pavadinimas, o slurpd yra LDAP replikacijos serverio pavadinimas; žr. Vietos išteklius).

Turiu vieną paskutinį pasiūlymą, kad visa jūsų patirtis būtų malonesnė: nesvarbu, kurį LDAP diegimą naudojate, pasukite schemos tikrinimą išjungtas. LDAP schema, kaip ir duomenų bazės schema, apibrėžia saugomos informacijos apribojimus. Įprastai naudojant schemų tikrinimą galima įsitikinti, kad įrašai (pagalvokite apie adresų knygos įrašus) atitinka teisingą formatą. Tačiau kadangi tikriausiai žaisite, o ne kursite ilgalaikę reikšmę, schemų tikrinimas tiesiog trukdys. Priimk mano žodį.

Prisijungimas prie JNDI konteksto

Ankstesniuose straipsniuose bandžiau vengti išsamiai paaiškinti, kaip bendrauti su JNDI paslaugų teikėju, pavyzdžiui, LDAP paslaugų teikėju. Aš minėjau, kad norint atlikti JNDI operacijas, reikia pradinio konteksto, bet aš praleidau ne daug laiko, kad pasakyčiau, kaip jį gauti. Leisk man užpildyti spragas. (Norėdami daugiau sužinoti apie pradinius kontekstus, žr. Pirmuosius du šios serijos straipsnius.)

Kad galėtumėte ką nors padaryti su JNDI, jums reikia pradinio konteksto. Visos operacijos atliekamos atsižvelgiant į kontekstą arba vieną iš jo potekstių.

Norint gauti pradinį kontekstą reikia atlikti tris veiksmus:

  1. Pirmiausia pasirinkite paslaugų teikėją. Jei ketinate naudoti „OpenLDAP“ ar kitą LDAP diegimą, „Sun“ teikia referencinį LDAP paslaugų teikėją (žr. Ištekliai). Prie aplinkos savybių rinkinio (saugomo a.) Pridėkite paslaugų teikėjo pavadinimą „Hashtable“ instancija):

     Hashtable hashtableEnvironment = new Hashtable (); hashtableEnvironment.put (kontekstas.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
  2. Pridėkite papildomos informacijos, kurios reikalauja paslaugų teikėjas. LDAP, kuriame yra URL, identifikuojantis paslaugą, šakninis kontekstas, vardas ir slaptažodis, su kuriais norite susisiekti:

     // paslauga: ldap: // localhost: 389 / // šaknies kontekstas: dc = etcee, dc = com hashtableEnvironment.put (Context.PROVIDER_URL, "ldap: // localhost: 389 / dc = etcee, dc = com "); hashtableEnvironment.put (kontekstas.SECURITY_PRINCIPAL, "vardas"); hashtableEnvironment.put (kontekstas.SECURITY_CREDENTIALS, „slaptažodis“); 
  3. Galiausiai gaukite pradinį kontekstą. Jei tik ketinate atlikti pavadinimo operacijas, jums reikės tik Kontekstas instancija. Jei ketinate atlikti ir katalogo operaciją, jums reikės „DirContext“ vietoj to. Ne visi tiekėjai tiekia:

     Konteksto kontekstas = new InitialContext (hashtableEnvironment); 

    Arba:

     DirContext dircontext = new InitialDirContext (hashtableEnvironment); 

Tai viskas. Dabar pažiūrėkime, kaip programos saugo objektus ir gauna objektus iš JNDI.

Darbas su daiktais

Galimybė saugoti „Java“ objektus yra naudinga: objektų saugykla suteikia patvarumą ir leidžia dalytis objektais tarp programų arba tarp skirtingų tos pačios programos vykdymų.

Kalbant apie susijusį kodą, objektų saugojimas yra stebėtinai lengvas:

 context.bind („vardas“, objektas) 

įpareigoti() operacija susieja pavadinimą su „Java“ objektu. Komandos sintaksė primena RMI, tačiau semantika nėra taip aiškiai apibrėžta. Tai leidžiama įpareigoti() pavyzdžiui, objekto momentinės nuotraukos arba nuorodos į „gyvą“ objektą išsaugojimo operacija.

Žinokite, kad įpareigoti() operacija meta a „NamingException“ jei vykdant operaciją įvyksta išimtis.

Dabar pažvelkime į įpareigoti() operacijos papildymas - ieškoti ():

 Object object = context.lookup ("vardas") 

ieškoti () operacija nuskaito objektą, susietą su nurodytu vardu. Sintaksė dar kartą primena RMI, tačiau metodo semantika nėra taip aiškiai apibrėžta.

Kaip ir su įpareigoti(), ieškoti () operacija meta a „NamingException“ jei vykdant operaciją įvyksta išimtis.

Objekto saugojimas

Ką reiškia saugoti objektą JNDI pavadinimų ir katalogų tarnyboje? Mes jau minėjome, kad tiksli įpareigoti() ir ieškoti () operacijos nėra griežtai apibrėžtos; JNDI paslaugų teikėjas turi apibrėžti savo semantiką.

Pagal JNDI specifikaciją paslaugų teikėjai skatinami (bet neprivalomi) palaikyti objektų saugojimą vienu iš šių formatų:

  • Serijiniai duomenys
  • Nuoroda
  • Atributai katalogo kontekste

Jei visi JNDI paslaugų teikėjai palaiko šiuos standartinius mechanizmus, „Java“ programuotojai gali laisvai kurti bendrus sprendimus, kurie veikia net ir pasikeitus pagrindiniam paslaugų teikėjo sluoksniui.

Kiekvienas iš aukščiau aprašytų metodų turi privalumų ir trūkumų. Geriausias metodas priklausys nuo kuriamos programos reikalavimų.

Apsvarstykime kiekvieną iš eilės.

Kaip serijiniai duomenys

Akivaizdžiausias būdas saugoti objektą kataloge yra saugoti nuoseklų objekto vaizdą. Vienintelis reikalavimas yra tai, kad objekto klasė įgyvendintų Serijinis sąsaja.

Kai objektas yra nuoseklus, jo būsena virsta baitų srautu. Paslaugų teikėjas paima baitų srautą ir išsaugo jį kataloge. Kai klientas ieško objekto, paslaugų teikėjas jį rekonstruoja iš saugomų duomenų.

Šis kodas parodo, kaip susieti a „LinkedList“ prie įrašo JNDI tarnyboje:

 // sukurti susietą sąrašą LinkedList linkedlist = new LinkedList (); . . . // susieti kontekstą.bind ("cn = foo", susietas sąrašas); . . . // lookup linkedlist = (LinkedList) context.lookup ("cn = foo"); 

Tai taip paprasta!

Deja, kiti du metodai yra sudėtingesni. Aš juos trumpai aprašysiu, tačiau išsamią diskusiją pasiliksiu vėlesnei datai.

Kaip nuoroda

Kartais nėra tikslinga (arba įmanoma) serializuoti objektą. Pavyzdžiui, jei objektas teikia paslaugą tinkle, nėra prasmės saugoti paties objekto būsenos. Mus domina informacija, reikalinga objektui surasti ir su juo bendrauti.

Pavyzdys yra ryšys su išoriniu ištekliu (tokiu, kuris nepatenka į „Java“ virtualiosios mašinos taikymo sritį), pvz., Duomenų bazės ar failo. Aišku nėra prasmės bandyti saugoti duomenų bazę ar patį failą JNDI tarnyboje. Vietoj to mes norime išsaugoti informaciją, reikalingą ryšiui atkurti.

Tokiu atveju programuotojas turėtų arba susieti a Nuoroda egzempliorius, atitinkantis objektą arba nurodantis objekto klasei įgyvendinti Nurodoma sąsaja (kurioje objektas sukuria ir teikia a Nuoroda paslaugos teikėjo prašymu).

Nuoroda egzemplioriuje yra pakankamai informacijos, kad būtų galima atkurti nuorodą. Jei buvo išsaugota nuoroda į failą, nuorodoje yra pakankamai informacijos, kad būtų galima sukurti Failas objektas, kuris nurodo teisingą failą.

Kaip atributus

Jei naudojate paslaugų teikėją, kuris teikia katalogų funkcijas, o ne tik vardų suteikimo funkcijas, taip pat galite saugoti objektą kaip atributų rinkinį „DirContext“ objektas (a „DirContext“ egzempliorius skiriasi nuo a Kontekstas pavyzdžiui, kad jis gali turėti atributų).

Norėdami naudoti šį metodą, turite sukurti objektus, kurie įgyvendina „DirContext“ sąsają ir joje yra kodas, būtinas jų vidinei būsenai parašyti kaip Atributai objektas. Taip pat turite sukurti objektų gamyklą, kad atkurtumėte objektą.

Šis metodas yra naudingas, kai objektas turi būti pasiekiamas ne „Java“ programomis.

Išvada

Jei skaitėte seriją, turėtumėte suprasti ir įvertinti JNDI galią ir svarbą - apie tai nedaug girdite, bet ji yra po priedanga.

Kitą mėnesį apžvelgsime JNDI pagrįstą programą. Tuo tarpu turėtumėte pabandyti JNDI paleisti LDAP serveryje.

Sužinokite daugiau apie šią temą

  • JDBC 2.0 neprivalomas paketas

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

  • Eikite į „OpenLDAP Foundation“ ir atsisiųskite „OpenLDAP“

    //www.openldap.org/

  • Atsisiųsti SLAPD ir SLURPD administratoriaus vadovas, eiti į

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

  • JNDI informacija, paslaugų teikėjai ir pan

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

Šią istoriją „JNDI apžvalga, 3 dalis: Išplėstinė JNDI“ iš pradžių paskelbė „JavaWorld“.