Programmering

JNDI-oversigt, del 1: En introduktion til navngivningstjenester

De af jer, der har været på et bibliotek og stadig kan huske oplevelsen, husker muligvis processen med at finde en biblioteksbog. Hvis du ikke er i kontakt med din antikvariske side, vil denne situation virke ukendt; men en gang imellem vandrer jeg ud til et lokalt bibliotek for at lede efter en ægte offline-bog. Bibliotekerne er fyldt med tusindvis af ting - de er støvede og lavet af træmasse og kohud, men de er fascinerende på deres egen måde. Under alle omstændigheder, når tvangen til at finde en bestemt rammer, undgår jeg det naive forløb at gå op og ned ad biblioteksgange og søge efter det og vender mig i stedet til kortkataloget.

TEXTBOX: TEXTBOX_HEAD: JNDI oversigt: Læs hele serien!

  • Del 1. En introduktion til navngivningstjenester
  • Del 2. Brug JNDI-katalogtjenester til bedre at administrere dine distribuerede applikationer

  • Del 3. Brug JNDI til at gemme dine distribuerede applikations objekter

  • Del 4. Træk sammen, hvad du har lært med en JNDI-aktiveret applikation: END_TEXTBOX

Et kortkatalog til uindviede kortlægger bøgernes navne til deres placering i biblioteket. Ved at gå til kortkataloget først og slå op i bogens placering sparer jeg mig en betydelig mængde at gå. (I øvrigt har jeg hørt, at nogle biblioteker faktisk tillader lånere at bruge computere i stedet for kortkataloget. De har det halvt rigtigt - nu hvis de bare lægger oplysningerne i bøgerne ind i computeren, hvor de hører hjemme. ..)

Så overraskende som det kan virke, er forestillingen om et kortkatalog også ganske praktisk i computeren. I computing kalder vi det en navngivningstjeneste, som forbinder navne med placeringen af ​​tjenester og med information. Det giver computerprogrammer et sted, hvor de kan finde de ressourcer, de har brug for. På den måde spilder programmer ikke tid ved at udføre den elektroniske ækvivalent med at gå op og ned ad gangene, og det kræver heller ikke, at placeringen skal være hardkodet i deres logik.

At finde ressourcer er særlig vigtig i store virksomhedsmiljøer, hvor de applikationer, du bygger, kan afhænge af tjenester, der leveres af applikationer skrevet af andre grupper i andre afdelinger. En veldesignet navneinfrastruktur muliggør sådanne projekter - og manglen på en gør dem umulige. Faktisk begynder mange omstruktureringsprocesser i forretningsprocesser med design og implementering af en robust, virksomhedsomfattende navne- og biblioteksinfrastruktur.

Denne måned introducerer jeg Java Naming and Directory Interface (JNDI). JNDI giver en fællesnævnergrænseflade til mange eksisterende navngivningstjenester. Som sådan var JNDI ikke designet til at erstatte eksisterende teknologi; i stedet giver det en fælles grænseflade til eksisterende navngivningstjenester. Lad os begynde med at se på nogle af disse tjenester.

En introduktion til navngivningstjenester

Figuren nedenfor viser tilrettelæggelsen af ​​en generisk navngivningstjeneste.

En navngivningstjeneste opretholder et sæt af bindinger. Bindinger relaterer navne til objekter. Alle objekter i et navngivningssystem er navngivet på samme måde (dvs. de abonnerer på det samme navngivningskonvention). Klienter bruger navngivningstjenesten til at finde objekter efter navn.

Der er et antal eksisterende navngivningstjenester, hvoraf nogle vil jeg beskrive nedenfor. De følger hver mønsteret ovenfor, men adskiller sig i detaljerne.

  • COS (Common Object Services) Navngivning: Navnetjenesten til CORBA-applikationer; giver applikationer mulighed for at gemme og få adgang til referencer til CORBA-objekter.

  • DNS (Domain Name System): Internets navngivningstjeneste; kortlægger brugervenlige navne (såsom www.etcee.com) til computervenlige IP-adresser (Internetprotokol) i stiplet kvadratnotation (207.69.175.36). Interessant nok er DNS en distribueret navngivningstjeneste, hvilket betyder, at tjenesten og dens underliggende database er spredt over mange værter på Internettet.

  • LDAP (Lightweight Directory Access Protocol): Udviklet af University of Michigan; som navnet antyder, er det en let version af DAP (Directory Access Protocol), som igen er en del af X.500, en standard for netværksmappetjenester. I øjeblikket støtter over 40 virksomheder LDAP.

  • NIS (Network Information System) og NIS +: Netværksnavngivelsestjenester udviklet af Sun Microsystems. Begge giver brugerne adgang til filer og applikationer på enhver vært med et enkelt ID og en adgangskode.

Fælles træk

Som jeg nævnte tidligere, er et navngivningssystems primære funktion at binde navne til objekter (eller i nogle tilfælde til referencer til objekter - mere om det i et øjeblik). For at være en navngivningstjeneste skal en tjeneste i det mindste give mulighed for at binde navne til objekter og til at slå objekter op ved navn.

Mange navngivningssystemer gemmer ikke objekter direkte. I stedet gemmer de referencer til objekter. Overvej DNS som en illustration. Adressen 207.69.175.36 er en henvisning til en computers placering på Internettet, ikke selve computeren.

JNDI giver en grænseflade, der understøtter al denne fælles funktionalitet. Jeg vil præsentere denne grænseflade senere i denne artikel.

Deres forskelle

Det er også vigtigt at forstå, hvordan eksisterende navngivningstjenester adskiller sig, da JNDI skal levere en brugbar abstraktion, der kommer omkring disse forskelle.

Bortset fra funktionelle forskelle er den mest mærkbare forskel den måde, hvorpå hver navngivningstjeneste kræver, at navne specificeres - dens navngivningskonvention. Et par eksempler skal illustrere problemet.

I DNS bygges navne fra komponenter, der er adskilt af prikker ("."). De læser fra højre til venstre. Navnet "www.etcee.com" navngiver en maskine kaldet "www" i "etcee.com" -domænet. Ligeledes navngiver navnet "etcee.com" domænet "etcee" i topdomænet "com".

I LDAP er situationen lidt mere kompliceret. Navne er bygget fra komponenter, der er adskilt med kommaer (","). Ligesom DNS-navne læser de fra højre til venstre. Komponenter i et LDAP-navn skal dog specificeres som navn / værdipar. Navnet "cn = Todd Sundsted, o = ComFrame, c = US" navngiver personen "cn = Todd Sundsted" i organisationen "o = ComFrame, c = US." På samme måde navngiver navnet "o = ComFrame, c = US" organisationen "o = ComFrame" i landet "c = US."

Som eksemplerne ovenfor illustrerer, har en navngivningstjenestes navngivningskonvention alene potentialet til at indføre en betydelig mængde af smagen af ​​den underliggende navngivningstjeneste i JNDI. Dette er ikke en funktion, som en implementeringsuafhængig grænseflade skal have.

JNDI løser dette problem med Navn klasse og dens underklasser og hjælperklasser. Det Navn klasse repræsenterer et navn sammensat af en ordnet sekvens af undernavne og giver metoder til at arbejde med navne, der er uafhængige af den underliggende navngivningstjeneste.

Et kig på JNDI-navngivning

Som jeg nævnte ovenfor, er det vigtigt at huske, at JNDI er et interface snarere end en implementering. Denne kendsgerning har nogle ulemper - du har brug for adgang til en eksisterende navngivningstjeneste (såsom en LDAP-tjeneste), og du skal forstå noget om, hvordan det fungerer for at lege med JNDI. På den anden side tillader det JNDI at integrere problemfrit i et eksisterende computermiljø, hvor en etableret navngivningstjeneste holder fast.

JNDI-navngivning drejer sig om et lille sæt klasser og en håndfuld operationer. Lad os se på dem.

Context og InitialContext

Det Sammenhæng interface spiller en central rolle i JNDI. En kontekst repræsenterer et sæt bindinger inden for en navngivningstjeneste, der alle deler den samme navngivningskonvention. EN Sammenhæng objekt tilvejebringer metoderne til at binde navne til objekter og afbinde navne fra objekter, til at omdøbe objekter og til at liste bindingerne.

Nogle navngivningstjenester leverer også underkontekstfunktionalitet. Ligesom et bibliotek i et filsystem er en underkontekst en kontekst inden for en kontekst. Denne hierarkiske struktur tillader bedre organisering af information. For navngivning af tjenester, der understøtter underkontekster, Sammenhæng klasse giver også metoder til oprettelse og destruktion af underkontekster.

JNDI udfører alle navngivningsoperationer i forhold til en kontekst. For at hjælpe med at finde et sted at starte definerer JNDI-specifikationen en InitialContext klasse. Denne klasse er instanseret med egenskaber, der definerer typen af ​​navngivningstjeneste, der er i brug, og til navngivning af tjenester, der giver sikkerhed, id og adgangskode, der skal bruges, når der oprettes forbindelse.

For de af jer, der kender RMI Navngivning klasse, mange af metoderne leveret af Sammenhæng interface, der er skitseret nedenfor, vil se bekendt ud. Lad os se på Sammenhæng's metoder:

  • void bind (String stringName, Object object): Binder et navn til et objekt. Navnet må ikke være bundet til et andet objekt. Alle mellemliggende sammenhænge skal allerede eksistere.

  • ugyldig genindspilning (String stringName, Object object): Binder et navn til et objekt. Alle mellemliggende sammenhænge skal allerede eksistere.

  • Objektopslag (String stringName): Returnerer det angivne objekt.

  • ugyldig udbinding (String stringName): Afbinder det angivne objekt.

Det Sammenhæng interface giver også metoder til omdøbning og notering af bindinger.

  • ugyldigt omdøb (String stringOldName, String stringNewName): Ændrer det navn, som et objekt er bundet til.
  • NamingEnumeration listBindings (String stringName): Returnerer en optælling, der indeholder de navne, der er bundet til den angivne kontekst sammen med objekterne og klassenavne på de objekter, der er bundet til dem.

  • Navngivningsliste (String stringName): Returnerer en optælling, der indeholder de navne, der er bundet til den angivne kontekst sammen med klassenavne på de objekter, der er bundet til dem.

Hver af disse metoder har et søskende, der tager en Navn objekt i stedet for en Snor objekt. EN Navn objekt repræsenterer et generisk navn. Det Navn klasse tillader et program at manipulere navne uden at skulle vide så meget om den specifikke navngivningstjeneste, der er i brug.

Eksemplet

Eksemplet nedenfor illustrerer, hvordan du opretter forbindelse til en navngivningstjeneste, viser en liste over alle bindinger eller opregner en bestemt binding. Det bruger filsystemtjenesteudbyderen, som er en af ​​JNDI-referenceudbyderimplementeringerne leveret af Sun. Filsystemtjenesteudbyderen får filsystemet til at ligne en navngivningstjeneste (som det på mange måder er - filnavne som / foo / bar / baz er navne og er bundet til objekter som filer og mapper). Jeg valgte det, fordi alle har adgang til et filsystem (i modsætning til f.eks. En LDAP-server).

import javax.naming.Context; importere 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 {// Opret den oprindelige kontekst. Miljøet // information angiver, at JNDI-udbyderen skal bruge // og den oprindelige URL, der skal bruges (i vores tilfælde en // mappe i URL-form - fil: /// ...). Hashtable hashtableEnvironment = ny Hashtable (); hashtableEnvironment.put (Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); hashtableEnvironment.put (Context.PROVIDER_URL, rgstring [0]); Kontekstkontekst = ny InitialContext (hashtableEnvironment); // Hvis du ikke angiver andre kommandolinjeargumenter, // lister alle navnene i den angivne kontekst og // de objekter, de er bundet til. hvis (rgstring.length == 1) {NamingEnumeration namingenumeration = context.listBindings (""); while (namingenumeration.hasMore ()) {Binding binding = (Binding) namingenumeration.next (); System.out.println (binding.getName () + "" + binding.getObject ()); }} // Ellers skal du liste navnene og bindingerne for de // angivne argumenter. ellers {for (int i = 1; i <rgstring.length; i ++) {Objektobjekt = context.lookup (rgstring [i]); System.out.println (rgstring [i] + "" + objekt); }} context.close (); } fange (NamingException namingexception) {namingexception.printStackTrace (); }}} 

Programmet i ovenstående liste opretter først en indledende kontekst fra den angivne JNDI-udbyder (i dette tilfælde Suns filsystemudbyder) og en URL, der angiver en lokal mappe. Hvis der ikke er angivet yderligere kommandolinjeargumenter, viser programmet objekter og navne på hver enhed i det angivne bibliotek. Ellers viser den kun objekter og navne på de emner, der er angivet på kommandolinjen.

Konklusion

Du skal nu have både forståelse for og forståelse for navngivningstjenester generelt og JNDI i særdeleshed. I distribuerede miljøer er de værdifulde værktøjer til at finde information og ressourcer. JNDI gør det muligt at arbejde med en række navngivningstjenester uden at beherske en lang række API'er. Næste måned ser vi på den anden halvdel af JNDI - dets biblioteksfunktioner.

Todd Sundsted har skrevet programmer, siden computere blev tilgængelige i praktisk desktop-modeller. Selvom det oprindeligt var interesseret i at oprette distribuerede applikationer i C ++, gik Todd videre til Java-programmeringssproget, da det blev det oplagte valg for den slags ting. Udover at skrive arbejder Todd også som Java-arkitekt med ComFrame Software.

Lær mere om dette emne

  • Download den komplette kildekode til denne artikel i zip-format

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

  • Alle ting JNDI

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

  • JNDI-dokumentation

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

  • Tjenesteudbydere i øjeblikket tilgængelige

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

  • Fuld liste over tidligere Sådan gør du Java kolonner

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

Denne historie, "JNDI-oversigt, del 1: En introduktion til navngivningstjenester" blev oprindeligt udgivet af JavaWorld.