Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Distribuées
2ème Année GI
1
Plan
Concepts généraux des architectures logicielles
– Les niveaux d’abstraction d’une application
– Les modèles architecturaux classiques
– La communication
– Les modèles de développement
Projection vers des middlewares
– MOM:
Sockets Java
– RMI:
Java RMI
2
Les trois niveaux
d’abstraction
3
Les niveaux d’abstraction
Système d’information
(application logic layer) Présentation
– La couche gestion des ressources
Applicative
(ressource management layer)
Ressources
4
La couche présentation (1/2)
6
La couche application
7
La couche application
8
La couche gestion de ressources
9
Couche gestion de ressources
10
Des couches conceptuelles
vers les tiers
Les trois couches présentation, application, et ressources sont des
couches conceptuelles pour séparer les fonctionnalités d’un système
Dans les systèmes réels, ces couches peuvent être distribuées et
combinées de différentes manières
On parle alors de tiers
Selon l’organisation considérée pour ces tiers, on obtient les
modèles architecturaux:
– 1-tier
– 2-tier
– 3-tier
– N-tier
11
L’architecture 1-tier
12
Il était une fois…
l’architecture 1-tier
Historiquement, au début
– Gros serveurs et calculateurs isolés Client
– Une interface réduite à un invite de
commande Présentation
– Problématique principale: utiliser
efficacement la CPU
Systèmes monolithiques Application
Les trois couches sont dans le même
tier Ressources
Le système vu comme une boîte noire Architecture
Pas d’interaction avec d’autres 1-tier
13
systèmes ni d’API
Avantages
14
Inconvénients
15
L’architecture 2-
tier
16
L’architecture 2-tier
Emergence due à l’apparition du PC
Coexistence de machines moins puissantes (PC et stations de
travail) avec de grosses machines (calculateurs et serveurs)
Pour les designers:
– Besoin de garder ensemble les couches gourmandes en ressources
– La couche présentation est mise avec le client
Avantages principaux:
– Liés intrinsèquement à la distribution: Accès distants/Accès
concurrents/Composabilité/Tolérance aux fautes/Load
Balancing/Multiplication des IHM…
– La couche présentation est déplacée dans le PC libérant de la puissance
de calcul pour les deux autres couches
17
L’architecture 2-tier
Client
L’architecture 2-tier devient Présentation
Système d’information
très populaire. On parle
alors d’architecture Client-
Serveur Application
Serveur
Le tier client correspond à la
couche présentation Ressources
19
Développements associés à
l’architecture Client-Serveur
21
Inconvénients
22
Architecture 3-tier
23
L’architecture 3-tier
Une séparation claire entre les
différentes couches abstraites:
Client
– La couche présentation réside
chez le client Présentation
Système d’information
– La couche application réside dans
le tier du milieu
L’infrastructure qui supporte le Middleware
développement de la logique Application
business est appelée middleware
– La couche gestion de ressources
réside dans un troisième tier Ressources
24
Comparaison avec l’architecture 2-tier
26
Développements liés à l’utilisation des
middlewares (1/2)
28
Inconvénients
29
L’architecture N-
tier
30
L’architecture N-tier
31
Une architecture N-tier Client
Explorateur
Web
Système d’information
Moteur
HTML, HTML
– Un tier Web comprenant le
serveur Web et le code qui
prépare les pages HTML Middleware
Couche
Les tiers Application et Gestion de Application
données gardent la même
sémantique
Couche
Ressources
32
La distribution
En passant de l’architecture 1-tier vers la 2-tier, 3-tier, et
N-tier, on assiste a une constante addition de tiers.
Avec chaque tier,
– l’architecture gagne en
Flexibilité
Fonctionnalité
Distribution
– Perd en performance avec l’augmentation du coût des
communications entre les différents tiers
– Introduit plus de complexité pour la gestion et la maintenance
Il faut que le gain en flexibilité et en scalabilité compense la
33
perte de performance due à la communication
Communication
dans les systèmes
d’information
34
La communication dans les systèmes
d’information
35
Interactions
Synchrones
36
Interaction synchrone
Requête
blocage
Réponse
37
Avantages (1/2)
39
Inconvénients
41
Les interactions asynchrones
42
Les interactions asynchrones
Au lieu de faire une requête et attendre la réponse
– Envoyer la requête
– Vérifier plus tard si une réponse a été retournée
Le processus Le processus
appelant invoqué
Le processus
put fetch
reste actif
Tampons
fetch put
43
Avantages
45
Applications Procédurales Centralisées
46
L’orienté objet
47
L’orienté composant
E.g. RMI, Corba, ejb
Au-delà de l’orienté objet
On s’intéresse maintenant à la structure en terme de
– Décomposition du code exécutable stand-alone (composants)
– Déploiement au niveau des environnements d’exécution
Objectifs principaux, au sein d’une entité:
– Réutilisation
– Composition
– Facilitation de développement
Nouveaux Concepts:
– Interface
– Connexions
– Middleware
48
L’orienté service
E.g. Services Web
Au-delà de l’orienté-composant
Le web et les applications inter-entités
Objectifs principaux
– Développer le e-business
– Publier-rechercher des services sur le web
– Composition dynamique de services
Nouveaux concepts
– Registres de publications
– Standards de
Description
Communication
Publication
49
Paradigmes de communication
MOM
– Orienté messages
RPC
– Orienté procédures
RMI
– Orienté méthodes
50
Ce qu’il faut retenir
51
Retour sur les thèmes abordés
53
L’évolution de la programmation
54
Un middleware MOM:
La communication
par Sockets en Java
Fonctionnement
Deux composants élémentaires
– Serveur
– Client
Deux phases
– Établissement de la connexion
– Interaction à base d’échange de messages
Mode synchrone connecté
L’envoi de message est réalisé par une écriture sur un flux
La réception de message est réalisée par une lecture sur un flux
56
Architecture
Sockets
Machine 1 d’échange Machine 2
Client Serveur
… … … …
Socket
d’échange Socket
d’écoute
Envoi de messages entre Machine1:Port1 et Machine2:Port2
Port 1
Port 2
Le package
Les constructeurs
– public ServerSocket()
Créée un objet socket d’écoute non liée
– public ServerSocket(int p) throws IOException
Crée un objet socket à l’écoute du port p. Une valeur 0 implique une
allocation automatique d’un port libre.
Les getters
– public InetAddress getInetAddress()
Permet de récupérer l’objet adresse IP
– public int getLocalPort()
Permet de récupérer le port d’écoute
La classe ServerSocket (2/2)
Les méthodes
– public Socket accept() throws IOException
Acceptation de la connection d’un client
Opération bloquante
Par défaut, le temps d’attente est infini
– public void setSoTimeout(int timeout) throws SocketException
L’argument est en milliseconds
Définit un délai de garde. 0 implique un temps de garde infini
À l’expiration, l’exception java.io.InterruptedIOException est levée
– public void close()
Ferme la socket d’écoute
La classe Socket (1/3)
Utilisée pour la programmation des sockets connectées côté client et serveur.
Création
– Côté Serveur: résultat de l’appel de la méthode accept
– Côté Client: par l’appel des constructeurs
public Socket(String host, int port) throws UnknownHostException, IOException
– Ouvre une socket sur une machine et un port côté serveur. Le choix côté client n’est pas
spécifié.
public Socket(InetAddress address, int port) throws IOException
– Utilise l’objet InetAddress au lieu d’une chaine de caractères
public Socket(String host, int port, InetAddress localAddr, int localPort) throws
UnknownHostException, IOException
– Spécifie une adresse et un port côté Client
public Socket(InetAddress addr, int port, InetAddress localAddr, int localPort) throws
IOException
La classe Socket (2/3)
Les getters
– public InetAddress getInetAddress()
L’adresse IP distante
– public InetAddress getLocalAddress()
L’adresse IP locale
– public int getPort()
Le port distant
– public int getLocalPort()
Le port local
La classe Socket (3/3)
Méthodes
– public OutputStream getOutputStream() throws IOException
Ouvre un flux d’écriture sur la socket
Permet de construire un objet PrintWriter
– public InputStream getInputStream() throws IOException
Ouvre un flux de lecture sur la socket
Permet de construire un objet BufferedReader
L’opération de lecture est bloquante
– public void close()
Ferme la socket et libère les ressources
Ecriture du code: côté serveur
Créer une socket d’écoute
– ServerSocket SS= new ServerSocket(NumeroPort);
Récupérer la socket d’échange
– Socket S=SS.accept();
Ouvrir un flux de lecture sur la socket
– BufferedReader BR = new BufferedReader(new
InputStreamReader(S.getInputStream()));
Ouvrir un flux d’écriture sur la socket
– PrintWriter PW = new PrintWriter(S.getOutputStream());
Réaliser les traitements
Communication à travers les flux de lecture et d’écriture
– BR.readLine()
– PW.println(message);
Ecriture du code: côté Client
70
Interfaces, objets et méthodes
distantes
71
Fonctionnement de l’invocation
distante dans RMI
RMI traite un objet distant de manière différente par rapport à
un objet local
– RMI utilise un stub (côté client) pour chaque objet distant:
Le stub joue le rôle d’un représentant local (ou proxy) pour l’objet distant
Le client invoque la méthode sur le stub local
Le stub transporte l’appel de méthode vers l’objet distant
Le stub d’un objet distant implémente la même interface
distante que l’objet distant
– Permet d’intercepter tous les appels sur ces méthodes
– Seules les méthodes déclarées dans l’interface peuvent être invoquées
à distance
72
Etapes de création des
applications RMI
73
Design et implémentation
Définir l’architecture de l’application
– Quels objets sont locaux et lesquels sont distants
– Définir les interfaces distantes pour les objets distants
Spécifier les méthodes invocables à distance par les clients (types des paramètres et
type de retour)
Implémentation des objets distants:
– Les objets distants
Doivent implémenter une ou plusieurs interfaces distantes
Peuvent implémenter d’autres interfaces et méthodes qui ne peuvent être appelées que
localement
Implémentation des clients:
– Les clients qui utilisent les objets distants peuvent être implémentés à n’importe
quel moment après la définition des interfaces
74
Compilation des sources
75
Rendre les objets accessibles
76
Lancement de l’application
Exécution:
– Du Serveur
– Du client
77
Récapitulons…
Côté serveur:
– Définition de l’interface d’accès distant
– Implémentation de la classe de ou des objets distants
– Implémentation du serveur qui crée l’objet distant et l’enregistre
sur le registre de nommage RMI (RMI registry)
Côté client: implémentation comprenant
– L’obtention d’une référence sur l’objet distant à travers le registre
de nommage RMI
– La réalisation des appels de méthodes distantes en utilisant
cette référence
DEMO
Un exemple simple:
L’objet Hello
package hello;
import java.rmi.*;
import java.rmi.server.*;
public class Hello extends UnicastRemoteObject implements HelloInt {
public Hello() throws RemoteException {
super();
}
public void SayIt()throws RemoteException {
System.out.println("bonjour");
}
}
Le serveur
90
Des architectures plus complexes
Client C1
Serveur S
Client C2
Serveur S1
Client C
Serveur S2
91
Le middleware ORB et La norme
CORBA
92
Points Abordés
Le middleware
Concepts généraux de CORBA
L’application Hello
Le langage IDL
Mapping IDL et Java
Création et connexion des objets au BUS
Localisation des objets en CORBA
Étapes de développement
93
Le middleware
Motivation et objectifs
94
Le middleware
95
Motivations
96
Objectifs
97
Difficultés
Hétérogénéité multi-formes
– des matériels
– des systèmes
– des langages
Accès aux ressources (comment les trouver?)
Les problèmes «classiques»:
– transaction,
– concurrence, ...
Beaucoup d'approches "Orientées Objets" incompatibles (BDs,
langages ...)
98
Fonctions du middleware
Le middleware a quatre fonctions principales
– Fournir une interface ou API (Application Programming
Interface) de haut niveau aux applications
– Masquer l’hétérogénéité des systèmes matériels et logiciels
sous-jacents
– Rendre la répartition aussi invisible (“transparente”) que
possible
– Fournir des services répartis d’usage courant
Exemples de middleware Objet
– CORBA
– J2EE/EJB
– .NET
99
L'Object Management Group (OMG)
10
Concepts généraux de CORBA
10
Le standard CORBA : fonctionnalités
(1)
10
Le standard CORBA : fonctionnalités
(2)
10
Fonctionnement
10
Invocation d’une méthode à distance
1: Invocation d’une méthode §§§§§§ 2: Emballage des arguments
3: transport de l’invocation §§§§§§ 4: déballage des arguments
5: Invocation de l’objet réel §§§§§§ 6: Retour de l’invocation locale
7: Emballage du résultat §§§§§§ 8: Transport du résultat
9: Déballage du résultat §§§§§§ 10: Retour de l’invocation distante
(3)
Skeleton
Stub client Stub serveur
(8)
Souche client
10 Réseau
Souche
serveur
Nomenclature CORBA:
Le minimum à connaître
SERVEUR
CLIENT
Servant
Serveur
Client IDL Basic
IDL Skeleton Object
Stubs Adapter
Serveur
Client
Static
Static Static
Dynamic Static
Invocation Static
Static Dynamic
Invocation ORB Skeleton Basic
Interface Invocation Invocation
Interface Skeleton
Skeleton Skeleton
Interface Interface Interface Object Implementati
Repository Interface Interface Interface
Interface interface
Adapter on
Repository
ORB
10
Fonctionnalités des composants
Côté client (1/2)
SII: Code Java (ou C++) du stub. Généré par le compilateur IDL
IR: Interface Repository: Objet CORBA dont l’interface permet
d’obtenir des informations sur les IDL des objets du bus
Client
Static
Static Static
Dynamic Static
Invocation Static
Static Dynamic
Invocation ORB Skeleton Basic
Interface Invocation Invocation
Interface Skeleton
Skeleton Skeleton
Interface Interface Interface Object Implementati
Repository Interface Interface Interface
Interface interface
Adapter on
Repository
11
Fonctionnalités des composants
Côté client (2/2)
Client
Static
Static Static
Dynamic Static
Invocation Static
Static Dynamic
Invocation ORB Skeleton Basic
Interface Invocation Invocation
Interface Skeleton
Skeleton Skeleton
Interface Interface Interface Object Implementati
Repository Interface Interface Interface
Interface interface
on
11 Adapter
Repository
Fonctionnalités des composants Côté
Serveur (1/2)
Dynamic
Static
Static Static
Static
Static Dynamic
Interface Static
Invocation ORB Basic
Invocation Invocation
Invocation Skeleton
Skeleton
Skeleton Skeleton Implementa
Repositor Interface
Interface Interface Object
Interface Interface Interface
Interface interface tion
11 y Interface Adapter
Repository
Fonctionnalités des composants
Côté Serveur (2/2)
DSI:
– permet au serveur de traiter des requêtes d’opérations sans disposer à
l’avance des squelettes de déballage
– Sert à réaliser des interpréteurs CORBA et des passerelles entre ORBs
Implementation Repository:
– Non spécifié par l’OMG
– Contient les informations stockées par le BOA concernant les objets
servants
Client
Dynamic
Static
Static Static
Static
Static Dynamic
Interface Static
Invocation ORB Basic
Invocation Invocation
Invocation Skeleton
Skeleton
Skeleton Skeleton Implementa
Repositor
11 y
Interface
Interface
Interface
Interface Interface Interface
Interface
Interface interface
Object
Adapter
tion
Repository
Fonctionnalités des composants
(côté client et serveur)
Interface ORB: Une API qui fournit les primitives de base pour:
– initialiser et paramétrer l’environnement CORBA,
– associer objets et IOR
object_to_string: fournit la représentation en string d’un objet
CORBA
– On l’utilise généralement du côté serveur pour publier une "stringified"
IOR
string_to_object: associe un objet CORBA à un string
– Utilisée généralement côté client pour associer le stub de l’objet servant
11
Génération de code
IDL
e.g. client et serveur en Java
----------
----------
Description ----------
---------
des interfaces
(1)
Application Implémentation Code
Compilateur
cliente IDL->Java
des interfaces Serveur
Java Java Java
(4) ---------- (2) ---------- ---------- (3)
---------- SII SSI ---------- ----------
---------- (stub) (skeleton) ---------- ----------
--------- --------- ---------
Compilateur Compilateur
Java Java
11 CLIENT SERVEUR
Génération de code
e.g. client Java et serveur en C++
IDL
----------
Description ---------- (1)
des interfaces ----------
---------
Compilateur Compilateur
Java C++
11 CLIENT SERVEUR
Première application CORBA
L’application Hello
11
L’interface IDL
– Simple, non?
11
11
Hello.java
HelloHolder.java
_HelloImplBase.java
HelloPOA.java
StubForHello.java
_HelloStub.java
Implémentation du servant en Java
package hello;
import org.omg.CORBA.*;
public class HelloImpl extends HelloPOA
{ public void hello ( )
{
System.out.println( "Hello World!" );
12 }}
Implémentation du serveur Hello
Création de l’ORB et du BOA
hello.hello ( );
}
catch(COMM_FAILURE ex)
{
System.err.println(ex.getMessage ( ) );
System.exit(1);
12 } } }
Le langage de description
Interface Definition
Language (IDL)
12
Caractéristiques du langage IDL
IDL = Interface Definition Language
Objectif: Définir les interfaces indépendamment des
applications
IDL est un langage déclaratif: ressemble beaucoup à
la partie déclarative de C++
IDL est indépendant de tout langage de
programmation
L’OMG définit des correspondances entre l’IDL et de
nombreux langages de programmation
– C++, SmallTalk, Ada, Java
– Cobol, C…
12
Les concepts principaux
L’interface
– Comme une classe C++ ou Java mais définit uniquement l’interface d’un objet sans
informations sur sa présentation en mémoire et sans informations sur l’implémentation de
ses méthodes
Les opérations
– Comme une méthode
Pas de surcharge d’opérations
Le nom des paramètres sont à spécifier
– Le mode de passage doit être préciser
in || out || inout
Les attributs
– Comme un attribut d’une classe C++ ou Java
– Il peut être modifiable ou non (dans le dernier cas : readonly)
12
Structuration en IDL
Module
Déclarations: alias de type
types complexes
exceptions
Interface
Déclarations: alias de types
types complexes, exceptions
Déclarations: opérations,
attributs
Module
Déclarations: alias de type
types complexes
exceptions
Interface
Déclarations: alias de types
types complexes, exceptions
Déclarations: opérations,
attributs
12
Imbrication dans IDL
Il n’est pas possible d’imbriquer les interfaces.
L’exemple suivant est incorrect
interface A {
interface B {
void operationB( );
};
void operationA( );
};
12
Imbrication en IDL
13
Les valeurs IDL
Types CORBA
Objets Non-Objets
Références
d’objets
Simples Complexes
Les constantes
module valeursIDL {
const double PI = 3.14;
const short s= 1;
const long deux = 1+1;
};
13
La déclaration de types complexes
en IDL
Les tableaux:
module valeursIDL {
typedef string tableau[20];
interface Nom {
attribute string nom;
void setNom(in tableau t, in long indice);
};
typedef Nom matrice[10] [10];
};
13
La déclaration de types complexes en
IDL
Les énumérations
module valeursIDL
{
enum Marque {Renault, Peugeot, Citroen, Dacia};
enum Couleur { rouge, bleu, jaune, vert, noir, blanc };
};
13
La déclaration de types complexes
en IDL
Les structures
module valeursIDL
{
struct voiture
{
Marque marque;
Couleur couleur;
string matricule;
};
};
13
Les exceptions CORBA
Deux types d’exceptions
– Exceptions utilisateur
– Exceptions système: la norme en spécifie 25
BAD_PARAM: mauvais paramètre d’une opération du bus
COMM_FAILURE: échec dans la communication
INV_OBJREF: Référence d’objet non valide
NO_RESSOURCES: ressources insuffisantes pour le traitement de
l’opération
NO_PERMISSION: droit insuffisants pour l’invocation de l’opération
MARSHAL: erreur dans l’emballage/déballage d’un paramètre ou d’un
résultat
INTERNAL: erreur interne du bus
BAD_OPERATION: opération inconnue ou non valide
OBJ_NOT_EXIST: objet détruit
13
Exemple d’une description IDL
module Graphique
{
typedef unsigned short entier;
const entier uneconstante=1;
enum Couleur {rouge, bleu, jaune, vert, noir, blanc };
struct Dimensions {
entier largeur;
entier longueur;
} ;
typedef string ligne;
typedef sequence<ligne> Texte;
13
Exemple d’une description IDL
interface fenetre{
readonly attribute Dimensions dimension,
attribute Couleur fond;
void ecrire (in Texte texte);
Texte lire ( );
void ligneContenant(inout Texte unMotif);
};
interface boutton{
attribute Couleur fond;
attribute Texte text;
};
};
13 L’utilisation de typedef est obligatoire pour les tableaux et les
séquences en paramètre d’une opération
Mapping
Correspondance IDL
avec Java
13
Image d’un module IDL en Java
14
Exemple
Fichier IDL :
module Graphique {
interface boutton {
attribute Couleur fond;
attribute Texte text;
};
};
14
Exemple
package Graphique;
public interface boutton extends org.omg.CORBA.Object
{
// deux méthodes pour chaque attribut(une seule pour les readonly)
public Couleur fond( );
public void fond(Couleur value);
public String[ ] texte ( );
public void texte(String [ ] value);
}
14
Images des types simples et des
constantes
14
Exemple: structures (1/2)
Fichier IDL
module valeursIDL
{ struct voiture
{
Marque marque;
Couleur couleur;
string matricule;
};
};
14
Exemple: structures (2/2)
module valeursIDL {
typedef string tableau[20];
interface Nom {
attribute string Nom;
void setNom(in tableau t, in long indice);
};
typedef Nom matrice[10] [10];
};
14
Exemple: les tableaux (2/2)
15
Les interfaces: opérations et attributs
15
Le passage des paramètres en Java
15
Exemple (1/2)
Module IDL:
module Exemple {
interface Modes{
long operation (in long inArg , out long outArg,
inout long inoutArg);
};
};
15
Exemple (2/2)
15
Exemple de l’image d’une interface
(1/2)
Fichier IDL:
typedef string ligne;
typedef sequence<ligne> Texte;
interface fenetre{
readonly attribute Dimensions dimension;
attribute Couleur fond;
void ecrire (in Texte text);
Texte lire ( );
void ligneContenant (inout Texte motif);
};
15
Exemple de l’image d’une interface
(2/2)
15
Les exceptions utilisateur
15
Exemple: les exceptions (1/2)
Fichier IDL:
module Hello {
exception ilDort {
string laRaison;
short depuis_quand;
};
};
15
Exemple: les exceptions (2/2)
Correspondance Java:
package Hello;
final public class ilDort extends org.omg.CORBA.UserException
{
public String laRaison;
public short depuis_quand;
public ilDort ( ) { };
public ilDort(String raison, short depuis)
{
laRaison =raison;
depuis_quand=depuis;
}
15 }
Création et connexion des objets
au bus
16
Implémentation par héritage (1/2)
interface A{
void operationA ( );
};
La classe d’implémentation prend le suffixe Impl
– Elle hérite de la classe POA générée par le
compilateur IDL
– Elle implémente les opérations de l’interface
16
Implémentation par héritage (2/2)
16
Création des objets CORBA
16
Connexion directe des objets au bus
CORBA
16
Connexion via une manufacture
d’objets
16
Implémentations correspondantes
16
Localisation des Objets en corba
16
Fichiers partagés
Objet
CLIENT A
SERVEUR
2- le code du client
org.omg.CORBA.ORB orb=…//obtenir 1 référence sur l’ORB
java.io.BufferedReader in = new java.io.BufferedReader(new
java.io.FileReader("objetA.ref")
String ref=in.readLine( )
org.omg.CORBA.Objet obj=orb.string_to_object(ref);
17 ObjetA a=ObjetAHelper.narrow(obj);
Utilisation du Web
Objet
CLIENT A
SERVEUR
2- récupérer une référence
1- enregistrer l’IOR transformée en
sur l’objet à partir de son
string de l’objet A dans
IOR enregistrée sous forme
~guennoun/public_html/fichierA
de string dans
www.EHTP/~guennoun/
fichierA
ObjetA.ref
17 Serveur WEB
Exemple
1- le code du serveur
org.omg.CORBA.ORB orb= ... //obtenir 1 référence sur l’ORB
ObjetA impl=new ObjetA_impl( );
String ref=orb.objet_to_string(impl);
java.io.PrintWriter out = new java.io.PrintWriter(
new java.io.FileOutputStream(/home/…/"ObjetA.ref"));
out.println(ref);
2- le code du client
import java.net.*;
import java.io.*;
String location="http://www.ehtp.ma/~guennoun/ObjetA.ref"
org.omg.CORBA.ORB orb=…//obtenir 1 référence sur l’ORB
URL url=new URL(location);
URLConnection conn=url.openConnection( );
BufferedReader in = new BufferedReader(new
inputStreamReader(conn.getInputStream( ));
String ref=in.readLine( )
org.omg.CORBA.Objet obj=orb.string_to_object(ref);
17 ObjetA a=ObjetAHelper.narrow(obj);
Service de nommage
Objet
CLIENT A
SERVEUR
Naming Service
17
Objectifs
Maintient des associations de type nom/objet (name
binding)
Une association est toujours définie relativement à un
contexte (naming context)
Différents noms peuvent être associés au même objet,
sous le même ou sous différents contextes
Associer (bind) un nom = créer une association de type
nom/objet dans un contexte donné
Résoudre (resolve) un nom = déterminer l’objet associé
dans un contexte donné
Un objet peut être un objet CORBA applicatif ou un
contexte de nommage qui est aussi un objet CORBA
17
Caractéristiques de la spécification
OMG
Fédération de services
envisagée
Porté de nommage
– Associer des contextes à des
noms sous d’autres contextes c2 o1
c1
conduit à un arbre de nommage
– Les cycles sont autorisés
Opérations spécifiées c1.
o.V1 o.V2
1
– Association, dissociation,
recherche et énumération
17 – Le renommage n’est pas spécifié
Le module CosNaming (1/2)
Spécifie les types pour construire les noms utilisés par
le service
– NameComponent comme une structure
– Name comme une séquence de NameComponent
Spécifie l’interface NamingContext avec les
opérations suivantes
– Pour les objets applicatifs de type Object
void bind/rebind (in Name n,in Object obj)
Association d’un nom et un objet obj
– Pour les objet contexte de type NamingContext
void bind_context/rebind_context (in Name,in NamingContext nc)
17 Association d’un nom et d’un contexte
Le module CosNaming (2/2)
Pour les deux types d’objets
– object resolve(in Name n)
Recherche d’objet par son nom
– void unbind(in Name n)
Libération d’un nom; i.e. le dissocier d’un objet
Création d’un contexte
– NamingContext new_context( )
Crée un nouveau context sur le même serveur que le contexte
appelant
– NamingContext bind_new_context (in Name n)
Crée un nouveau contexte et l’associe au nom n
Destruction d’un contexte
– void destroy( )
17
Les noms: définitions et exemples
LeNom[1]=new NameComponent( );
LeNom[1].id="o1" ; LeNom[0].kind="obj ";
17
Exemple d’utilisation côté serveur
//obtenir l’IOR du serveur de nom
java.io.BufferedReader in = new java.io.BufferedReader(new
java.io.FileReader("NamingService.ref")); Initial_context
String ior=in.readLine();
NamingContext context_initial= NamingContextHelper.narrow(orb.string_to_object(ior));
//création du context c2
NameComponent[ ] LeNom = new NameComponent[1];
LeNom[0]=new NameComponent( );
LeNom[0].id="c2" ; LeNom[0].kind="cont"; nc2
NamingContext nc2=context_initial.new_context( );
Context_initial.bind_context(LeNom,nc2);
//création d’un objet CORBA de type A
A objectA=new A_impl( ) ;
//création d’un binding o1/obj avec objetA
o1
NameComponent[ ] NomA=new NameComponent[1];
NomA[0]=new NameComponent( );
NomA[0].id="o1" ; NomA[0].kind="obj";
nc2.bind(NomA,objetA);
18
Exemple d’utilisation côté client
Ctx ->bind(<c1;c2;…;cn>,obj) ≡
Ctx ->resolve(<c1;c2;…;cn-1>)->bind(<cn>,obj)
Ctx ->bind_context(<c1;c2;…;cn>,nc) ≡
Ctx ->resolve(<c1;c2;…;cn-1>)->bind_context(<cn>,nc)
Ctx ->resolve(<c1;c2;…;cn> ≡
Ctx ->resolve(<c1;c2;…;cn-1>)->resolve(<cn>)
Ctx ->unbind(<c1;c2;…;cn>) ≡
Ctx ->resolve(<c1;c2;…;cn-1>)->unbind(<cn>)
Ctx ->bind_new_context(<c1;c2;…;cn>) ≡
18 Ctx ->resolve(<c1;c2;…;cn-1>)->bind_new_context(<cn>
Enumération des associations (1/2)
18
Enumération des associations (2/2)
Définitions de types
– enum BindingType (nobject,ncontext)
– struct Binding{
Name binding_name;
BindingType binding_type}
– typedef sequence<Binding> BindingList;
interface BindingIterator
– interface BindingIterator{
boolean next_one(out Binding b);
boolean next_n(in unsigned long nb, out BindingList bl);
void destroy( );
};
18
Etapes de développement
18
Etapes d’implémentation
Définition de l’IDL
– interface A {string hello( );}
Compilation de l’IDL: génère 5 classes/interfaces
java:
– 2 utilisée par le broker
A.java, StubForA.java
– 3 utilisée par le programmeur
AHolder.java, AHelper.java, _AImplBase.java
Implémentation de l’interface A:
import org.omg.CORBA.*;
public class A_impl extends _AImplBase {
18 public String hello ( ){ //code }
Création du client et du serveur
189