Cieľom JNDI je priniesť použiteľné rozhranie na prácu s rôznymi mennými a adresárovými službami. Tieto články o Java Naming and Directory Interface (JNDI) si stanovujú za cieľ predovšetkým priniesť doplnkové informácie k Enterprise JavaBeans 2.x, pretože architektúra JNDI je veľmi úzko prepojená nielen s technológiou EJB, ale aj s celým J2EE.

Základným vybavením každej enterprise-class aplikácie musí byť schopnosť lokalizácie (v zmysle nájdenia) rôznych komponent a služieb. Obvyklým predpokladom v prípade, že klient potrebuje kontaktovať inú komponentu alebo službu, je, aby klient poznal meno danej komponenty alebo služby. Na druhej strane sa klient nemusí starať o to, kde fyzicky je komponenta či služba uložená. Meno alebo názov je obvykle nejaký alias či user-friendly výraz zastupujúci skutočné meno, ktoré je viac computer-friendly. Ide o systém podobný s DNS službou, kde sa názov servera mapuje na jeho IP adresu.

Budovanie softvérových aplikácií, pri ktorých sú jednotlivé komponenty a služby decentralizované, tak vyvoláva potrebu používať menné alebo tiež adresárové služby (Naming Services). Tieto služby vytvárajú transparentný spôsob lokalizácie komponent a ich služieb. Pod transparentným sa v tomto prípade rozumie, že klient nevie presné fyzické umiestnenie serverovej komponenty. Rovnako ho nesmie negatívne ovplyvniť, ak nastane zmena v doterajšom fyzickom umiestnení.

Naming services (menné služby)

Menná služba je v podstate služba, ktorá udržiava zoznam objektov alebo referencií na objekty a priraďuje im user-friendly názvy. Toto priradenie sa formálne označuje previazanie (binding). Nasledujúci obrázok v jednoduchosti naznačuje tento proces:

Ilustrácia uloženia objektu v mennej službe
Ilustrácia uloženia objektu v mennej službe

Ilustrácia umiestnenia referencie na objekt v mennej službe
Ilustrácia umiestnenia referencie na objekt v mennej službe

Ako som už spomenul, pomenovaný zdroj môže byť priamo objekt, alebo referencia na objekt, ktorý sa fyzicky nachádza niekde na dosiahnuteľnom mieste v sieti. Napríklad môžete vytvoriť objekt triedy Hashtable, naplniť ho dátami, uložiť tento objekt do mennej služby a priradiť mu meno. Klient, ktorý by následne potreboval tieto dáta, musí kontaktovať službu a požiadať o konkrétny objekt, pričom musí poznať meno, ktoré sme mu určili. Akým spôsobom sa kontaktuje menná služba a vyhľadáva požadovaný objekt, si povieme neskôr.

Množina vzájomne prepojených previazaní vytvára niečo, čo sa označuje pojmom menný priestor (namespace). Napríklad telefónny zoznam môžeme považovať za menný priestor, pričom názov účastníckej stanice a jej telefónne číslo je spomínané previazanie. Menná služba je zodpovedná za správu a poskytovanie týchto previazaní. Nasledujúci obrázok ilustruje, ako jednotlivé previazania a menné priestory koexistujú:

Ilustrácia menných priestorov, obsahujúcich jednotlivé previazania
Ilustrácia menných priestorov, obsahujúcich jednotlivé previazania

Directory services (adresárové služby)

Adresárová služba je určitým rozšírením možností poskytovaných mennou službou. Adresárová služba umožňuje asociovať rôzne atribúty s konkrétnym previazaním. Klient potom môže použiť adresárovú službu na vyhľadanie špecifického previazania s konkrétnymi hodnotami atribútov.

Nasleduje zoznam najpoužívanejších implementácií adresárových služieb:

JNDI – základné fakty

JNDI alebo Java Naming and Directory Interface umožňuje Java klientom pristupovať k rôznym menným a adresárovým službám a využívať ich možnosti. Podobne ako iné časti J2EE špecifikácie, aj JNDI poskytuje množinu rozhraní a tried združených v API.

JNDI je rozdelené do týchto piatich balíčkov (viď Java Naming and Directory Interface 1.2.1 Specification):

  • javax.naming
  • javax.naming.directory
  • javax.naming.event
  • javax.naming.ldap
  • javax.naming.spi

Pre väčšinu EJB (viď EJB 2.x – Enterprise JavaBeans 2.x) aplikácií je dôležitejšia podpora menných služieb ako adresárových. I keď adresárové služby sú tiež veľmi dôležité, z nášho pohľadu ako vývojárov enterprise aplikácií s využitím EJB, sa zameriame na menné služby vo vzťahu k EJB. Ak potrebujete ďalšie informácie k JNDI, skúste Java Naming and Directory Interface (JNDI).

Z dôvodu zamerania sa na menné služby pod JNDI, sa budeme zaoberať výhradne balíčkom javax.naming.

Aby ste mohli využívať služby JNDI, potrebujete vlastniť implementáciu tohto rozhrania pre váš konkrétny kontajner. Filozofia je podobná ako pri JDBC, kde potrebujete vlastniť JDBC driver pre konkrétny databázový server, aby ste mohli využívať triedy a rozhrania JDBC špecifikácie. Konkrétna implementácia JNDI sa označuje pojmom Service Provider Interface (SPI) a umožňuje volať JNDI metódy nad špecifikovanou mennou službou. Nasledovný obrázok ilustruje vzájomnú pozíciu JNDI API a JNDI SPI:

Spôsob vzájomného previazania JNDI API a JNDI SPI
Spôsob vzájomného previazania JNDI API a JNDI SPI

SPI umožňuje JNDI pripojiť sa ku konkrétnej implementácii mennej služby a obaliť proprietárne API tým, ktoré definuje JNDI. SPI ďalej mapuje všetky JNDI volania na také volania, ktorým potom rozumie konkrétna menná služba. To umožňuje efektívne meniť a používať rôzne menné služby bez toho, aby to malo negatívny dopad na klientskú aplikáciu.

V skutočnosti môže klient využívať rôzne menné služby bez toho, aby o tom vedel. Napríklad môže existovať binding na LDAP servery, ktorý má však referenciu na objekt existujúci na RMI Registry mennej službe. Vďaka použitiu JNDI API a vďaka obaleniu proprietárneho kódu SPI vrstvou, je dynamické prechádzanie medzi rôznymi mennými službami transparentné.

Existuje niekoľko rôznych typov menných služieb, pričom pre väčšinu z nich existuje aj JNDI implementácia. Toto je zoznam najbežnejších implementácií:

  • Lightweight Directory Access Protocol (LDAP)
  • CORBA Common Object Services (COS) Name Service
  • RMI Registry
  • NIS (Network Information Service od spoločnosti SUN)
  • DNS (Domain Name System)
  • File System (aj súborový systém môže byť použitý ako menná služba)

Aktuálny zoznam dostupných implementácií sa nachádza na stránke Java Naming and Directory Interface (JNDI) Service Providers.

Pri pohľade na uvedené menné služby vás istotne napadne, že nie všetky z nich sú postavené na rovnakom základe. Alebo že určite neukladajú informácie o jednotlivých previazaniach rovnakých spôsobom. Je to presne tak. Každá menná služba ukladá informácie odlišným spôsobom a inak umožňuje klientom vyhľadávať spomínané informácie. Väčšina z nich však ukladá dáta hierarchickým spôsobom. Napriek tomu spôsob, akým môže klient túto hierarchiu prechádzať, sa navzájom líši medzi mennými službami.

Napríklad služba DNS používa znak bodky („.“) na oddelenie jednotlivých úrovní (previazaní), LDAP na druhej strane používa totálne odlišný spôsob. Pretože menné služby môžu byť tak odlišné, musí existovať spôsob ako prekryť jednotlivé špecifiká jednotným API. A toto je zmyslom JNDI. JNDI umožňuje klientom pozerať na rôznorodé menné služby rovnakým spôsobom.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět