Java elnevezés és címtárfelület áttekintése

1. Bemutatkozás

A Java elnevezési és könyvtárfelület (JNDI) biztosítja a név- és / vagy címtárszolgáltatások következetes használatát Java API-ként. Ez a felület használható objektumok megkötésére, objektumok felkutatására vagy lekérdezésére, valamint ugyanazon objektumok változásainak észlelésére.

Míg a JNDI használata a támogatott elnevezési és címtárszolgáltatások sokféle listáját tartalmazza, ebben az oktatóanyagban a JDBC-re koncentrálunk, miközben a JNDI API-ját fedezzük fel.

2. JNDI Leírás

A JNDI-vel végzett bármilyen munka megköveteli az alapul szolgáló szolgáltatás megértése továbbá hozzáférhető megvalósítás. Például egy adatbázis-csatlakozási szolgáltatás megköveteli az adott tulajdonságokat és a kivételkezelést.

A JNDI absztrakciója azonban leválasztja a kapcsolat konfigurációját az alkalmazásról.

Fedezzük fel Név és Kontextus, amelyek a JNDI alapvető funkcióit tartalmazzák.

2.1. Név Felület

Név objectName = új összetett név ("java: comp / env / jdbc");

A Név Az interfész lehetővé teszi a JNDI nevek összetevőinek és szintaxisainak kezelését. A karakterlánc első tokenje a globális kontextust reprezentálja, utána minden hozzáadott karakterlánc a következő részkontextust képviseli:

Felsorolási elemek = objectName.getAll (); while (elements.hasMoreElements ()) {System.out.println (elements.nextElement ()); }

Kimenetünk a következőképpen néz ki:

java: comp env jdbc

Ahogy látjuk, / a határoló Név részkörnyezetek. Most adjunk hozzá egy alkörnyezetet:

objectName.add ("példa");

Ezután teszteljük a kiegészítést:

assertEquals ("példa", objectName.get (objectName.size () - 1));

2.2. Kontextus Felület

Kontextus tartalmazza az elnevezési és címtárszolgáltatás tulajdonságait. Itt a kényelem érdekében használjunk néhány Spring segédkódot a Kontextus:

SimpleNamingContextBuilder builder = új SimpleNamingContextBuilder (); építő.aktivál ();

Tavaszi SimpleNamingContextBuilder létrehoz egy JNDI szolgáltatót, majd aktiválja a készítőt a NamingManager:

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

Végül, JndiTemplate segít elérni a InitialContext.

3. JNDI objektumkötés és keresés

Most, hogy láttuk, hogyan kell használni Név és Kontextus, használjuk a JNDI-t egy JDBC tárolásához Adatforrás:

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

3.1. JNDI objektumok megkötése

Mivel van kontextusunk, kössük hozzá az objektumot:

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

Általánosságban elmondható, hogy a szolgáltatásoknak objektum hivatkozást, sorosított adatokat vagy attribútumokat kell tárolniuk egy könyvtár kontextusban. Mindez az alkalmazás igényeitől függ.

Vegye figyelembe, hogy a JNDI ilyen módon történő használata ritkább. Általában a JNDI kapcsolódik az alkalmazások futásidején kívül kezelt adatokhoz.

Ha azonban az alkalmazás már létrehozhatja vagy megtalálhatja Adatforrás, könnyebb lehet ezt bekötni a Spring segítségével. Ezzel szemben, ha valami az alkalmazásunkon kívüli objektumokat köt a JNDI-be, akkor az alkalmazás elfogyaszthatja azokat.

3.2. JNDI objektumok felkutatása

Nézzünk utána Adatforrás:

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

És akkor teszteljük annak biztosítását Adatforrás a várakozásoknak megfelelően:

assertNotNull (ds.getConnection ());

4. Gyakori JNDI kivételek

A JNDI-vel való együttműködés időnként futásidejű kivételeket eredményezhet. Íme néhány gyakori.

4.1. NameNotFoundException

ctx.lookup ("badJndiName");

Mivel ez a név ebben a kontextusban nincs kötve, a verem nyomát látjuk:

javax.naming.NameNotFoundException: A név [badJndiName] nincs kötve; 0 kötés: [] az org.springframework.mock.jndi.SimpleNamingContext.lookup (SimpleNamingContext.java:140) címen: java.naming / javax.naming.InitialContext.lookup (InitialContext.java:409)

Meg kell jegyeznünk, hogy a verem nyomkövetése az összes objektumot tartalmazza, ami hasznos annak felderítéséhez, hogy miért történt a kivétel.

4.2. NoInitialContextException

Bármilyen kölcsönhatás a InitialContext dobhat NoInitialContextException:

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

Meg kell jegyeznünk, hogy a JNDI ilyen használata érvényes, mivel korábban használtuk. Ezúttal azonban nincs JNDI-kontextusszolgáltató, és kivétel lesz:

javax.naming.NoInitialContextException: Meg kell adni az osztály nevét a környezetben vagy a rendszer tulajdonságában, vagy egy alkalmazás erőforrás fájljában: java.naming.factory.initial at java.naming / javax.naming.spi.NamingManager.getInitialContext (NamingManager.java: 685)

5. A JNDI szerepe a modern alkalmazásarchitektúrában

Míg A JNDI kevésbé játszik szerepet a könnyű, konténeres Java alkalmazásokban mint például a Spring Boot, vannak más felhasználási lehetőségek is. Három Java technológia, amely még mindig használja a JNDI-t, a JDBC, az EJB és a JMS. A Java vállalati alkalmazások széles skáláját használják.

Például egy külön DevOps csapat kezelheti a környezeti változókat, például a felhasználónevet és a jelszót egy érzékeny adatbázis-kapcsolat számára minden környezetben. JNDI-erőforrás létrehozható a webalkalmazás-tárolóban, a JNDI-t következetes absztrakciós rétegként használva, amely minden környezetben működik.

Ez a beállítás lehetővé teszi a fejlesztők számára, hogy fejlesztési célokból helyi definíciót hozzanak létre és vezérelhessenek, miközben a termelési környezet érzékeny erőforrásaihoz kapcsolódnak ugyanazon JNDI néven keresztül.

6. Következtetés

Ebben az oktatóanyagban láttunk egy objektumot összekapcsolni, összekötni és megkeresni a Java elnevezési és címtárfelület használatával. Megnéztük a JNDI által felvetett általános kivételeket is.

Végül megvizsgáltuk, hogy a JNDI hogyan illeszkedik a modern alkalmazás architektúrájába.

Mint mindig, a kód elérhető a GitHubon.