Pregled Java imenovanja i sučelja direktorija

1. Uvod

Sučelje za imenovanje i imenik Java (JNDI) pruža dosljednu upotrebu imenovanja i / ili usluga direktorija kao Java API. Ovo sučelje može se koristiti za vezivanje objekata, traženje ili ispitivanje objekata, kao i za otkrivanje promjena na istim objektima.

Iako upotreba JNDI uključuje raznolik popis podržanih usluga imenovanja i direktorija, u ovom uputstvu usredotočit ćemo se na JDBC tijekom istraživanja JNDI-jevog API-ja.

2. Opis JNDI

Svaki rad s JNDI zahtijeva razumijevanje osnovne usluge kao i pristupačna provedba. Na primjer, usluga veze baze podataka poziva za određena svojstva i rukovanje iznimkama.

Međutim, JNDI-jeva apstrakcija razdvaja konfiguraciju veze od aplikacije.

Istražimo Ime i Kontekst, koji sadrže osnovnu funkcionalnost JNDI.

2.1. Ime Sučelje

Naziv objectName = novo CompositeName ("java: comp / env / jdbc");

The Ime sučelje pruža mogućnost upravljanja imenima komponenata i sintaksom za JNDI imena. Prvi token niza predstavlja globalni kontekst, nakon toga svaki dodani niz predstavlja sljedeći podkontekst:

Elementi nabrajanja = objectName.getAll (); while (elements.hasMoreElements ()) {System.out.println (elements.nextElement ()); }

Naš izlaz izgleda:

java: comp env jdbc

Kao što vidimo, / je graničnik za Ime podkonteksti. Sad, dodajmo podkontekst:

objectName.add ("primjer");

Zatim testiramo naš dodatak:

assertEquals ("primjer", objectName.get (objectName.size () - 1));

2.2. Kontekst Sučelje

Kontekst sadrži svojstva usluge imenovanja i direktorija. Evo, iskoristimo neki pomoćni kôd iz Springa radi praktičnosti za izgradnju a Kontekst:

Graditelj SimpleNamingContextBuilder = novi SimpleNamingContextBuilder (); builder.activate ();

Proljetni SimpleNamingContextBuilder kreira JNDI davatelja usluga, a zatim aktivira graditelj pomoću NamingManager:

JndiTemplate jndiTemplate = novi JndiTemplate (); ctx = (InitialContext) jndiTemplate.getContext ();

Konačno, JndiTemplate pomaže nam pristupiti InitialContext.

3. Povezivanje i pretraživanje JNDI objekata

Sad kad smo vidjeli kako se koristi Ime i Kontekst, koristimo JNDI za pohranu JDBC-a Izvor podataka:

ds = novi DriverManagerDataSource ("jdbc: h2: mem: mydb");

3.1. Povezivanje JNDI objekata

Kako imamo kontekst, povežimo objekt s njim:

ctx.bind ("java: comp / env / jdbc / datasource", ds);

Općenito, usluge bi trebale pohraniti referencu na objekt, serializirane podatke ili atribute u kontekstu direktorija. Sve ovisi o potrebama aplikacije.

Imajte na umu da je uporaba JNDI na ovaj način rjeđa. Tipično je JNDI sučelje s podacima kojima se upravlja izvan vremena izvršavanja aplikacije.

Međutim, ako aplikacija već može stvoriti ili pronaći svoj Izvor podataka, možda bi bilo lakše to povezati pomoću Springa. Suprotno tome, ako je nešto izvan naše aplikacije vezivalo objekte u JNDI, tada bi ih aplikacija mogla trošiti.

3.2. Traženje JNDI objekata

Potražimo naše Izvor podataka:

DataSource ds = (DataSource) ctx.lookup ("java: comp / env / jdbc / datasource");

A onda testirajmo da to osiguramo Izvor podataka je kako se očekivalo:

assertNotNull (ds.getConnection ());

4. Uobičajene JNDI iznimke

Suradnja s JNDI-jem može ponekad rezultirati izuzecima tijekom izvođenja. Evo nekoliko uobičajenih.

4.1. NameNotFoundException

ctx.lookup ("badJndiName");

Budući da ovo ime nije vezano u ovom kontekstu, vidimo ovaj trag steka:

javax.naming.NameNotFoundException: Ime [badJndiName] nije vezano; 0 veza: [] na org.springframework.mock.jndi.SimpleNamingContext.lookup (SimpleNamingContext.java:140) na java.naming / javax.naming.InitialContext.lookup (InitialContext.java:409)

Trebali bismo imati na umu da trag steka sadrži sve povezane objekte, što je korisno za praćenje razloga zašto je došlo do iznimke.

4.2. NoInitialContextException

Svaka interakcija s InitialContext može baciti NoInitialContextException:

assertThrows (NoInitialContextException.class, () -> {JndiTemplate jndiTemplate = new JndiTemplate (); InitialContext ctx = (InitialContext) jndiTemplate.getContext (); ctx.lookup ("java: comp / env / enc / env / enc / env / jc / enc / enc / env / jc / enc / env / jc / enc / enc / env / jvc / jvc / data / jvc / jvc / data / jvc / jvc / data / jvc / data / jc / data / jc / data / jc; .printStackTrace ();

Trebali bismo napomenuti da je ova upotreba JNDI valjana, kao što smo je koristili i ranije. Međutim, ovaj put ne postoji pružatelj JNDI konteksta i bit će izbačena iznimka:

javax. 685)

5. Uloga JNDI-a u modernoj arhitekturi aplikacija

Dok JNDI igra manju ulogu u laganim Java spremljenim spremnicima kao što je Spring Boot, postoje i druge namjene. Tri Java tehnologije koje još uvijek koriste JNDI su JDBC, EJB i JMS. Svi imaju širok spektar primjena u Java poduzećima.

Na primjer, zasebni tim DevOps može upravljati varijablama okruženja kao što su korisničko ime i lozinka za osjetljivu vezu baze podataka u svim okruženjima. JNDI resurs može se stvoriti u spremniku web aplikacije, s JNDI koji se koristi kao sloj dosljedne apstrakcije koji radi u svim okruženjima.

Ova postavka omogućava programerima da kreiraju i kontroliraju lokalnu definiciju u razvojne svrhe, a istovremeno se povezuju s osjetljivim resursima u proizvodnom okruženju putem istog naziva JNDI.

6. Zaključak

U ovom uputstvu vidjeli smo povezivanje, povezivanje i traženje objekta pomoću sučelja Java Naming and Directory Interface. Također smo pogledali uobičajene iznimke koje je izbacio JNDI.

Na kraju smo pogledali kako se JNDI uklapa u modernu arhitekturu aplikacija.

Kao i uvijek, kôd je dostupan na GitHub-u.