2. Plan
introduction
Les services de nommage "Naming Services"
Les annuaires "Directory Services"
JNDI et ses Objectifs
Architecture JNDI
Architecture JNDI API
Architecture JNDI SPI
L’utilisation d’un service de nommage
L’obtention d’un objet
Le stockage d’un objet
Utilisation de JNDI
En résumé
3. Les services de nommage "Naming Services"
Un service de nommage permet d'associer un nom unique à un
objet et de faciliter ainsi l'obtention de cet objet.
Il existe plusieurs types de services de nommage parmi lesquels :
DNS (Domain Name System) : service de nommage utilisé sur internet
pour permettre la correspondance entre un nom de domaine et une
adresse IP
NIS (Network Information System) : service de nommage réseau
développé par Sun Microsystems
COS Naming (Common Object Services) : service de nommage utilisé
par Corba pour stocker et obtenir des références sur des objets Corba.
4. Les annuaires "Directory Services"
• Un annuaire est un service de nommage qui possède en plus une
représentation hiérarchique des objets qu'il contient et un mécanisme
de recherche.
• Exemple d’annuaires :
LDAP (Lightweight Directory Access Protocol)
• Exemple de structure directory d’une entreprise :
Entreprise A
Les
employés
Employer1
Employer2
Matériels
Impriment
Ordinateurs
Ordinateur1
Ordinateur2
Fax
5. JNDI et ses Objectifs
• JNDI est l’acronyme de Java Naming and Directory
Interface.
• Cette API fournit une interface unique pour utiliser
différents services de nommages ou d’annuaires et
définit une API standard pour permettre l’accès à ces
services.
• JNDI propose donc une abstraction pour permettre
l’accès à ces différents services de manière standard.
• Ceci est possible grâce à l’implémentation de pilotes
qui mettent en œuvre la partie SPI de l’API JNDI.
6. Architecture JNDI
Application Java
JNDI API
JNDI Naming Manager
JNDI API SPI
RMI LDAP NDS CORBA …
JNDI est composée de deux parties :
Une API utilisée pour le développement des applications
Une SPI utilisée par les fournisseurs d'une implémentation d'un pilote
Packages Rôle
javax.naming Classes et interfaces pour utiliser un service de nommage
javax.naming.directory Etend les fonctionnalités du package javax.naming pour l'utilisation des services de type annuaire
javax.naming.event Classes et interfaces pour la gestion des événements lors d'un accès à un service
javax.naming.ldap Etend les fonctionnalités du package javax.naming.directory pour l'utilisation de la version 3 de LDAP
javax.naming.spi Classes et interfaces dédiées aux Service Provider pour le développement de pilotes
7. L’utilisation d’un service de nommage
Le contexte :
Un service de nommage permet d'associer un nom à un objet. Cette association
est nommée binding. Un ensemble d'associations nom/objet est nommé un
contexte. Il existe deux types de contexte : contexte racine et sous contexte.
Exemple :
C: est un contexte racine dans un système de fichiers de type Windows.
Le répertoire Users (C:Users) est un sous-contexte du contexte racine qui est dans
ce cas nommé sous-répertoire.
Dans DNS, com est un contexte racine et test est un sous contexte (test.com), et a
partir de ce contexte, il est possible de réaliser plusieurs opérations.
Hashtable hashtableEnvironment = new Hashtable();
hashtableEnvironment.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
hashtableEnvironment.put(Context.PROVIDER_URL, "file:c:/");
Context context = new InitialContext(hashtableEnvironment);
8. L’utilisation d’un service de nommage
Pour pouvoir utiliser un service de nommage, il faut tout d'abord obtenir un
contexte racine qui va encapsuler la connexion au service.
A partir de ce contexte, il est possible de réaliser plusieurs opérations :
Tous les opérations possèdent deux versions surchargées attendant respectivement :
Un objet de type Name : cet objet encapsule une séquence ordonnée de un ou plusieurs
éléments (l'intérêt de cette classe est de permettre la manipulation individuelle de
chaque élément).
Une chaine de caractères : elle contient la séquence
Méthode Rôle
void bind(String, Object) associer un objet avec un nom
void rebind(String, Object) modifier une association
Object lookup(String) supprimer une association
void unbind(String) obtenir un objet à partir de son nom
void rename(String, String) modifier un nom d’objet
NamingEnumeration listBindings(String) obtenir une liste des nom et les objets associés
NamingEnumeration list(String) obtenir une liste des nom et les classes d’objets associés
9. Le stockage d'un objet
• Généralement les objets à stocker doivent être d'un type particulier,
dépendant du pilote utilisé : il est fréquent que de tels objets doivent
implémenter une interface (java.io.Serializable, java.rmi.Remote, etc ...)
• La méthode bind() permet d'associer un objet à un nom.
Exemple :
import javax.naming.*;
...
public void createName() throws NamingException {
Context context = new InitialContext();
context.bind("/config/monApplication", "valeur");
}
10. L'obtention d'un objet
• Pour obtenir un objet du service de nommage, utiliser la méthode
lookup() du contexte.
Exemple :
• Ceci peut permettre de facilement stocker des options de configuration
d'une application, plutôt que de les stocker dans un fichier de
configuration. C'est encore plus intéressant si le service qui stocke ces
données est accessible via le réseau car cela permet de centraliser ces
options de configuration.
• Il peut permettre aussi de stocker des données "sensibles" comme des
noms d'utilisateurs et des mots de passe pour accéder à une ressource
et ainsi empêcher leur accès en clair dans un fichier de configuration.
import javax.naming.*;
....
public String getValeur() throws NamingException {
Context context = new InitialContext();
return (String) context.lookup("/config/monApplication");
}
11. Utilisation de JNDI
J2EE utilise énormément JNDI pour proposer des références vers des ressources
nécessaires aux applications. Chaque conteneur J2EE utilise un service accessible
via JNDI pour stocker des informations sur les applications et les composants. Ceci
permet de rendre dynamique la recherche de composants de l'application
Plusieurs technologies mises en œuvre dans J2EE font un usage de JNDI : par
exemple JDBC, EJB, JMS, ...
Dans JDBC 2.0 elle est fortement recommandée d’utilise JNDI pour stocker des
objets de type DataSource qui encapsulent les informations utiles à la connexion à
la source de données.
Comme JDBC, JMS recommande de stocker les informations concernant les files
(queues) et les sujets (topics) dans un annuaire et de les rechercher grâce à JNDI.
Les EJB stockent aussi leur référence vers leur interface home dans l'annuaire du
serveur d'application pour permette à un client d'obtenir une référence sur l'EJB.
12. En résumé
• JNDI est une solution proposée par J2EE pour exporter, partager,
centraliser les paramètres d’une application dans le cadre d’un projet ou
d’une entreprise. Il s’agit d’une base de données objet arborescente
dont chaque répertoire peut utiliser une technologie différente.
Certains répertoires sont spéciaux et permettent d’exploiter la même
technologie pour des paramètres spécifiques à une application ou à un
serveur d’application.
• JNDI est généralement utilisé pour découvrir ou publier des EJB. Cela
s’effectuant sans code particulier.