Vous êtes sur la page 1sur 46

CORBA

Common Object Request Broker Architecture

Mohamed Youssfi
Laboratoire Signaux Systmes Distribus et Intelligence Artificielle (SSDIA)
ENSET, Universit Hassan II Casablanca, Maroc
Email : med@youssfi.net
Supports de cours : http://fr.slideshare.net/mohamedyoussfi9
Chane vido : http://youtube.com/mohamedYoussfi
Recherche : http://www.researchgate.net/profile/Youssfi_Mohamed/publications
med@youssfi.net

CORBA
Common Object Request Broker Architecture

Mohamed Youssfi
Laboratoire Signaux Systmes Distribus et Intelligence Artificielle (SSDIA)
ENSET, Universit Hassan II Casablanca, Maroc
Email : med@youssfi.net
Supports de cours : http://fr.slideshare.net/mohamedyoussfi9
Chane vido : http://youtube.com/mohamedYoussfi
Recherche : http://www.researchgate.net/profile/Youssfi_Mohamed/publications
med@youssfi.net

Applications distribues

Machine 1

TCP/IP ou UDP

Machine 2
Application2

Application1

Middlewares:
RMI
CORBA
EJB
JMS
SOAP
REST
3

Architectures Distribues
Entreprise 1

SGBD

SGBD

Entreprise 2

Serveur dapplication

Serveur dapplication

Couche DAO

Couche DAO

Couche mtier

Couche mtier

Couche web

Couche Service

Couche Service

MiddleWares:

MiddleWares :

- RMI
- CORBA
- EJB
- Web Services
HTTP

Client HTTP

TCP/IP
UDP

Couche web

- RMI
- CORBA
- EJB
- Web Services
HTTP
4
Client HTTP

Architecture dun Middleware


Serveur (RMI/CORBA/EJB/WS)
Client Distant
InterfaceObjetDistant
Appel dune mthode distante
mthode1()
mthode2()

InterfaceObjetDistant

implements

mthode1()
mthode2()

od:ObjetDistant
Varibales
mthode1()
mthode2()

RMI
CORBA
STUB

EJB

SKELETON

WS
TCP/IP
TCP/IP

RMI

CORBA

EJB

WS

Invocation
De Mthodes

Naming Service
Nom de lobjet distant
Rcuprer
Rf de lobjet
Sachant le nom

OD1
OD2

Rfrence de lobjet distant


Rf1
Rf2

Qu'est ce que C.O.R.B.A. ?


CORBA ( Common Object Request Broker
Architecture )
Cest un Middleware qui permet de crer des
applications rparties multi langages et
multiplteforme.

Intervention des amorces


C.O.R.B.A.
Client Java

Objet C++

STUB Java

SKELETON C++

ORB Java
PC/NT

ORB C++
Sparc/UNIX

NT

UNIX

PC

Sparc
Protocole IIOP
7

Langage IDL
Le langage OMG-IDL (Interface Definition Language) permet dexprimer,
sous la forme de contrats IDL [Geib 97], la coopration entre les
fournisseurs et les utilisateurs de services, en sparant linterface de
limplmentation des objets
Un contrat IDL spcifie les types manipuls par un ensemble dapplications
rparties,
Le contrat IDL isole ainsi les clients et fournisseurs de linfrastructure
logicielle et matrielle les mettant en relation travers le bus CORBA.

L'adaptateur d'objets (POA)


Serveur

Client
STUB A

Servant A

Servant B

Skeleton A

Skeleton B

Adaptateur
d'objets (POA)

Adaptateur
d'objets (POA)

POA Manager
Le bus C.O.R.B.A. ( O.R.B. )
9

L'adaptateur d'objets
Diffrents types dadaptateurs sont envisageables :
BOA ou Basic Object Adapter : les structures daccueil sont
matrialises par des processus systmes.
POA ou Portable Object Adapter : limplantation des objets est
ralise par des objets fournis par un langage de programmation.
OODA ou Object-Oriented Database Adapter : la structure daccueil
est une base de donnes oriente objet.
LOA ou Library Object Adapter : le code dimplantation des objets est
stock dans des bibliothques charges dans lespace des applications
clientes.
COA ou Card Object Adapter : limplantation des objets est stocke
dans une carte microprocesseur. Cet adaptateur a t expriment
conjointement par le LIFL et la socit Gemplus.

10

L'annuaire C.O.R.B.A.
Serveur
Servant

Rponse de la mthode

Client

Appel de mthode

Rf du
servant

ORB
Stub

Skeleton
ORB

Protocole IIOP
Nom de lobjet

Naming Service
Context

Rfrence de lobjet

Rf
Servant
Nom1

Nom2
11

Dmarche suivre pour dvelopper un projet


CORBA
Conception :
UML (Cas dutilisation et diagramme de classes, Squence)
Maquettes de lapplication

Fichier IDL (indpendant du langage)


Compilation IDL
Gnration des STUBS et SKELETONS
Gnration des interfaces des objets distants
Gnration des classes du modle.

Implmentation de lobjet distant (Servant)


Cration du serveur
Cration du client
Dploiement et lancement
Lancer le Naming Service
Lancer le serveur
Lancer le Client

12

IDL : Interface Definition Language

13

Premires rgles sur l'IDL


Une interface est une numration d'oprations et de
dfinitions de types de donnes.
interface Exemple
{
// contenu de l'interface
};

Une interface supporte l'hritage multiple.


interface AutreExemple : Exemple1, Exemple2
{
// contenu de l'interface
};

14

Dcrire une opration


Les oprations dcrites dans une interface respectent le
format suivant :
type_de_retour nom_de_l'operation ( liste_des_paramtres ) ;

C.O.R.B.A. offre plusieurs types de donnes :


- les types de bases
- les types complexes

La liste des paramtres peut


tre vide.
15

Les types de bases


Les types de bases de CORBA sont :
boolean
octet
short ( ushort )
long ( ulong )
long long ( ulonglong )
float
double
long double
char
wchar
string
wstring

16

Les paramtres d'une opration


La description d'un paramtre comporte trois parties :
le modificateur
le type de l'argument ( type de base ou type complexe )
le nom de l'argument

Le modificateur spcifie le sens d'change du paramtre :


in : du client vers l'objet CORBA
out : en retour, de l'objet CORBA le client
inout : quivalent un passage par adresse.
17

Un exemple de description IDL


L'exemple suivant dcrit un objet qui offre une interface appele Premier .
Cette interface comporte
une opration dnomme

affiche qui entrane l'affichage d'un message

sur le serveur ( message pass en tant que paramtre par le client ).


Une mthode produit qui retourne le produit de deux nombres a et b.

interface Premier
{
void affiche ( in string message ) ;
double produit (in double a, in double b);
};

18

Compilation d'une description IDL


La description doit tre compile afin de gnrer les amorces
(
souche et squelette ) requises pour l'tablissement de la communication
inter-processus.
Exemple de compilation IDL :

idlj fall v Premier.idl


A l'issu de la compilation, plusieurs fichier sont crs :
PremierOperations.java : il s'agit des oprations de l'interface
Premier.java : il s'agit de l'interface
PremierPOA.java : il s'agit du squelette,
_PremierStub.java : il s'agit de la souche,
19

Concept de mapping
Une description IDL est traduite vers un langage de programmation.
Les rgles de traduction sont appeles mapping et font partie de
la spcification CORBA.
Grce au mapping, deux fournisseurs d'ORBs offriront le mme
modle de programmation.

portabilit des applications

20

Correspondance des types de bases


IDL

boolean

octet

short
ushort

long
ulong

long long
ulong long

Java

boolean

byte

short

int

long

IDL

float

double

Java

float

double

IDL

string

wstring

Java

string

string

long double

char

wchar

char

char

21

Implantation de lobjet distant (Servant)

org.omg.PortableServer.Servant

PremierPOA

Implantation
de l'objet

API de CORBA

PremierOperations

Gnr
partir de l'IDL

A dvelopper par le programmeur

22

Exemple dune application


Supposons que lon souhaite crer une
application client serveur qui permet de
grer des comptes bancaires, en utilisant
le middleware CORBA.
Dans cette partie, le serveur cre un
objet distant qui reprsente un compte
qui est dfini par son code et son solde et
permet un client distant faire des
versements, des retraits et des
consultations de ce compte.
23

1 Conception :
Diagramme de classes

24

2- Fichier IDL
module corbaBank{
struct Compte{
long code;
float solde;
};
typedef Compte cpte;
interface Banque{
void verser(in float mt);
void retirer(in float mt);
cpte getCompte();
};
};

25

2-Fichier IDL:
Ce fichier dclare les lments suivants :
Un module nomm corbaBanque (reprsente un
package dans java).
Une structure Compte qui dclare les variables
dun compte savoir le code de type long
(quivalent de int en java) et le solde de type float.
Linterface de lobjet distant nomm Banque qui
dclare des mthodes abstraites :
verser : qui possde un paramtre mt de type
float en entre
retirer : qui possde un paramtre mt de type
float en entre
getCompte() : qui retourne lobjet Compte.
26

3- Compilation IDL
Cette tape consiste utiliser un utilitaire fourni par LORB
Cette opration consiste gnrer le code
des STUBS (Souche)
des SKELETONS (Squelette)
Interface du servant
Classes reprsentant chaque structure du modle
Et dautres codes utilises par le serveur et le client
Dans java, ces fichiers sont gnrs partir du fichier IDL en
utilisant lutilitaire IDLJ fourni avec le kit de dveloppement java.
Pour faire cette opration, il faut se placer dans le rpertoire de
votre projet sur ligne de commandes et excuter la commande
suivante. idlj fall v Banque.idl

27

3- Compilation IDL

BanqueOperations.java : Interface qui dclare les


mthodes abstraites.
Banque.java : Interface de lobjet distant (Hrite de
BanqueOperations)
BanquePOA : Squelette (Skeleton)
_BanqueStub.java : Souche (STUB)
BanqueHelper.java : Utilis par le client.
BanqueHolder.java : Utilis par le serveur.
Compte.java : Classe qui reprsente le compte ;
28

4 Implmentation du Servant
Limplmentation dun objet CORBA distant est une
classe qui hrite du squelette et qui redfini toutes les
mthodes abstraites de linterface.
Dans notre cas, cette classe sera nomme ImplBanque.
Elle hrite du squelette BanquePOA
Cette classe dfini
une variable qui reprsente un objet de la classe Compte ,
un constructeur qui crer un compte
les trois mthodes dclars dans linterface savoir : verser,
retirer et getCompte.

Le code java de cette implmentation est le suivant :

29

4 Implmentation du Servant
package implOD;
import corbaBank.BanquePOA;
import corbaBank.Compte;
public class BanqueImpl extends BanquePOA {
private Compte compte;
public BanqueImpl () {
compte=new Compte(1,0);
}
public Compte getCompte() {
return compte;
}
public void retirer(float mt) {
compte.solde-=mt;
}
public void verser(float mt) {
compte.solde+=mt;
}
}
30

Serveur Corba, en utilisant JNDI


import javax.naming.InitialContext;import javax.naming.Context;
import org.omg.CORBA.*; import org.omg.PortableServer.*;
import servants.BanqueImpl;
public class ServeurCorba {
public static void main(String[] args) {
try {
ORB orb=ORB.init(args,null);
Context ctx=new InitialContext();
//ctx.addToEnvironment("java.naming.corba.orb", orb);
POA poa=POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
BanqueImpl od=new BanqueImpl();
ctx.rebind("BK", poa.servant_to_reference(od));
orb.run();
} catch (Exception e) {
e.printStackTrace();
}
}}

Fichier jndi.properties :
java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
java.naming.provider.url=iiop://localhost:900

Client Corba, en utilisant JNDI


import javax.naming.Context;import javax.naming.InitialContext;
import corba.IBanque;import corba.IBanqueHelper;
public class ClientCORBA {
public static void main(String[] args){
try {
Context ctx=new InitialContext();
java.lang.Object o=ctx.lookup("BK");
IBanque stub=IBanqueHelper.narrow((org.omg.CORBA.Object)o);
stub.verser(7000);
}
catch (Exception e) {
e.printStackTrace();
}
}
}

Fichier jndi.properties :
java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
java.naming.provider.url=iiop://localhost:900

5 Cration du serveur java

import org.omg.CORBA.ORB; import org.omg.CosNaming.*;


import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
public class ServeurCorba {
public static void main(String[] args) {
try {
// Initialiser l'ORB
ORB orb=ORB.init(args,null);
// Crer le POA Manager
POA rootPOA= POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
// Activer le POA Manager
rootPOA.the_POAManager().activate();
// Crer l'objet qui offre le service distant

BanqueImpl od=new BanqueImpl ();

33

5 Cration du serveur java


// Crer un contexte de noms
NamingContext root=NamingContextHelper.narrow
(orb.resolve_initial_references("NameService"));
//Crer un tableau de noms qui seront attribus l'objet
NameComponent[] nsNom=new NameComponent[1];
// Dfinir un nom publique de l'objet distant
nsNom[0]=new NameComponent("MaBanque","");
//Enregistrer la rfrence de l'objet distant dans le Naming
//Service
root.rebind(nsNom,rootPOA.servant_to_reference(od));
// Dmarrer le serveur
orb.run();
} catch (Exception e) {
e.printStackTrace();
}
}}

34

6 Projet Du Client
Avant de crer la classe du client, il faut tout dabord copier dans le
projet du client les fichiers ncessaires au fonctionnement dun
client CORBA. Ces fichiers sont principalement
le STUB
linterface de lobjet distant
la classe Compte.

Tous ces fichiers se trouvent dans le dossier corbaBank gnr par


lutilitaire IDLJ. Copier donc le dossier corbaBank du projet du
Serveur dans le projet du Client.

35

6 Projet Du Client
import org.omg.CORBA.ORB; import org.omg.CORBA.Object;
import org.omg.CosNaming.*; import corbaBank.*;
public class ClientCorba {
public static void main(String[] args) {
try{
// Initialiser l'ORB
ORB orb=ORB.init(args,null);
// Crer le contexte de Naming Service
NamingContext root=NamingContextHelper.narrow
(orb.resolve_initial_references("NameService"));
// Crer un tableau de noms
NameComponent[] nsNom=new NameComponent[1];
// Initialiser le nom de l'objet Distant
nsNom[0]=new NameComponent("MaBanque","");
// Rcuprer la rfrence de l'objet distant partier du Naming Service Object
remoteRef=root.resolve(nsNom);
// Crer le reprsentant local de l'objet distant
Banque b=BanqueHelper.narrow(remoteRef);
// Invocation des mthodes distantes.
b.verser(4000); b.retirer(2000); b.verser(1000);Compte cpte=b.getCompte();
System.out.println("Code="+cpte.code+"Solde="+cpte.solde);
}catch (Exception e) {
e.printStackTrace();}}}
36

Serveur Corba, en utilisant JNDI


import javax.naming.InitialContext;import javax.naming.Context;
import org.omg.CORBA.*; import org.omg.PortableServer.*;
import servants.BanqueImpl;
public class ServeurCorba {
public static void main(String[] args) {
try {
ORB orb=ORB.init(args,null);
Context ctx=new InitialContext();
//ctx.addToEnvironment("java.naming.corba.orb", orb);
POA
poa=POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
BanqueImpl od=new BanqueImpl();
ctx.rebind("BK", poa.servant_to_reference(od));
orb.run();
} catch (Exception e) {
e.printStackTrace();
}
}}

Fichier jndi.properties :
java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
java.naming.provider.url=iiop://localhost:900

Client Corba, en utilisant JNDI

import javax.naming.Context;
import javax.naming.InitialContext;
import corba.IBanque;import corba.IBanqueHelper;
public class ClientCORBA {
public static void main(String[] args){
try {
Context ctx=new InitialContext();
java.lang.Object o=ctx.lookup("BK");
Banque stub=BanqueHelper.narrow((org.omg.CORBA.Object)o);
System.out.println(stub.test("test"));
}
catch (Exception e) {
e.printStackTrace();
}
}
}

Fichier jndi.properties :
java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory
java.naming.provider.url=iiop://localhost:900

7- Lancement
1- Lancer le NamingService :
Se placer dans le dossier du projet du serveur :
Excuter la commande : tnameserv

1- Lancer le Serveur :
Se placer dans le dossier du projet du serveur :
Excuter la commande : java ServeurCorba

39

7- Lancement
3 - Lancer le Client :
Se placer dans le dossier du projet du client :
Excuter la commande : java ClientCorba

40

Application rpartie CORBA (Bourse)


Une socit de bourse dispose dune base de donnes MySQL
Nomme DB_BOURSE. Cette base de donnes stocke les
cotations boursires de quelques socits. Ces donnes son
stockes dans une table nomme COTATIONS dans la
structure est la suivante :

41

Application rpartie Corba


On souhaite crer une application distribue qui se compose de :
Un Servant qui permet de fournir dautres clients les informations sur les
cotations dune socit donnes. Ce servant lui-mme fait appel aux
diffrentes classes de la couche mtier qui sont lies la base de donnes.
Le servant Corba ainsi que la couche mtier sont dploys dans un serveur
administr par la bourse des cotations. Ce serveur contient galement le
naming service.
La couche mtier se compose de :
La classe Persistante Cotation.java
La classe MetierBourse qui contient deux mthodes :
Une mthode qui permet de retourner une liste dobjets cotation dune socit donne en
faisant le mapping objet relationnel.

Une application Test.java pour tester cette mthode.

Le servant corba doit offrir les services quivant :


Donner les cotations dune socit donne
Donner la cotation moyenne dune socit donne ;

Une application Graphique SWIG Java qui sera dploye chez des banques
et qui permet de :
Saisir le code de la socit
Afficher les cotations ou la cotation moyenne de la socit saisie.
42

Architecture 1

43

Classe Persistante Cotation.java


package metier;
import java.io.Serializable;
import java.util.Date;
public class Cotation implements Serializable {
private long numCotation;
private String codeSociete;
private Date dateCotation;
private double valAction;
public Cotation() {
}
public String toString(){
return("Num="+numCotation+" Date="+dateCotation+
" Socit= "+codeSociete +" Val Action=" +valAction);
}
// Getters
// Setters
}

44

Couche Mtier : Mapping objet relationnel


cots
:Cotation
numCot = 1
dateCot=
valAction=
codeSoc=SGMB

:Cotation
numCot = 2
dateCot=
valAction=
codeSoc=SGMB

:Cotation
numCot = 3
dateCot=
valAction=
codeSoc=SGMB

Application Oriente objet

public List<Cotation> getCotations(String codeSoc){


List<Cotation> cotations=new ArrayList<Cotation>();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn=DriverManager.getConnection
("jdbc:mysql://localhost:3306/bourse_ws","root","");
PreparedStatement ps=conn.prepareStatement
("select * from cotations where CODE_SOCIETE=?");
ps.setString(1, codeSoc);
ResultSet rs=ps.executeQuery();
while(rs.next()){
Cotation cot=new Cotation();
cot.setNumCotation(rs.getLong("NUM_COTATION"));
cot.setDateCotation(rs.getDate("DATE_COTATION"));
cot.setCodeSociete(rs.getString("CODE_SOCIETE"));
cot.setValAction(rs.getDouble("VAL_ACTION"));
cotations.add(cot);
}
} catch (Exception e) { e.printStackTrace();}
return(cotations);
}
}

Base de donnes relationnelle

45

Travail demand
Mettre en place la base de donnes
Mettre en place et tester la couche mtier
La classe Cotation.java
La classe MetierBourse
La classe TestMetier

Crer le ficher IDL


Faire la compilation IDL
Crer le servant
Crer le serveur Corba
Crer le client
Dployer et Tester votre projet

46