JNDI pregled, 1. dio: Uvod u usluge imenovanja

Oni koji su bili u knjižnici i još se mogu sjetiti iskustva, mogu se prisjetiti postupka lociranja knjižnične knjige. Ako niste u kontaktu sa svojom antikvarnom stranom, ova će vam se situacija činiti nepoznatom; ali svako malo odem do lokalne knjižnice potražiti originalnu, offline knjigu. Knjižnice su ispunjene tisućama stvari - prašnjave su i izrađene od drvene mase i kravlje kože, ali na svoj način fascinantne. U svakom slučaju, kad naiđe prisila da se pronađe neki, izbjegavam naivan hod šetajući i prolazeći knjižnim prolazima tražeći ga i umjesto toga se okrećem katalogu karata.

TEXTBOX: TEXTBOX_HEAD: JNDI pregled: Pročitajte cijelu seriju!

  • Dio 1. Uvod u usluge imenovanja
  • Dio 2. Koristite JNDI usluge direktorija za bolje upravljanje distribuiranim aplikacijama

  • Dio 3. Koristite JNDI za spremanje objekata vaše distribuirane aplikacije

  • Dio 4. Prikupite ono što ste naučili s aplikacijom s omogućenom JNDI: END_TEXTBOX

Katalog kartica, za neupućene, mapira imena knjiga na njihovo mjesto u knjižnici. Prvo odlaskom do kataloga kartica i traženjem mjesta knjige, uštedim si značajnu količinu hodanja. (Inače, čuo sam da neke knjižnice zapravo dopuštaju zaštitnicima upotrebu računala umjesto kataloga kartica. Polako su to shvatili - sad ako će samo staviti informacije iz knjiga u računalo tamo gdje im je mjesto). ..)

Koliko god iznenađujuće izgledalo, pojam kataloga kartica prilično je koristan i u svijetu računarstva. U računanju ga nazivamo uslugom imenovanja koja imena povezuje s mjestima usluga i informacijama. Omogućuje računalne programe na jednom mjestu gdje mogu pronaći resurse koji su im potrebni. Na taj način, programi ne troše vrijeme izvodeći elektronički ekvivalent hodanja gore-dolje po prolazima, a ne zahtijevaju ni da se lokacije čvrsto kodiraju u njihovu logiku.

Pronalaženje resursa je od posebne važnosti u velikim poslovnim okruženjima, gdje programi koje gradite mogu ovisiti o uslugama koje pružaju aplikacije koje su napisale druge grupe u drugim odjelima. Dobro dizajnirana infrastruktura za imenovanje omogućuje takve projekte - a nedostatak ih onemogućava. U stvari, mnogi napori za reinženjering poslovnih procesa započinju s dizajnom i implementacijom robusne infrastrukture za imenovanje i imenike na razini cijelog poduzeća.

Ovog mjeseca uvodim Java Naming and Directory Interface (JNDI). JNDI pruža sučelje zajedničkog nazivnika za mnoge postojeće usluge imenovanja. Kao takav, JNDI nije dizajniran da zamijeni postojeću tehnologiju; umjesto toga, pruža zajedničko sučelje za postojeće usluge imenovanja. Započnimo s razgledanjem nekih od ovih usluga.

Uvod u usluge imenovanja

Donja slika prikazuje organizaciju usluge generičkog imenovanja.

Usluga imenovanja održava skup veza. Vezovi odnose imena na objekte. Svi se objekti u sustavu imenovanja imenuju na isti način (to jest, pretplaćuju se na istu konvenciju imenovanja ). Klijenti koriste uslugu imenovanja za lociranje objekata po imenu.

Postoji niz postojećih usluga imenovanja, od kojih ću neke opisati u nastavku. Svaki od njih slijedi gornji obrazac, ali se razlikuje u pojedinostima.

  • COS (Common Object Services) imenovanje: Usluga imenovanja za CORBA aplikacije; omogućuje aplikacijama pohranu i pristup referencama na CORBA objekte.

  • DNS (Domain Name System): Internet usluga imenovanja; mapira imena koja su prikladna za ljude (poput www.etcee.com) u IP adrese (Internet protokol) prilagođene računalu u točkasta četverokutna oznaka (207.69.175.36). Zanimljivo je da je DNS distribuirana usluga imenovanja, što znači da su usluga i temeljna baza podataka raspoređeni na mnogim hostovima na Internetu.

  • LDAP (lagani protokol za pristup direktoriju): razvilo Sveučilište Michigan; kako mu samo ime govori, lagana je verzija DAP-a (Protocol Access Protocol), koji je pak dio X.500, standarda za mrežne usluge direktorija. Trenutno više od 40 tvrtki podržava LDAP.

  • NIS (mrežni informacijski sustav) i NIS +: usluge imenovanja mreža koje je razvio Sun Microsystems. Oboje omogućavaju korisnicima pristup datotekama i aplikacijama na bilo kojem hostu s jednim ID-om i lozinkom.

Zajedničke značajke

Kao što sam već spomenuo, primarna funkcija sustava imenovanja je vezivanje imena za objekte (ili, u nekim slučajevima, za reference na objekte - više o tome u trenutku). Da bi bila usluga imenovanja, usluga mora u najmanju ruku pružiti mogućnost vezanja imena na objekte i traženja objekata po imenu.

Mnogi sustavi imenovanja ne pohranjuju izravno objekte. Umjesto toga, pohranjuju reference na objekte. Kao ilustraciju uzmimo DNS. Adresa 207.69.175.36 referenca je na mjesto računala na Internetu, a ne na samo računalo.

JNDI pruža sučelje koje podržava svu ovu uobičajenu funkcionalnost. Ovo sučelje predstavit ću kasnije u ovom članku.

Njihove razlike

Također je važno razumjeti kako se razlikuju postojeće usluge imenovanja, jer JNDI mora pružiti izvedivu apstrakciju koja zaobilazi te razlike.

Osim funkcionalnih razlika, najuočljivija je razlika u načinu na koji svaka usluga imenovanja zahtijeva navođenje imena - njihova konvencija imenovanja. Nekoliko primjera trebalo bi ilustrirati problem.

U DNS-u imena se grade od komponenata koje su odvojene točkama ("."). Čitali su zdesna nalijevo. Naziv "www.etcee.com" imenuje stroj pod nazivom "www" u domeni "etcee.com". Isto tako, naziv "etcee.com" imenuje domenu "etcee" u domeni najviše razine "com".

U LDAP-u je situacija malo složenija. Imena se grade od komponenata koje su odvojene zarezima (","). Kao i DNS imena, čitaju zdesna nalijevo. Međutim, komponente u LDAP imenu moraju biti navedene kao parovi ime / vrijednost. Ime "cn = Todd Sundsted, o = ComFrame, c = US" imenuje osobu "cn = Todd Sundsted" u organizaciji "o = ComFrame, c = US". Isto tako, naziv "o = ComFrame, c = US" naziva organizaciju "o = ComFrame" u državi "c = US".

Kao što ilustriraju gornji primjeri, samo sporazum o imenovanju usluge imenovanja može potencijalno unijeti značajnu količinu okusa osnovne usluge imenovanja u JNDI. Ovo nije značajka koju bi sučelje neovisno o implementaciji trebalo imati.

JNDI ovaj problem rješava s Nameklasom i njezinim podrazredima i pomoćnim klasama. NameKlasa predstavlja ime sastoji od naručenih sekvence subnames i pruža metode za rad s imenima neovisno o podlozi imenovanja usluge.

Pogled na imenovanje JNDI

Kao što sam gore spomenuo, važno je zapamtiti da je JNDI sučelje, a ne implementacija. Ova činjenica ima nekoliko nedostataka - potreban vam je pristup postojećoj usluzi imenovanja (kao što je LDAP usluga) i morate razumjeti nešto o tome kako to radi da biste se igrali s JNDI. S druge strane, omogućuje JNDI-ju da se neprimjetno integrira u postojeće računarsko okruženje u kojem uspostavljena usluga imenovanja ima snagu.

JNDI imenovanje vrti se oko malog skupa klasa i pregršt operacija. Pogledajmo ih.

Kontekst i početni kontekst

ContextSučelje igra središnju ulogu u JNDI. Kontekst predstavlja skup veza u usluzi imenovanja koje sve dijele istu konvenciju imenovanja. ContextObjekt pruža metode za vezivanje imena objekata i neobvezujuće imena iz predmeta, za preimenovanje objekata, te za navođenje obveze.

Neke usluge imenovanja također pružaju funkcionalnost podkonteksta. Slično kao direktorij u datotečnom sustavu, podkontekst je kontekst unutar konteksta. Ova hijerarhijska struktura omogućuje bolju organizaciju informacija. Za usluge imenovanja koje podržavaju podkontekste, Contextklasa također nudi metode za stvaranje i uništavanje potkonteksta.

JNDI izvodi sve operacije imenovanja u odnosu na kontekst. Kako bi se pomoglo u pronalaženju mjesta za početak, JNDI specifikacija definira InitialContextklasu. Ova je klasa instancirana sa svojstvima koja definiraju vrstu usluge imenovanja koja se koristi i, za usluge imenovanja koje pružaju sigurnost, ID i lozinku za upotrebu prilikom povezivanja.

Za one koji su vam poznati RMI Namingklasu, mnoge metode koje pruža Contextsučelje opisano u nastavku izgledat će poznato. Pogledajmo Contextmetode 's:

  • void bind(String stringName, Object object): Veže ime na objekt. Ime ne smije biti vezano za drugi objekt. Svi posredni konteksti već moraju postojati.

  • void rebind(String stringName, Object object): Veže ime na objekt. Svi posredni konteksti već moraju postojati.

  • Object lookup(String stringName): Vraća navedeni objekt.

  • void unbind(String stringName): Povezuje navedeni objekt.

ContextSučelje također pruža metode za preimenovanje i popis obveze.

  • void rename(String stringOldName, String stringNewName): Mijenja ime na koje je objekt vezan.
  • NamingEnumeration listBindings(String stringName): Vraća nabrajanje koje sadrži imena vezana na navedeni kontekst, zajedno s objektima i imenima klasa objekata koji su za njih vezani.

  • NamingEnumeration list(String stringName): Vraća nabrajanje koje sadrži imena vezana na navedeni kontekst, zajedno s imenima klasa objekata koji su na njih vezani.

Svaka od ovih metoda ima brata i sestru koji Nameumjesto objekta uzima Stringobjekt. NamePredmet predstavlja generički naziv. NameKlasa dopušta da program manipulirati imena bez da znaju što više o specifičnim imenovanja službe u uporabi.

Primjer

The example below illustrates how to connect to a naming service, list all of the bindings, or list a specific binding. It uses the filesystem service provider, which is one of the reference JNDI service-provider implementations provided by Sun. The filesystem service provider makes the filesystem look like a naming service (which it is, in many ways -- filenames like /foo/bar/baz are names and are bound to objects like files and directories). I selected it because everyone has access to a filesystem (as opposed to, say, an LDAP server).

import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Binding; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import java.util.Hashtable; public class Main { public static void main(String [] rgstring) { try { // Create the initial context. The environment // information specifies the JNDI provider to use // and the initial URL to use (in our case, a // directory in URL form -- file:///...). Hashtable hashtableEnvironment = new Hashtable(); hashtableEnvironment.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory" ); hashtableEnvironment.put( Context.PROVIDER_URL, rgstring[0] ); Context context = new InitialContext(hashtableEnvironment); // If you provide no other command line arguments, // list all of the names in the specified context and // the objects they are bound to. if (rgstring.length == 1) { NamingEnumeration namingenumeration = context.listBindings(""); while (namingenumeration.hasMore()) { Binding binding = (Binding)namingenumeration.next(); System.out.println( binding.getName() + " " + binding.getObject() ); } } // Otherwise, list the names and bindings for the // specified arguments. else { for (int i = 1; i < rgstring.length; i++) { Object object = context.lookup(rgstring[i]); System.out.println( rgstring[i] + " " + object ); } } context.close(); } catch (NamingException namingexception) { namingexception.printStackTrace(); } } } 

The program in the listing above first creates an initial context from the specified JNDI provider (in this case, Sun's filesystem provider) and a URL specifying a local directory. If no additional command-line arguments are specified, the program lists the objects and names of every entity in the specified directory. Otherwise, it lists the objects and names of only those items specified on the command line.

Conclusion

You should now have both an understanding of and an appreciation for naming services in general and JNDI in particular. In distributed environments, they are valuable tools for locating information and resources. JNDI makes it possible to work with a variety of naming services without having to master a multitude of APIs. Next month, we'll take a look at the other half of JNDI -- its directory functions.

Todd Sundsted piše programe otkad su računala postala dostupna u prikladnim modelima stolnih računala. Iako je izvorno bio zainteresiran za izgradnju distribuiranih aplikacija na C ++-u, Todd je prešao na programski jezik Java kada je to postao očiti izbor za takve stvari. Pored pisanja, Todd također radi kao Java arhitekt s softverom ComFrame.

Saznajte više o ovoj temi

  • Preuzmite cjeloviti izvorni kod za ovaj članak, u zip formatu

    //images.techhive.com/downloads/idge/imported/article/jvw/2000/01/jw-01-howto.zip

  • Sve stvari JNDI

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

  • JNDI dokumentacija

    //java.sun.com/products/jndi/docs.html

  • Trenutno dostupni davatelji usluga

    //java.sun.com/products/jndi/serviceproviders.html

  • Cjelovit popis prethodnih Java stupaca How-To

    //www.javaworld.com/javaworld/topicalindex/jw-ti-howto.html

Ovu je priču, "JNDI pregled, 1. dio: Uvod u usluge imenovanja" izvorno objavio JavaWorld.