Académique Documents
Professionnel Documents
Culture Documents
RMI et CORBA
Le menu
La technologie RMI Exemples (dmo) TP RMI Un middleware un peu plus costaud (CORBA) et multi-langages TP CORBA
RMI technologie SUN pour la mise en uvre dobjets distribus Le but de RMI est de permettre l'appel, l'excution et le renvoi du rsultat d'une mthode excute dans une machine virtuelle diffrente de celle de l'objet l'appelant Sappuie sur le stub (ct client) et le skeleton (ct serveur) pour implmenter la communication distante Package: java.rmi
Partie Serveur:
Cre des objets distants Cre des rfrences sur ces objets pour les rendre accessibles Attends les requtes des clients: appels distants sur des mthodes sur ces objets Obtient une ou plusieurs rfrences sur des objets distants localiss sur un ou plusieurs serveurs Effectue des appels distants sur les mthodes des objets
Partie Client:
Comme nimporte quelle application Java, une application distribue RMI est constitue dinterfaces et de classes
Les interfaces dclarent des mthodes Les classes implmentent ces mthodes et dautres mthodes additionnelles
Les objets possdant des mthodes pouvant tre appeles travers plusieurs JVMs sont appels objets distants.
Ils implmentent une interface distante (remote interface) possdant les caractristiques suivantes:
RMI traite un objet distant de manire diffrente par rapport un objet local
Au lieu de crer une copie de lobjet sur lautre JVM (ct client), RMI utilise un stub pour chaque objet distant:
Le stub joue le rle dun reprsentant local (ou proxy) pour lobjet distant Le client invoque la mthode sur le stub local Le stub transporte lappel de mthode vers lobjet distant
Le stub dun objet distant implmente la mme interface distante que lobjet distant
Permet de caster toutes les mthodes Seules les mthodes dclares dans linterface peuvent tre invoques distance
Design et implmentation des composants de lapplication distribues Compilation des sources Connexion des classes sur le rseau Dmarrage de lapplication
Design et implmentation
Quels composants sont locaux et lesquels sont distants Dfinir les interfaces distantes pour les composants distants
Spcifient les mthodes invocables distance par les clients (types des paramtres et type de retour)
Doivent implmenter une ou plusieurs interfaces distantes Peuvent implmenter dautres interfaces et mthodes qui ne peuvent tre appeles que localement
Les clients qui utilisent les objets distants peuvent tre implments nimporte quel moments aprs la dfinition des
Compiler les codes sources (serveurs , clients, les classes dimplmentation) javac Compiler linterface rmic
Gnration du stub
10
11
Lancement de lapplication
Excution:
Du client
12
Rcapitulation
Ct serveur:
Dfinition de linterface daccs distant Implmentation de la classe de lobjet distant Implmentation du serveur qui cre lobjet distant et lenregistre sur le registre de nommage RMI (RMI registry) Lobtention dune rfrence sur lobjet distant travers le registre de nommage RMI La ralisation des appels de mthodes distantes en utilisant cette rfrence
13
Exemple simple
14
Hello: implmente lobjet HelloInt: linterface de lobjet distant Serveur: la partie serveur de lapplication Client: la partie client de lapplication
15
Linterface
package hello; import java.rmi.*; public interface HelloInt extends Remote { public void SayIt() throws RemoteException; }
16
Doit hriter de linterface java.rmi.Remote Publie les mthodes accessibles par appels distants Dans un fichier HelloInt.java:
Limplmentation
Implmente le code de lobjet distant Implmente toutes les mthodes dclares dans linterface Hrite de la classe UnicastRemoteObject Toutes les mthodes y compris le constructeur lvent lexception RemoteException
17
La classe Hello.java
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"); } }
18
Le serveur
import java.rmi.*; import java.rmi.registry.*; import hello.*; public class Serveur{ public static void main(String[] args) throws Exception { // cration de lobjet Hello h = new Hello();
19
Cre lobjet distant Lenregistre sur le serveur de nommage RMI Dans un fichier Serveur.java
Le serveur
20
Introduire le reste du code du serveur: System.out.println("Je vais enregistrer mon objet"); Naming.rebind("rmi://localhost:1099/hello",h); System.out.println("Cest fait!"); }}
Le client
Utiliser la mthode statique lookup de la classe naming Retourne le stub en faisant une recherche sur le nom de lobjet rfrenc dans le registre de nommage Retourne lexception NotBoundException si la recherche choue
21
Le code du client
import hello.*; import java.rmi.*; public class Client{ public static void main(String[] args) { try { Remote remote_h = Naming.lookup("rmi://localhost:1099/hello"); if (remote_h instanceof HelloInt) { ((HelloInt) remote_h).SayIt(); } } catch (Exception e) { } }}
22
Structuration de lapplication
23
Gnration du stub
Excution
Lancement du serveur
Lancement du client
24
A vous de jouer!
Afficher un message de retour chez le client En considrant plusieurs clients et plusieurs Serveurs:
En crant un autre objet Bonjour, et un autre ServeurBis, construire une architecture en squence o le client appelle Serveur qui appelle ServeurBis
ServeurBis Client
Bonjour Hello
Serveur
25
26
Points Abords
27
Le middleware Concepts gnraux de CORBA Lapplication Hello Le langage IDL Mapping IDL et Java Cration et connexion des objets au BUS Localisation des objets en CORBA tapes de dveloppement
Le middleware
Motivation et objectifs
28
Le middleware
Li larchitecture 3-tier Le terme middleware est une combinaison de middle (du milieu) et software (logiciel) En franais, plusieurs terminologies
29
Motivations
Comment rendre l'criture d'applications distribues "aussi simple" que celle des applications centralises ? Quel cadre fournir pour permettre l'intgration aussi bien de nouveaux services que d'applications existantes ?
30
Objectifs
Dvelopper une architecture unifie base sur les technologies objet pour l'intgration d'applications rparties. Afin d'offrir un environnement logiciel pour supporter :
La rutilisabilit et la portabilit des composants logiciels. L'htrognit et l'interoprabilit entre les diffrents
31
Difficults
Htrognit multi-formes
32
Fonctions du middleware
Fournir une interface ou API (Application Programming Interface) de haut niveau aux applications Masquer lhtrognit des systmes matriels et logiciels sous-jacents Rendre la rpartition aussi invisible (transparente) que possible Fournir des services rpartis dusage courant
33
Classification
Les clients font des appels des procdures qui sexcutent sur des systmes distants. Approche publisher/subscriber par change de messages entre le client et le serveur Ce type de middleware permet de faire des appels de mthodes sur des objets distants Middleware entre lapplication et les serveurs de base de donnes
34
Norme CORBA ( Common Object Request Broker Architecture ) cre par lOMG en 1992 Consortium fond en 1989 (Sun, H.P., ...), bas aux Etats-Unis : plus de 700 membres:
Constructeurs (Sun, HP, IBM ...) Environnements systmes (Microsoft, Novell ...) Outils et langages (Iona, Object Design, Borland ...) Produits et BD (Lotus, Oracle, Informix, O2 ...) Industriels (Boeing, Alcatel, Thomson ...)
35
36
Un langage de description d'interfaces (IDL) fortement typ. Des "projections" de l'IDL vers les langages d'implantation /programmation (C/C++/java ...).
37
Environnements htrognes (langages, OS,machines ...). Protocole gnrique d'interoprabilit entre ORBs diffrents :
38
Orient procdural
SERVEUR
CLIENT Invoquer f
Data
39
Orient Objet
SERVEUR CLIENT
Objet Y f()
Objet X f()
40
Fonctionnement
41
1: Invocation dune mthode 3: transport de linvocation 5: Invocation de lobjet rel 7: Emballage du rsultat 9: Dballage du rsultat
2: Emballage des arguments 4: dballage des arguments 6: Retour de linvocation locale 8: Transport du rsultat 10: Retour de linvocation distante
(2)
(4)
(9) (3)
(7)
(6)
42
(8) Rseau
Stub & Skeleton: souches client et serveur BOA (Basic Object Adapter).
Identifie le servant Passe la requte au skeleton associ Transporte les requtes vers le BOA Initialise lORB et le BOA Cre le servant par instantiation de limplmentation de lobjet
43
Architecture CORBA
SERVEUR CLIENT
Servant
Client IDL Stubs Serveur IDL Skeleton Basic Object Adapter
44
Un IOR identifie un objet unique sur le bus par un code bas sur 3 informations principales:
Nom de la machine hte (Hostname): La machine sur laquelle sexcute le serveur. Il est choisi par le BOA. Il concide avec le nom associ ladresse IP Le numro de port (port number): un numro attribu par le BOA, chaque excution du serveur. Il concide avec le numro de port TCP La cl de lobjet (Object Key): pour chaque objet cr par le serveur, le BOA lui attribue une cl unique
45
chaque relance du serveur, les rfrences des IOR publies peuvent devenir invalides
Serveur
Client
Interface Repository
ORB Interface
Implementati on Repository
46
ORB
SII: Code Java (ou C++) du stub. Gnr par le compilateur IDL IR: Interface Repository: Objet CORBA dont linterface permet dobtenir des informations sur les IDL des objets du bus
Client
Interface Repository
ORB Interface
47
Implementati on Repository
DII: permet aux clients dinvoquer des oprations dont ils construisent la requte dynamiquement en obtenant des informations depuis le rfrentiel dinterface (IR).
Aussi gnre par le compilateur IDL Interface gnrique mais plus complexe utiliser quune SII.
Client
Interface Repository
ORB Interface
48
Implementati on Repository
API partiellement spcifie par lOMG Elle permet lexcution des requtes transmises par lORB
49
Interface Repositor y
ORB Interface
DSI:
permet au serveur de traiter des requtes doprations sans disposer lavance des squelettes de dballage Sert raliser des interprteurs CORBA et des passerelles entre ORBs Non spcifi par lOMG Contient les informations stockes par le BOA concernant les objets servants Client
Dynamic Invocation Interface
Static Static Static Invocation Invocation Invocation Interface Interface Interface
Implementation Repository:
50
Interface Repositor y
ORB Interface
Interface ORB: Une API qui fournit les primitives de base pour:
On lutilise gnralement du ct serveur pour publier une "stringified" IOR Utilise gnralement ct client pour associer le stub de lobjet servant
51
IDL ------------------------------------
(1)
Compilateur IDL->Java
Code Serveur
Java ------------------------------------
(4)
Java ------------------------------------
(2)
SII (stub) SSI (skeleton)
Java ------------------------------------
(3)
Compilateur Java
Compilateur Java
52
CLIENT
SERVEUR
(1)
Compilateur IDL->C++
Code Serveur
C++ ------------------------------------
(4)
Java ------------------------------------
(2)
SII (stub) SSI (skeleton)
C++ ------------------------------------
(3)
Compilateur Java
Compilateur C++
53
CLIENT
SERVEUR
Lapplication Hello
54
Linterface de IDL
Simple, non?
55
_HelloImplBase.java
56
Hello.java HelloHolder.java
Compilation de lIDL
Hello.idl
HelloHelper.java
StubForHello.java
Fichier Hello_impl.java
package hello; import org.omg.CORBA.*; public class Hello_impl extends _HelloImplBase { public void hello ( ) { System.out.println( "Hello World!" ); } }
57
Trs important: le mme langage doit tre utilis pour implanter le servant et le serveur Dans un fichier Serveur.java:
package hello; import org.omg.CORBA.*; import java.io.*; public class Serveur { public static void main (String args[ ]) { try { // Crer ORB et BOA ORB orb = ORB.init(args, new java.util.Properties( ) ); BOA boa = orb.BOA_init(args, new java.util.Properties ( ) );
58
59
60
package hello; import org.omg.CORBA.*; import java.io.*; public class Client { try { // crer lORB ORB orb = ORB.init(args, new java.util.Properties ( ) ); // rcuprer lIOR du servant String ref= args[0]; // crer une rfrence sur lobjet CORBA associ lIOR org.omg.CORBA.Object obj = orb.string_to_object(ref); if (obj==null) throw new Runtime Exception ( );
// Lier le Stub Client lobjet CORBA Hello hello = HelloHelper.narrow(obj); if(hello == null) throw new RuntimeException( ); // maintenant, nous pouvons utiliser lobjet java Hello comme // sil tait local
61
Le langage de description
62
IDL = Interface Definition Language Objectif: Dfinir les interfaces indpendamment des applications IDL est un langage dclaratif: ressemble beaucoup la partie dclarative de C++ IDL est indpendant de tout langage de programmation LOMG dfinit des correspondances entre lIDL et de nombreux langages de programmation
63
Linterface
Comme une classe C++ ou Java mais dfinit uniquement linterface dun objet sans informations sur sa prsentation en mmoire et sans informations sur limplmentation de ses mthodes Comme une mthode
Les oprations
Pas de surcharge doprations Le nom des paramtres sont spcifier in || out || inout
Les attributs
64
Comme un attribut dune classe C++ ou Java Il peut tre modifiable ou non (dans le dernier cas : readonly)
Structuration en IDL
Module
Dclarations: alias de type types complexes exceptions
Interface
Dclarations: alias de types types complexes, exceptions Dclarations: oprations, attributs
Module
Dclarations: alias de type types complexes exceptions
Interface
65
Il nest pas possible dimbriquer les interfaces. Lexemple suivant est incorrect
interface A { interface B { void operationB( ); }; void operationA( ); };
66
Imbrication en IDL
67
Objets
Non-Objets
Rfrences dobjets
Simples
struct
Complexes
sequence union array
68short
long
unsigned short
unsigned long
float
double
char
string
octet
enum
any
Les constantes
module valeursIDL { const double PI = 3.14; const short s= 1; const long deux = 1+1; };
69
Les tableaux:
module valeursIDL { typedef string tableau[20]; interface Nom { attribute string nom; void setNom(in tableau t, in long }; typedef Nom matrice[10] [10]; };
indice);
70
Les numrations
module valeursIDL { enum Marque {Renault, Peugeot, Citroen, Dacia}; enum Couleur { rouge, bleu, jaune, vert, noir, blanc }; };
71
Les structures
module valeursIDL { struct voiture {
Marque marque; Couleur couleur; string matricule; }; };
72
BAD_PARAM: mauvais paramtre dune opration du bus COMM_FAILURE: chec dans la communication INV_OBJREF: Rfrence dobjet non valide NO_RESSOURCES: ressources insuffisantes pour le traitement de lopration NO_PARMISSION: droit insuffisants pour linvocation de lopration MARSHAL: erreur dans lemballage/dballage dun paramtre ou dun rsultat INTERNAL: erreur interne du bus BAD_OPERATION: opration inconnue ou non valide OBJ_NOT_EXIST: objet dtruit
73
74
75
Lutilisation de typedef est obligatoire pour les tableaux et les squences en paramtre dune opration
Mapping
76
Un module IDL est associ un module de Java ayant le mme nom Toutes les dclarations de types IDL sont associes aux dclarations correspondantes de classe ou dinterface dans le module produit Toutes les dclaration IDL non encapsules dans aucun module sont associes un package Java par dfaut.
77
Une interface publique Java avec le mme nom Une classe supplmentaire de Java avec le suffixe "Helper" ajout au nom de linterface
Fournit une mthode statique "narrow" qui permet org.omg.CORBA dtre transform vers une rfrence dobjet dun type plus spcifique Lexception BAD_PARAM est leve si la transformation choue
78
Une classe de support "Holder". Son nom est le nom de la classe Java suivi de ce suffixe
Exemple
Fichier IDL :
module Graphique { interface boutton { attribute Couleur fond; attribute Texte text; }; };
79
Exemple
package Graphique; public interface boutton extends org.omg.CORBA.Object { // deux mthodes pour chaque attribut(une seule pour les readonly) public Couleur fond( ); public void fond(Couleur value); public String[ ] texte ( ); public void texte(String [ ] value); }
80
Java
short int int long long float double boolean byte char string Java true false
C++
CORBA::Short CORBA::Long CORBA::Ulong CORBA::LongLong CORBA::ULongLong CORBA::Float CORBA::Double CORBA::Boolean CORBA::Octet CORBA::Char CORBA::String C++ CORBA::TRUE CORBA::FALSE
81
TRUE False
Les alias de types dclars par "typedef type alias" nont pas de correspondance en java
Utiliser type directement Une classe aliasHelper est gnre par le compilateur IDL
82
Les numrations en Java sont traduites par des classes qui portent le mme nom Une structure IDL est associe en Java une classe
Les tableaux IDL ont pour image les tableaux Java dimension fixe
Lexception CORBA::MARSHAL est leve en cas de dbordement lors de lutilisation de tableau Java en paramtres dune invocation
83
Fichier IDL
module valeursIDL { struct voiture { Marque marque; Couleur couleur; string matricule;
};
};
84
85
package valeurIDL; final public class voiture { public voiture( ) { } // un constructeur vide public voiture (Marque marque, Couleur couleur, String matricule) { } // dclaration des attributs : champs de la structure public Marque marque; public Couleur couleur; String matricule; }
indice);
86
87
Les oprations dune interface sont traduites par des mthodes de la classe associe Les attributs readonly dune interface sont associs une mthode, sans paramtres permettant dy accder en lecture
88
Linvocation dune opration op() se fait en Java via lappel de mthode objetJava.op()
Nom et type du paramtre IDL : Nom et type correspondant en Java Le mapping Java a prvu des classes conteneur appels Holder chaque type T est associe une classe THolder qui est utilise pour le passage en paramtre par rfrence Les classes Holder des types simples sont dfinies par dfaut Pour les autres classes dfinies par le programmeur, cest le compilateur IDL qui se charge de la gnration de code pour les classes Holder
89
Exemple (1/2)
Module IDL:
module Exemple { interface Modes{ long operation (in long inArg , out long outArg, inout long inoutArg); }; };
90
Exemple (2/2)
Le code Java gnre
package Exemple; public interface Modes{ int operation (int inArg, intHolder outArg, intHolder inoutArg); }
91
interface fenetre{ readonly attribute Dimensions dimension; attribute Couleur fond; void ecrire (in Texte text); Texte lire ( ); void ligneContenant (inout Texte motif); };
92
93
Sont associs des classes qui hritent dune classe de base des exceptions
org.omg.CORBA.UserException
94
95
96
97
Elle hrite de la classe _XImplBase gnre par le compilateur IDL Elle implmente les oprations de linterface
98
99
Se fait directement par lappel new sur la classe dimplmentation Plusieurs Servants peuvent tre crs du ct serveur et utiliss du ct client
A servant1 = new A_impl( ); // Code Java A servant2 = new A_impl( ); // autre Code Java
10 0
Connexion explicite dun objet au BOA // code Java org.omg.CORBA.ORB orb = A servant =new A_impl( ); orb.connect(servant); // obtenir la ref de lORB
Aprs cet appel, les requtes ce servant entranent la leve de lexception OBJECT_NOT_EXIST
10 1
Une manufacture est une interface qui permet de crer des objets dautre interface
permet la cration dobjets CORBA par simple appel de mthodes au lieu de le coder en dure du ct serveur
interface produit { // code idl de linterface void detruire( ); }; interface factory { produit CreerProduit( ); };
10 2
Implmentations correspondantes
10 3
Implmentations correspondantes
public class factory_impl extends _factoryImplBase { org.omg.CORBA.ORB orb_; public factory_impl (org.omg.CORBA.ORB orb) { orb_ = orb;} public produit CreerProduit( ) { produit objet =new produit_impl(orb_) orb_.connect(objet); return objet; } }
10 4
10 5
Fichiers partags
Objet A
CLIENT
SERVEUR
10 6
2- rcuprer une rfrence sur lobjet partir de son IOR enregistre sous forme de string dans le fichier "ObjetA.ref"
ObjetA.ref
Exemple
1- le code du serveur
org.omg.CORBA.ORB orb= ... //obtenir 1 rfrence sur lORB ObjetA impl=new ObjetA_impl( ); String ref=orb.objet_to_string(impl); java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileOutputStream("ObjetA.ref")); out.println(ref);
2- le code du client
10 7
org.omg.CORBA.ORB orb=//obtenir 1 rfrence sur lORB 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); ObjetA a=ObjetAHelper.narrow(obj);
Utilisation du Web
CLIENT
Objet A
SERVEUR 2- rcuprer une rfrence sur lobjet partir de son IOR enregistre sous forme de string dans www.EHTP/~guennoun/ fichierA 1- enregistrer lIOR transforme en string de lobjet A dans ~guennoun/public_html/fichierA
10 8
ObjetA.ref
Serveur WEB
Exemple
1- le code du serveur
org.omg.CORBA.ORB orb= ... //obtenir 1 rfrence sur lORB 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);
10 9
2- le code du client
import java.net.*; import java.io.*; String location="http://www.laas.fr/~guennoun/ObjetA.ref" org.omg.CORBA.ORB orb=//obtenir 1 rfrence sur lORB 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); ObjetA a=ObjetAHelper.narrow(obj);
11 0
Service de nommage
CLIENT
Objet A
SERVEUR
11 1
Naming Service
11 2
Objectifs
Maintient des associations de type nom/objet (name binding) Une association est toujours dfinies relativement un contexte (naming context) Diffrents noms peuvent tre associs au mme objet, sous le mme ou sous diffrents contextes Associer (bind) un nom = crer une association de type nom/objet dans un contexte donn Rsoudre (resolve) un nom = dterminer lobjet associ dans un contexte donn Un objet peut tre un objet CORBA applicatif ou un contexte de nommage qui est aussi un objet CORBA
11 3
Associer des contextes des noms sous dautres contextes conduit un arbre de nommage Les cycles sont autoriss
Association, dissociation, recherche et numration Le renommage nest pas spcifi
c1
c2
o1
Oprations spcifies
c1. 1
o.V1
o.V2
11 4
Spcifie les types pour construire les nom utiliss par le service
11 5
11 6
void destroy( )
11 7
11 8
11 9
12 0
Rgles dquivalence
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>) 12 Ctx ->bind_new_context(<c1;c2;;cn>) 1 Ctx ->resolve(<c1;c2;;cn-1>)->bind_new_context(<cn>
void list (in unsigned long nb, out BindingList bl, out BindingIterator bi);
12 2
Dfinitions de types
enum BindingType (nobject,ncontext) struct Binding{ Name binding_name; BindingType binding_type} typedef sequence<Binding> BindingList;
interface BindingIterator
12 3
interface BindingIterator{ boolean next_one(out Binding b); boolean next_n(in unsigned long nb, out BindingList bl); void destroy( ); };
Etapes de dveloppement
12 4
Etapes dimplmentation
Dfinition de lIDL
A.java, StubForA.java
Implmentation de linterface A:
import org.omg.CORBA.*; public class A_impl extends _AImplBase { public String hello ( ){ //code }
12 5
Ct client
1- initialisation de lORB
1- initialisation de lORB
ORB orb=ORB.init(---)
BOA boa= orb.BOA_init(---)
ORB orb=ORB.init(---)
4- Publication de sa rfrence
6- dmarrage du service
Utilisation
126
Boa.impl_is_ready(---)
Des questions ?
127