Ne teistä, jotka olette käyneet kirjastossa ja muistatte vielä kokemuksen, saattavat muistuttaa kirjastokirjan löytämisprosessia. Jos et ole yhteydessä antikvaariseen puoleen, tämä tilanne tuntuu tuntemattomalta; mutta silloin tällöin lähden paikallisesta kirjastosta etsimään aitoa, offline-kirjaa. Kirjastot ovat täynnä tuhansia asioita - ne ovat pölyisiä, puumassasta ja lehmännahoista, mutta kiehtovia omalla tavallaan. Joka tapauksessa, kun pakko löytää tietty henkilö iskee, vältän naiivia kulkemista kirjaston käytävillä ylös ja alas etsimällä sitä ja käännyn sen sijaan korttiluetteloon.
TEXTBOX: TEXTBOX_HEAD: JNDI -yleiskatsaus: Lue koko sarja!
- Osa 1. Johdanto nimipalveluihin
Osa 2. Käytä JNDI-hakemistopalveluja hallitaksesi paremmin hajautettuja sovelluksiasi
Osa 3. Käytä JNDI: tä tallentaaksesi hajautetun sovelluksesi objektit
Osa 4. Yhdistä oppimasi JNDI-yhteensopivalla sovelluksella: END_TEXTBOX
Korttiluettelo aloittelijoille kartoittaa kirjojen nimet niiden sijainnille kirjastossa. Menemällä ensin korttiluetteloon ja etsimällä kirjan sijainnin säästän itselleni huomattavan määrän kävelyä. (Muuten, olen kuullut, että jotkut kirjastot todella antavat suojelijoille mahdollisuuden käyttää tietokoneita korttiluettelon sijaan. Heillä on se puoliksi - nyt, jos he vain asettavat kirjojen tiedot tietokoneeseen, johon se kuuluu. ..)
Niin yllättävältä kuin se saattaakin tuntua, korttiluettelon käsite on melko kätevä myös tietojenkäsittelymaailmassa. Laskennassa kutsumme sitä a nimeämispalvelu joka yhdistää nimet palvelujen sijainteihin ja tietoihin. Se tarjoaa tietokoneohjelmille yhden sijainnin, josta he voivat löytää tarvitsemansa resurssit. Tavallaan ohjelmat eivät tuhlaa aikaa suorittamalla elektronisen vastaavuuden kävelemällä käytävillä ylöspäin ja alaspäin, eivätkä ne myöskään vaadi, että sijainnit koodataan kovasti niiden logiikkaan.
Resurssien löytäminen on erityisen tärkeää suurissa yritysympäristöissä, joissa rakentamasi sovellukset voivat riippua muiden osastojen muiden ryhmien kirjoittamien sovellusten tarjoamista palveluista. Hyvin suunniteltu nimeämisinfrastruktuuri mahdollistaa tällaiset projektit - ja yhden puuttuminen tekee niistä mahdotonta. Itse asiassa monet liiketoimintaprosessien uudelleensuunnittelupyrkimykset alkavat vankan, koko yrityksen kattavan nimeämis- ja hakemistoinfrastruktuurin suunnittelusta ja toteuttamisesta.
Tässä kuussa esitän Java Naming and Directory Interface (JNDI) -palvelun. JNDI tarjoaa yhteisen nimittäjärajapinnan monille olemassa oleville nimeämispalveluille. Sellaisena JNDI: tä ei ole suunniteltu korvaamaan nykyistä tekniikkaa; sen sijaan se tarjoaa yhteisen käyttöliittymän olemassa oleville nimeämispalveluille. Aloitetaan katsomalla joitain näistä palveluista.
Johdanto nimipalveluihin
Alla oleva kuva kuvaa yleisen nimeämispalvelun organisaatiota.
Nimipalvelu ylläpitää joukkoa siteet. Sidokset liittyvät nimiin esineisiin. Kaikki nimijärjestelmän objektit nimetään samalla tavalla (eli ne tilaavat saman nimeämiskäytäntö). Asiakkaat etsivät objekteja nimen perusteella nimipalvelun avulla.
On olemassa useita olemassa olevia nimeämispalveluja, joista muutamia kuvaan alla. Ne seuraavat kukin yllä olevaa mallia, mutta eroavat toisistaan yksityiskohdissa.
COS: n (Common Object Services) nimeäminen: CORBA-sovellusten nimipalvelu; sallii sovellusten tallentaa ja käyttää viitteitä CORBA-objekteihin.
DNS (verkkotunnusjärjestelmä): Internetin nimipalvelu; kartoittaa ihmisystävälliset nimet (kuten www.etcee.com) tietokoneystävällisiksi IP (Internet Protocol) -osoitteiksi pisteviivalla (207.69.175.36). Mielenkiintoista on, että DNS on hajautettu nimipalvelu, mikä tarkoittaa, että palvelu ja sen taustalla oleva tietokanta ovat levinneet moniin Internet-isäntiin.
LDAP (Lightweight Directory Access Protocol): Kehittänyt Michiganin yliopisto; kuten nimestään käy ilmi, se on kevyt versio DAP: stä (Directory Access Protocol), joka puolestaan on osa verkkohakemistopalvelujen standardia X.500. Tällä hetkellä yli 40 yritystä tukee LDAP: tä.
- NIS (verkkotietojärjestelmä) ja NIS +: Sun Microsystemsin kehittämät verkon nimeämispalvelut. Molemmat sallivat käyttäjien käyttää minkä tahansa isännän tiedostoja ja sovelluksia yhdellä tunnuksella ja salasanalla.
Yleiset piirteet
Kuten aiemmin mainitsin, nimijärjestelmän ensisijainen tehtävä on sitoa nimet esineisiin (tai joissakin tapauksissa viittauksiin esineisiin - enemmänkin hetkessä). Ollakseen nimipalvelu, palvelun on ainakin tarjottava kyky sitoa nimiä esineisiin ja etsiä esineitä nimittäin.
Monet nimeämisjärjestelmät eivät tallenna esineitä suoraan. Sen sijaan ne tallentavat viittauksia esineisiin. Harkitse esimerkkinä DNS. Osoite 207.69.175.36 viittaa tietokoneen sijaintiin Internetissä, ei itse tietokoneeseen.
JNDI tarjoaa käyttöliittymän, joka tukee kaikkia näitä yleisiä toimintoja. Esittelen tämän käyttöliittymän myöhemmin tässä artikkelissa.
Niiden erot
On myös tärkeää ymmärtää, miten nykyiset nimeämispalvelut eroavat toisistaan, koska JNDI: n on tarjottava toimiva abstraktio, joka kiertää nämä erot.
Toiminnallisten erojen lisäksi merkittävin ero on tapa, jolla kukin nimipalvelu vaatii nimien määrittämistä - sen nimeämiskäytäntö. Muutaman esimerkin tulisi havainnollistaa ongelmaa.
DNS: ssä nimet rakennetaan komponenteista, jotka on erotettu pisteillä ("."). He lukevat oikealta vasemmalle. Nimi "www.etcee.com" nimeää koneen nimeltä "www" verkkotunnuksessa "etcee.com". Samoin nimi "etcee.com" nimeää verkkotunnuksen "etcee" ylätason verkkotunnuksessa "com".
LDAP: ssä tilanne on hieman monimutkaisempi. Nimet on rakennettu komponenteista, jotka on erotettu pilkuilla (","). Kuten DNS-nimet, he lukevat oikealta vasemmalle. LDAP-nimen komponentit on kuitenkin määritettävä nimi / arvo-pareiksi. Nimi "cn = Todd Sundsted, o = ComFrame, c = US" nimeää henkilön "cn = Todd Sundsted" organisaatiossa "o = ComFrame, c = US". Samoin nimi "o = ComFrame, c = US" nimeää organisaation "o = ComFrame" maassa "c = US".
Kuten yllä olevat esimerkit havainnollistavat, pelkästään nimipalvelun nimeämiskäytännöllä on mahdollisuus tuoda merkittävä määrä taustalla olevan nimipalvelun makua JNDI: hen. Tämä ei ole ominaisuus, jonka toteutusriippumattoman käyttöliittymän pitäisi olla.
JNDI ratkaisee tämän ongelman Nimi
luokka ja sen alaluokat sekä auttajaluokat. Nimi
class edustaa nimeä, joka koostuu järjestetyistä alanimijärjestyksistä, ja tarjoaa menetelmiä nimien käsittelyyn riippumatta alla olevasta nimipalvelusta.
Katsaus JNDI-nimeämiseen
Kuten edellä mainitsin, on tärkeää muistaa, että JNDI on käyttöliittymä pikemminkin kuin toteutus. Tällä tosiasialla on joitain haittoja - tarvitset pääsyn olemassa olevaan nimeämispalveluun (kuten LDAP-palvelu) ja sinun on ymmärrettävä jotain sen toiminnasta pelataksesi JNDI: n kanssa. Toisaalta se antaa JNDI: lle mahdollisuuden integroitua saumattomasti olemassa olevaan tietojenkäsittelyympäristöön, jossa vakiintunut nimeämispalvelu pysyy vauhdissa.
JNDI-nimeäminen pyörii pienen luokkaryhmän ja kourallisen toimintojen ympärillä. Katsotaanpa heitä.
Konteksti ja InitialContext
Asiayhteys
käyttöliittymällä on keskeinen rooli JNDI: ssä. Konteksti edustaa joukkoa sidontoja nimipalvelussa, joilla kaikilla on sama nimeämiskäytäntö. A Asiayhteys
object tarjoaa menetelmät nimien sitomiseksi kohteisiin ja nimien irrotuksen objekteista, objektien uudelleennimeämiseksi ja sidosten luetteloimiseksi.
Jotkut nimeämispalvelut tarjoavat myös alikontekstitoimintoja. Aivan kuten tiedostojärjestelmän hakemisto, alikonteksti on konteksti kontekstissa. Tämä hierarkkinen rakenne mahdollistaa tiedon paremman organisoinnin. Jos haluat nimetä palveluita, jotka tukevat alikonteksteja, Asiayhteys
luokka tarjoaa myös menetelmiä alakontekstien luomiseen ja tuhoamiseen.
JNDI suorittaa kaikki nimeämistoimet suhteessa kontekstiin. Aloittamispaikan löytämiseksi JNDI-määrittely määrittelee InitialContext
luokassa. Tämä luokka muodostetaan ominaisuuksista, jotka määrittelevät käytetyn nimeämispalvelun tyypin ja turvallisuutta tarjoavien nimipalvelujen yhteydessä tunnuksen ja salasanan, joita käytetään muodostettaessa yhteyttä.
Niille teistä, jotka tuntevat RMI: n Nimeäminen
luokassa, monet Asiayhteys
alla kuvattu käyttöliittymä näyttää tutulta. Katsotaanpa Asiayhteys
menetelmät:
void bind (String stringName, Object-objekti)
: Sitoo objektille nimen. Nimi ei saa olla sidottu toiseen objektiin. Kaikkien välikontekstien on jo oltava olemassa.void rebind (String stringName, Object-objekti)
: Sitoo objektille nimen. Kaikkien välikontekstien on jo oltava olemassa.Objektihaku (String stringName)
: Palauttaa määritetyn objektin.void unbind (String stringName)
: Poistaa määritetyn objektin.
Asiayhteys
käyttöliittymä tarjoaa myös menetelmiä sidosten uudelleennimeämiselle ja luetteloimiselle.
void rename (String stringOldName, String stringNewName)
: Muuttaa nimen, johon objekti on sidottu.NamingEnumeration listBindings (String stringName)
: Palauttaa luettelon, joka sisältää määritettyyn kontekstiin sidotut nimet, objektien ja niihin sidottujen objektien luokkien nimet.NamingEnumeration-luettelo (String stringName)
: Palauttaa luettelon, joka sisältää määritettyyn kontekstiin sidotut nimet sekä niihin sidottujen objektien luokkien nimet.
Jokaisella näistä menetelmistä on sisar, joka ottaa a Nimi
esine a. sijasta Merkkijono
esine. A Nimi
object edustaa yleistä nimeä. Nimi
luokka sallii ohjelman manipuloida nimiä tarvitsematta tietää niin paljon käytössä olevasta nimenomaisesta palvelusta.
Esimerkki
Alla oleva esimerkki kuvaa yhteyden muodostamista nimipalveluun, kaikkien sidosten luetteloa tai tietyn sidoksen luetteloa. Se käyttää tiedostojärjestelmän palveluntarjoajaa, joka on yksi Sunin toimittamista JNDI-palveluntarjoajien viitetoteutuksista. Tiedostojärjestelmän palveluntarjoaja tekee tiedostojärjestelmästä näyttävän nimipalvelulta (joka se on monin tavoin - tiedostonimet kuten / foo / bar / baz
ovat nimiä ja sidottu esineisiin, kuten tiedostoihin ja hakemistoihin). Valitsin sen, koska kaikilla on pääsy tiedostojärjestelmään (toisin kuin esimerkiksi LDAP-palvelin).
tuo javax.naming.Context; tuo javax.naming.InitialContext; tuo javax.naming.Binding; tuo javax.naming.NamingEnumeration; tuo javax.naming.NamingException; tuo java.util.Hashtable; public class Main {public static void main (String [] rgstring) {yritä {// Luo alkuperäinen konteksti. Ympäristö // tiedot määrittelee käytettävän JNDI-palveluntarjoajan ja käytetyn alkuperäisen URL-osoitteen (tapauksessamme // hakemisto URL-muodossa - tiedosto: /// ...). Hashtable hashtableEnvironment = uusi Hashtable (); hashtableEnvironment.put (Konteksti.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); hashtableEnvironment.put (konteksti.PROVIDER_URL, rgstring [0]); Kontekstikonteksti = new InitialContext (hashtableEnvironment); // Jos et anna muita komentoriviargumentteja, // listaa kaikki nimet määritetyssä kontekstissa ja // objektit, joihin ne on sidottu. if (rgstring.length == 1) {NamingEnumeration namingenumeration = context.listBindings (""); while (namingenumeration.hasMore ()) {Binding binding = (Sitova) namingenumeration.next (); System.out.println (bind.getName () + "" + binding.getObject ()); }} // Muussa tapauksessa luetellaan // määritettyjen argumenttien nimet ja sidokset. else {for (int i = 1; i <rgstring.length; i ++) {Object object = context.lookup (rgstring [i]); System.out.println (rgstring [i] + "" + objekti); }} context.close (); } catch (NamingException namingexception) {namingexception.printStackTrace (); }}}
Yllä olevassa luettelossa oleva ohjelma luo ensin alkuperäisen kontekstin määritetyltä JNDI-palveluntarjoajalta (tässä tapauksessa Sunin tiedostojärjestelmän tarjoajalta) ja URL-osoitteen, joka määrittää paikallisen hakemiston. Jos ylimääräisiä komentoriviargumentteja ei määritetä, ohjelma luetteloi kaikkien määritetyn hakemiston entiteettien objektit ja nimet. Muussa tapauksessa siinä luetellaan vain komentorivillä määritetyt kohteet ja nimet.
Johtopäätös
Sinulla pitäisi nyt olla sekä ymmärrys että arvostus palveluiden nimeämisestä yleensä ja erityisesti JNDI: n nimeämisestä. Hajautetuissa ympäristöissä ne ovat arvokkaita työkaluja tietojen ja resurssien paikantamiseen. JNDI antaa mahdollisuuden työskennellä erilaisten nimeämispalvelujen kanssa ilman, että tarvitsee hallita useita sovellusliittymiä. Ensi kuussa tarkastelemme JNDI: n toista puolta - sen hakemistotoimintoja.
Todd Sundsted on kirjoittanut ohjelmia siitä lähtien, kun tietokoneita tuli saataville sopivissa työpöytämalleissa. Vaikka Todd oli alun perin kiinnostunut hajautettujen sovellusten rakentamisesta C ++ -sovelluksessa, Todd siirtyi Java-ohjelmointikielelle, kun siitä tuli ilmeinen valinta sellaiselle. Kirjoittamisen lisäksi Todd toimii myös Java-arkkitehtina ComFrame-ohjelmiston kanssa.Lisätietoja tästä aiheesta
- Lataa tämän artikkelin täydellinen lähdekoodi zip-muodossa
//images.techhive.com/downloads/idge/imported/article/jvw/2000/01/jw-01-howto.zip
- Kaikki asiat JNDI
//java.sun.com/products/jndi/
- JNDI-dokumentaatio
//java.sun.com/products/jndi/docs.html
- Palveluntarjoajat ovat tällä hetkellä käytettävissä
//java.sun.com/products/jndi/serviceproviders.html
- Täydellinen luettelo edellisistä How-To Java sarakkeita
//www.javaworld.com/javaworld/topicalindex/jw-ti-howto.html
Tämän tarinan "JNDI-yleiskatsaus, osa 1: Johdanto nimipalveluihin" julkaisi alun perin JavaWorld.