Vous êtes sur la page 1sur 46

Middleware CORBA

M.Youssfi

Applications distribues

Machine 1 Application1

TCP/IP ou UDP

Machine 2 Application2

Middlewares:
RMI CORBA EJB Web Services

Architectures Distribues
SGBD

Entreprise 1

Entreprise 2

SGBD

Serveur dapplication Couche DAO Couche mtier Couche web Couche Service MiddleWares:
- RMI - CORBA - EJB - Web Services HTTP

Serveur dapplication Couche DAO Couche mtier Couche Service MiddleWares :


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

Couche web

TCP/IP UDP

Client HTTP

Architecture dun Middleware


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

InterfaceObjetDistant
mthode1() mthode2()

InterfaceObjetDistant
mthode1() mthode2()

implements

od:ObjetDistant

RMI CORBA
STUB

Varibales mthode1() mthode2() SKELETON

EJB WS TCP/IP TCP/IP


Invocation De Mthodes

RMI

CORBA

EJB

WS

Naming Service
Nom de lobjet distant Rcuprer Rf de lobjet Sachant le nom OD1 OD2 Rfrence de lobjet distant Rf1 Rf2 4

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 STUB Java

Objet C++ SKELETON C++

ORB Java PC/NT

ORB C++ Sparc/UNIX

NT PC
Protocole IIOP

UNIX Sparc
6

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
Servant A Skeleton A Servant B Skeleton B

Client STUB A

Adaptateur d'objets (POA)

Adaptateur d'objets (POA)

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

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.

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

Rponse de la mthode Client


Rf du servant

Skeleton ORB

Appel de mthode ORB Protocole IIOP Nom de lobjet Rfrence de lobjet

Stub

Naming Service
Context Rf Servant Nom1 Nom2
10

Dmarche suivre pour dvelopper un projet CORBA

Conception :

UML (Cas dutilisation et diagramme de classes) 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


11

IDL : Interface Definition Language

12

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 };
13

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.


14

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

15

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.


16

Un exemple de description IDL

L'exemple suivant dcrit un objet qui offre une interface appele Premier .

Cette interface comporte

une opration dnomme paramtre par le client ).

affiche qui entrane l'affichage

d'un message sur le serveur ( message pass en tant que

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); };

17

Dclarer une structure


module corbaBanque { struct Compte { long code; float solde; }; typedef sequence<Compte> tabComptes; interface IBanqueRemote{ double conversion(in double mt); Compte getCompte(in long code); tabComptes getComptes(); }; };

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 Java boolean boolean octet byte short ushort short long ulong int long long ulong long long

IDL Java

float float

double double

long double

char char

wchar char

IDL Java

string string

wstring string
21

Implantation de lobjet distant (Servant)

org.omg.PortableServer.Servant

API de CORBA Gnr

PremierPOA

PremierOperations

partir de l'IDL

Implantation de l'objet

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. Donner les cotations dune socit donne Donner la cotation moyenne dune socit donne ;

Le servant corba doit offrir les services quivant :


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
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.setValAction(rs.getDouble("VAL_ACTION")); cotations.add(cot); } } catch (Exception e) { e.printStackTrace();} return(cotations); } }

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

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

Application Oriente objet

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