Vous êtes sur la page 1sur 10

Introduction

Java Naming and Directory Interface (JNDI)

Java Naming and Directory Interface


Gal Thomas gael.thomas@lip6.fr

Java Standard Edition

API de connexion des services dannuaires et de rsolution de noms


RMI Registry (RMI), CosNaming (Corba), LDAP, NIS, File System, DNS !!Uniformise laccs ces annuaires dans une seule API !!Utilisation simultane et transparente de ces annuaires

Service de rsolution de noms Universit Pierre et Marie Curie Master Informatique M2 Spcialit SAR
Associe des noms des entits + recherche partir du nom

Service dannuaire
Associe des attributs et des noms aux entits + recherche partir des deux
2008-2009 Master SAR - M2 MDOC - Introduction 2

Introduction
Client lger : navigateur Web HTTP Serveur WEB

Exemples dannuaire
Exemple de service de rsolution de noms : RMIRegistry
!!API dfinie en Java !!Associe des noms plats des objets RMI Rappel : objet RMI = objet Serveur, implmente linterface Remote

JEE
Service Transaction: JTA/JTX

Service Nommage : JNDI

Service BD : JDBC

Client lourd

Lancer le service de rsolution de noms :


!!shell$ rmiregistry &

Conteneur WEB

Service de transport : IIOP, RMI ou autre

Se connecter au service de rsolution de noms en Java


!!Registry LocateRegistry.getRegistry(String host, int port);
Base De Donne
3 2008-2009 Master SAR - M2 MDOC - Introduction 4

Cache Conteneur EJB Conteneur EJB

2008-2009

Master SAR - M2 MDOC - Introduction

Exemples dannuaire
Exemple de service de rsolution de noms : RMIRegistry Utiliser le RMI Registry
!!void bind(String name, Remote obj); !!void rebind(String name, Remote obj); !!String[] list(); !!Remote lookup(String name);

Exemples dannuaire
Exemple de service de rsolution de noms : le systme de fichiers
!! API dfinie par le systme dexploitation !! Associe des noms hirarchiques des objets fichiers Notion de rpertoire :
! Entit contenant des noms ! Un rpertoire possde un nom dans un autre rpertoire

Utiliser le systme de fichier sous linux


!! ls (list), rm (remove), touch/redirection (bind), mv (move) / etc passwd conf.d bin ls

2008-2009

Master SAR - M2 MDOC - Introduction

2008-2009

Master SAR - M2 MDOC - Introduction

Exemples dannuaire
Exemple de service dannuaire : LDAP
!! Associe des proprits (cl=valeur) des entits !! Chaque entit possde une classe (Person etc..) dfinie dans un schma !! Structure hirarchique, appele DIT (Directory Information Tree) !! Chaque nud de larbre est une entit qui possde une proprit appele RDN (Relative Distinguished Name) unique pour la classe

Exemples dannuaire
Exemple de service dannuaire : LDAP
!!Recherche : dans un sous-arbre ( partir dun DN) !!Scope : dfinit la profondeur de la recherche
! scope=sub : dans tout le sous-arbre ! scope=one : uniquement parmi les fils ! scope=base : uniquement sur notre propre nud (utile pour consulter les autres attributs dun nud)

Un nud est identifi par son DN (Distinguished Name) constitu de la liste (inverse) des RDN jusqu la racine
dc=fr dc=inria ou=computer ou=people uid=igor dn: dc=fr dn: dc=inria, dc=fr dn: ou=people, dc=inria, dc=fr dn: uid=igor, ou=people, dc=inria, dc=fr
7

!!Recherche laide de filtre Exemples :


! (user=Bob) : cherche Bob ! (&(user=B*)(objectclass=Person)) : cherche une personne dont le nom commence par B ! (&(age>22)(age<33)(objectclass=Person)) : cherche les personne dont lge est compris entre 22 et 33

uid=anne
2008-2009

Un annuaire LDAP est une BD hirarchique


2008-2009 Master SAR - M2 MDOC - Introduction 8

Master SAR - M2 MDOC - Introduction

Architecture de JNDI
Architecture de JNDI JNDI API : api dutilisation de services de nommage
javax.naming.*, javax.naming.directory.*, javax.naming.ldap.*, javax.naming.event.*

Architecture de JNDI

Naming Manager : correspondance entre lAPI JNDI et les fournisseurs de services JNDI SPI : api interne des fournisseurs de services
javax.naming.spi.*

2008-2009

Master SAR - M2 MDOC - Introduction

2008-2009

Master SAR - M2 MDOC - Introduction

10

Architecture de JNDI
JNDI : systme hirarchique de rsolution de noms et annuaire
!!API daccs des annuaires avec des fournisseurs dannuaires !!API daccs des services de rsolution de noms sinon (API daccs un annuaire hrite de lAPI de rsolution de noms)

Architecture de JNDI
Hirarchie de contexte
!!Un contexte est un rpertoire de noms (rpertoire dans les fs, NamingContext Corba, nom de domaine DNS) !!Contient des associations <nom, objet> !!Peut contenir des sous-contextes (association <nom, Context>) !!Nexiste que si le fournisseur de service loffre (pas le cas de RMIRegistry)

Diffrences principales entre les deux API


!!Annuaire : recherche par nom ou par filtre !!Service rsolution nom : recherche par nom uniquement

InitialContext
!!Contexte racine dans JNDI !!Obligatoire pour toute recherche !!Construit avec new InitialContext() ou new InitialContext(Hashtable env) Possibilit de passer des paramtres au contexte initial via
! Proprit (jndi.properties) ! Table de hash env
11 2008-2009 Master SAR - M2 MDOC - Introduction 12

tude dans le suite : le service de rsolution de nom uniquement


!!API pour les annuaires : voir la JavaDoc javax.naming.directory !!Notions correspondent celles de LDAP

2008-2009

Master SAR - M2 MDOC - Introduction

Utilisation de JNDI
Les deux paramtres de base du contexte initial
!!INITIAL_CONTEXT_FACTORY = "java.naming.factory.initial" Classe du fournisseur de service du contexte initial
(Attention : cette classe doit tre dans le CLASSPATH)

Utilisation de JNDI
Extrait de lAPI de Context
!!void bind(String name, Object obj): associe lobjet obj au nom name
(chemin complet, tous les contexte intermdiaires doivent exister)

!!PROVIDER_URL = "java.naming.provider.url Paramtres pass au fournisseur, en gnral URL du service

Exemple
Properties props = Properties(); props.put(INITIAL_CONTEXT_FACTORY, "com.sun.jndi.registry.RegistryContextFactory"); props.put(PROVIDER_URL, "rmi://localhost:1099"); Context ic = new InitialContext(props);

!!NamingEnumeration<Binding> listBinding(String name): renvoie la liste des associations possdant le nom name (1 niveau) !!Object lookup(String name): Renvoie lobjet ayant pour nom name (dans le sous-arbre) !!void rebind(String name, Object obj): R-associe lobjet obj au nom name !!void unbind(String name): Dtruit lassociation ayant pour nom name !!Context createSubcontext(String name): Cre un sous-contexte ayant pour nom name (prfrable bind)
13 2008-2009 Master SAR - M2 MDOC - Introduction 14

2008-2009

Master SAR - M2 MDOC - Introduction

Utilisation de JNDI
Exemple avec le service de rsolution de noms RMI
public interface Hello { void sayHello(); } public HelloImpl implements Hello { implem }

Lusine objet
Problme avec les Stateful Bean: A chaque client son Bean!
! ! ic.lookup("Test@Remote") renvoie un nouveau Bean chaque appel

Ct serveur
Context ic = new InitialContext(props); Remote obj = new HelloImpl(); UnicastRemoteObject.exportObject(obj, 0); ic.rebind("mon-serveur", obj);

Solution : enregistrer des javax.naming.Reference ! ! Interception de la recherche

Ct client
Context ic = new InitialContext(props); Hello server = (Hello)ic.lookup("mon-serveur"); server.sayHello();
2008-2009 Master SAR - M2 MDOC - Introduction 15 2008-2009 Master SAR - M2 MDOC - Introduction 16

Lusine objet
Exemple : lusine MaFactory
public MaFactory extends ObjectFactory { public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) { String cname = name.get(0); // nom de lobjet Class cl = Class.forName(name); // charge la classe return cl.newInstance(); } }

Lusine objet
Exemple : lenregistrement
interface Cinema {} public CinemaImpl implements Cinema {} // (class de lobjet, class de lusine, classpath de lusine) Reference ref = new Reference( Cinema.class.getName(), MaFactory.class.getName(), null); ic.bind("CinemaImpl", ref);

2008-2009

Master SAR - M2 MDOC - Introduction

17

2008-2009

Master SAR - M2 MDOC - Introduction

18

Lusine objet
Exemple : la recherche
ic.lookup("CinemaBean"); lookup "CinemaBean" Valeur retourne ref car
Reference

URL JNDI
ContextInitial : associ un unique fournisseur Problme : Utiliser simultanment plusieurs fournisseurs de nommages Solution : Les URL JNDI
!!Dfinissent des protocoles !!Associe des protocoles avec des fournisseurs "rmi://localhost:1099/mon-serveur", "iiop://susanoo.lip6.fr/un-autre-serveur"

new CinemaBean getObjectInstance instance de MyFactory

rmiregistry

2008-2009

Master SAR - M2 MDOC - Introduction

19

2008-2009

Master SAR - M2 MDOC - Introduction

20

URL JNDI
URL RMI : accs direct un service de rsolution de noms URL = schema:partie-specific-au-protocole
!!Le fournisseur correspondant au schma est automatiquement charg !!vite de donner explicitement une classe au contexte initiale

URL JNDI
Exemple :
InitialContext ic = new InitialContext(); Hello sever = (Hello)ic.lookup("rmi://localhost:1099/mon-server"); // ! quivalent // (new com.sun.jndi.url.rmi.rmiURLContextFactory()) // .getInitialContext(props) // .lookup("mon-server"); // avec props "contient" localhost et 1099

Construction de la classe correspondant au schema


package_prefix.schema.schemaURLContextFactory

package_prefix = com.sun.jndi.url par dfaut

Remarque : ici, le contexte initial ic na pas de drivers (SPI) associ

2008-2009

Master SAR - M2 MDOC - Introduction

21

2008-2009

Master SAR - M2 MDOC - Introduction

22

URL JNDI
Dfinition de nouvelles URL JNDI
!!Paramtre du contexte initial (proprit) !!Context.URL_PKG_PREFIX = "java.naming.factory.url.pkgs Exemple :
props.put(URL_PKG_PREFIX, "org.wiz:com.bubble");

URL JNDI
Exemple :
InitialContext ic = new InitialContext(props); ic.lookup("java:comp/env/ejb/Cinema"); // charge com.bubble.java.javaURLContextFactory // dlgue la recherche de comp/env/ejb/Cinema // cette usine fournisseur dannuaire

Cherche les usines fournisseur dannuaire en essayant de charger les classes


org.wiz.schema.schemaURLContextFactory

puis com.bubble.schema.schemaURLContextFactory puis com.sun.jndi.url.schema.schemaURLContextFactory

2008-2009

Master SAR - M2 MDOC - Introduction

23

2008-2009

Master SAR - M2 MDOC - Introduction

24

JNDI dans Java Enterprise Edition


JNDI et Java Enterprise Edition Deux espaces de nommage pour chaque composant (Web ou EJB)
!!Espace de nommage global (new InitialContext()) Service de nommage classique, service peut tre distant !!Espace de nommage local sous le schma dURL java: Convention : les noms imports sont dans java:comp/env Rcriture des noms, service forcment local
Nommage local

JNDI dans Java Enterprise Edition


EJB Test Rfrence comp/ env/ Cinema Lien Test@Remote Cinema@Remote comp/ env/ Test EJB Cinema
Master SAR - M2 MDOC - Introduction 26

Nommage global

Client Lourd

Utilisation directe

Lien

Nommage local

Principe :
!!Un composant utilise les noms locaux !!Le descripteur de dploiement importe les noms globaux ! Le code est indpendant des noms globaux
2008-2009 Master SAR - M2 MDOC - Introduction 25

comp/ env/ Cinema MaServlet

Lien Rfrence

2008-2009

JNDI dans Java Enterprise Edition


Principe du nommage avec les annotations :
!!name : le nom local !!mappedName : le nom global (donc, viter! Sauf pour clients lourds)

JNDI dans Java Enterprise Edition


Exemple 1 en utilisant les paramtres par dfaut :
!!Fichier TestBean.java
@Stateful(mappedName="Test@Remote") public class TestBean implements Test { @EJB Cinema cinema; }

Exemple 1 :
@Stateful(name= "Test", mappedName="Test@Remote") @Remote(Test.class) Par dfaut, public class TestBean implements Test { name=nom de linterface @EJB(name="Cinema") de lentit en question (sans le package) Cinema cinema; les deux name peuvent } tres omis

!!Fichier CinemaBean.java
@Stateless public class CinemaBean implements Cinema {}

Tous les noms locaux des beans sont exports dans lunit de dploiement (ici, Cinema est packag dans le mme Bean que Test)
2008-2009 Master SAR - M2 MDOC - Introduction 27 2008-2009 Master SAR - M2 MDOC - Introduction 28

Nommage local

JNDI dans Java Enterprise Edition


Exemple 2 :
@Resource(name="rigolo", mappedName="topic_rigolo") Topic topic; @Resource(name="factory", mappedName="JTCF") TopicConnectionFactory factory;

JNDI dans Java Enterprise Edition


EJB : importation de noms externes et modification des liaisons Ajouter un fichier ejb-jar.xml
<ejb-jar> <enterprise-beans> <session> <ejb-name>AutreBean</ejb-name> <!-- insrer ici les importations </session> </enterprise-beans> </ejb-jar>

Les noms dans le services globales sont donc


!! "topic_rigolo" pour le topic

!!"JTCF" pour lusine

-->

Intrt du nom local : Pour modifier le lien entre nom global et nom local dans le fichier de dploiement
2008-2009 Master SAR - M2 MDOC - Introduction 29

2008-2009

Master SAR - M2 MDOC - Introduction

30

JNDI dans Java Enterprise Edition


Importation dun EJB Test dans un EJB AutreBean
<ejb-name>AutreBean</ejb-name> paramtre name de @EJB <ejb-ref> <ejb-ref-name>Test</ejb-ref-name> <remote>mdoc.ejbsample.Test</remote> <mapped-name>Test@Remote</mapped-name> nom global du Bean Test <injection-target> <injection-target-class> mdoc.AutreBean</injection-target-class> <injection-target-name> champs @EJB de AutreBean champsEJB</injection-target-name> </injection-target> </ejb-ref>

JNDI dans Java Enterprise Edition


Importation dune ressource dans un EJB AutreBean
<ejb-name>AutreBean</ejb-name> paramtre name de @Resource <resource-ref> <res-ref-name>monitor</res-ref-name> <mapped-name>monitoring_topic</mapped-name> <injection-target> nom global du topic <injection-target-class> mdoc.AutreBean</injection-target-class> <injection-target-name> champs @Resource de AutreBean topic</injection-target-name> </injection-target> </resource-ref>

class AutreBean { @EJB(name="Test") champsEJB; }


2008-2009 Master SAR - M2 MDOC - Introduction 31

class AutreBean { @Resource(name="monitor") topic; }


2008-2009 Master SAR - M2 MDOC - Introduction 32

JNDI dans Java Enterprise Edition


Web : importation de noms externes et modification des liaisons 1 - Enrichir le fichier web.xml
correspond java:comp/env/Test

JNDI dans Java Enterprise Edition


Web : importation de noms externes et modification des liaisons 2 - Dfinir le fichier jonas-web.xml
<jonas-web-app> <jonas-ejb-ref> Nom local <ejb-ref-name>Test</ejb-ref-name> <jndi-name>Test@Remote</jndi-name> Nom global </jonas-ejb-ref> Nom local <jonas-resource> <res-ref-name>monitor</res-ref-name> <jndi-name>monitoring_topic</jndi-name> </jonas-resource> Nom global </jonas-web-app>

dans le composant Web <ejb-ref> <ejb-ref-name>Test</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home></home> <remote>mdoc.ejbsample.Test</remote> </ejb-ref> correspond java:comp/env/monitor dans le composant Web

<resource-ref> <res-ref-name>monitor</res-ref-name> <res-type>javax.jmx.Topic</res-type> <res-auth>Container</res-auth> </resource-ref>


2008-2009 Master SAR - M2 MDOC - Introduction 33

2008-2009

Master SAR - M2 MDOC - Introduction

34

JNDI dans Java Enterprise Edition


Web : importation de noms externes et modification des liaisons Utilisation :
void doGet(HttpServletRequest i, HttpServletResponse o) { Test test = (Test)(new InitialContext()). lookup("java:comp/env/Test"); Topic topic = (Topic)(new InitialContext()). lookup("java:comp/env/monitor"); }

JNDI dans Java Enterprise Edition


Nommage et rpartition
!!Version centralise : deux conteneurs centraliss sur deux machines
Conteneur 1 sur Machine1 Service de nommage 1 sur Machine 1 Conteneur 2 sur Machine2 Service de nommage 2 sur Machine 2

!!Version distribue : un service de nommage commun sur une autre machine


Conteneur 1 sur Machine1 Service de nommage sur Machine 3 Conteneur 2 sur Machine2

Ou
class MaServlet extends HttpServlet { @EJB(name="Test") Test test; @Resource(name="monitor") Topic topic; }

2008-2009

Master SAR - M2 MDOC - Introduction

35

2008-2009

Master SAR - M2 MDOC - Introduction

36

JNDI dans Java Enterprise Edition


Nommage et rpartition
!!Version tolrante aux fautes et/ou rpartition de charge
Conteneur 1 sur M1 Proxy de rpartition sur M1 Tolrance aux pannes Service de nommage rpliqu 1 sur M3 synchronisation Service de nommage rpliqu 2 sur M4 Conteneur 2 sur M2 Proxy de rpartition sur M2

Conclusion
JNDI : masque lhtrognit des services dannuaires
!!Une API pour de multiples services !!Mais : possibilit limites par le service
! Pas darbre avec JNDI si service RMIRegistry ! Pas de lookup("*t*") avec RMIRegistry

Notion dURL JNDI : accs simultan plusieurs services dannuaire


!!Mais ne masque pas la localisation du service dannuaire !!Mais ne masque pas le type du service dannuaire

JNDI dans JEE


!!Le conteneur composant prend en charge laccs aux service de nommage !!Masquage des noms rels via le schma dURL java: + fichier dploiement !!Construction avance distribue pour tolrance aux pannes/rpartition charge
37 2008-2009 Master SAR - M2 MDOC - Introduction 38

2008-2009

Master SAR - M2 MDOC - Introduction

Vous aimerez peut-être aussi