Académique Documents
Professionnel Documents
Culture Documents
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 BD : JDBC
Client lourd
Conteneur WEB
2008-2009
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
2008-2009
2008-2009
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
uid=anne
2008-2009
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
2008-2009
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)
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
2008-2009
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)
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
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);
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
17
2008-2009
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"
rmiregistry
2008-2009
19
2008-2009
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
2008-2009
21
2008-2009
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
2008-2009
23
2008-2009
24
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
Lien Rfrence
2008-2009
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
-->
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
30
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
2008-2009
34
Ou
class MaServlet extends HttpServlet { @EJB(name="Test") Test test; @Resource(name="monitor") Topic topic; }
2008-2009
35
2008-2009
36
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
2008-2009