Construction d Applications Réparties avec CORBA



Documents pareils
Intergiciels pour la répartition CORBA : Common Object Request Broker. Patrice Torguet torguet@irit.fr Université Paul Sabatier

Programmation répartie: Objet distribué. CORBA (Common Object Request Broker Architectur)

Introduction à CORBA

Composants Logiciels. Le modèle de composant de CORBA. Plan

Remote Method Invocation (RMI)

NFP111 Systèmes et Applications Réparties

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

CORBA. (Common Object Request Broker Architecture) Denivaldo LOPES

Java RMI. Arnaud Labourel Courriel: Université de Provence. 8 mars 2011

Dis papa, c est quoi un bus logiciel réparti?

CORBA. (Common Request Broker Architecture)

Programmation Par Objets

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Objets et Programmation. origine des langages orientés-objet

Auto-évaluation Programmation en Java

Programmer en JAVA. par Tama

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Remote Method Invocation en Java (RMI)

as Architecture des Systèmes d Information

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Java Licence Professionnelle CISII,

Package Java.util Classe générique

RMI le langage Java XII-1 JMF

Gestion distribuée (par sockets) de banque en Java

[APPLICATON REPARTIE DE VENTE AUX ENCHERES]

Plan du cours. Historique du langage Nouveautés de Java 7

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Langage et Concepts de Programmation Objet. 1 Attributs et Méthodes d instance ou de classe. Travaux Dirigés no2

Java Naming and Directory Interface

Remote Method Invocation Les classes implémentant Serializable

Cours 1: Java et les objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction à CORBA

Calcul Parallèle. Cours 5 - JAVA RMI

Programmation réseau avec Java. 3/7 RMI, un peu de sécurité et CORBA

Intergiciel - concepts de base

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

INITIATION AU LANGAGE JAVA

Langage Java. Classe de première SI

TP1 : Initiation à Java et Eclipse

Projet de programmation (IK3) : TP n 1 Correction

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Programmation Objet Java Correction

Java c est quoi? Java pourquoi?

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Patrons de Conception (Design Patterns)

PROGRAMMATION PAR OBJETS

Un ordonnanceur stupide

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Chapitre VI- La validation de la composition.

Projet gestion d'objets dupliqués

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Meta Object Facility. Plan

Programmation en Java IUT GEII (MC-II1) 1

Synchro et Threads Java TM

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Chapitre 10. Les interfaces Comparable et Comparator 1

Threads. Threads. USTL routier 1

CORBA haute performance

Alfstore workflow framework Spécification technique

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Java DataBaseConnectivity

Programmation par les Objets en Java

Corrigé des exercices sur les références

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Création d une application JEE

Environnements de développement (intégrés)

Initiation à JAVA et à la programmation objet.

OS Réseaux et Programmation Système - C5

OpenPaaS Le réseau social d'entreprise

Architecture Orientée Service, JSON et API REST

Programmation client-serveur sockets - RPC

Programmation répartie RPC & RMI

Classe Interne, Anonyme & Enumération

COMPARAISONDESLANGAGESC, C++, JAVA ET

Langage à objets : JAVA (1)

ALGORITHMIQUE ET PROGRAMMATION ORIENTEE OBJET

Premiers Pas en Programmation Objet : les Classes et les Objets

Conception de serveurs d'applications ouverts

Une introduction à Java

Introduction aux «Services Web»

TD3: tableaux avancées, première classe et chaînes

Héritage presque multiple en Java (1/2)

Java Licence Professionnelle CISII,

TD/TP PAC - Programmation n 3

Polycopié Cours Programmation Orientée Objet sous Java Programme : Filière SMI S5

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Java 1.5 : principales nouveautés

Flux de données Lecture/Ecriture Fichiers

Généralités sur le Langage Java et éléments syntaxiques.

Java - RMI Remote Method Invocation. Java - RMI

Transcription:

Construction d Applications Réparties avec CORBA Serge Midonnet (serge.midonnet@univ-paris-est.fr) Février 2013

Outline Outline Introduction et Modèle Corba Objectifs du cours Objectifs Corba Domaines d application Architecture OMA Développement Composants d une application Les étapes de développement Description des interfaces: le langage IDL(1) Développement du Servant Développement du Serveur Développement du Client Structure du langage les sequences Exceptions les paramètres out Implantation par délégation: le servant Implantation par délégation: le serveur Le service de nommage architecture du service de nommage Graphe de noms Interfaces Interface NamingContext(1) Serveur NS Client NS Liste et Itérateur de liaison Lancements le type Any Any: manipulation Serge Midonnet TypeCode (serge.midonnet@univ-paris-est.fr) et TcKind Construction manipulation d Applications des TypeCodes Réparties avec CORBA

Objectifs du cours 1. Introduction au modèle client serveur CORBA. 2. Description des composants de l application: Client, Servant, Serveur 3. Langage IDL en détail 4. Programmation d une application 5. Localisation des objets (Service de nommage).

Objectifs Corba Common Object Request Brocker Architecture (CORBA) spécification de l OMG (Object Management Group). Fournir un environnement de développement et d exécution d applications réparties portable: Indépendance vis à vis des langages de programmation (IDL). Indépendance vis à vis des protocoles de communication (GIOP).

Domaines d application Les domaines d applications de CORBA: Applications Militaires (Awacs) & Aéronautique (Eurocontrol) 1 Télécommunications et transmissions de données Equipements Mobiles [Prismtech::eORB] Transports Controle de Processus industriel Robotique 1: http://www.ois.com/markets/vert-7-5.asp Les implantations principales: Libres: Jacorb; OpenORB; Orbacus, TAO, MICO. OpenFusion [Prismtech], eorb [Prismtech], Orbix[Iona], Visibroker[Borland], ORBexpress [OIS],

Architecture OMA Des interfaces spécifiées interfaces d objets distants: services communs; utilitaires communs; interfaces métiers; applications interfaces de pseudo objets (internes): [POA] et extensions [RT-CORBA, MinimumCORBA]

Composants d une application composants corba du serveur [orb][poa][skeleton][servant] composants corba du client [orb][stub] Certains composants sont développés (Servant), certain sont générés par le compilateur IDL (Skeleton, Stub) d autres proviennent de l api corba (Orb, Poa...)

Les étapes de développement Le développement d une application Corba nécessite d effectuer les étapes suivantes: Etape 1: Spécifier l interface IDL du servant Compiler le fichier d interface X.idl pour la génération des classes utils au développement de l application Etape 2: Développer le Servant XImpl.java en s aidant de le traduction IDLversJava XOperations.java Etape 3: Développer le Serveur Xserver.java Etape 4: Développer le Client Xclient.java jdk: idlj -fall X.idl jacorb: java -classpath /usr/local/apps/jacorb/lib/idl.jar: /usr/local/apps/jacorb/lib/logkit-1.2.jar org.jacorb.idl.parser X.idl generated: XOperations.java, XPOA.java, XStub.java, XHelper.java, XHolder.java. Exécution du Client et du Serveur java -Djava.endorsed.dirs=/usr/local/apps/Jacorb/lib -Djacorb.home=/usr/local/apps/Jacorb -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton -classpath. %1

Description des interfaces: le langage IDL(1) Etape 1: Spécification de l interface du servant. Le langage IDL est un langage neutre. Corba propose un mapping vers Ada, Java, C++, Smalltalk, C, Python. Premier pas avec IDL: module (->package), struct (classe), interface (->classe), attribut (->méthode), opération (->méthode). module td2_basic { struct Message { string title; string author; string date; string body; ; interface Forum { readonly attribute string theme; readonly attribute string moderator; boolean postmessage(in Message m); Message getmessage(in string title); boolean removemessage(in string title); ; ;

Développement du Servant Etape 2: La classe servant XImpl va hériter de la classe XPOA (skeleton de X) générée par le compilateur. package td2_basic; public class ForumImpl extends ForumPOA { ForumImpl(String theme, String moderator) { code du constructeur public String theme() { code de l accesseur theme public String moderator() { code de l accesseur moderateur public boolean postmessage(message m) { code de l opération postmessage public Message getmessage(string title) { code de l opération getmessage public boolean removemessage(string title) { code de l opération removemessage

Développement du Serveur Etape 3: Développement du serveur: (1) intilalisation de l orb, (2)Obtenir référence du RootPOA, (3) instancier le servant, (4) activer le servant (5) obtenir la référence du servant (6) publier la référence du servant, (7) activer le POA, (8) attendre des requítes. (1) ORB orb = ORB.init(args, null); (2) POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); (3) ForumImpl forum = new ForumImpl("rtsj","damien"); (4) byte[] servantid = rootpoa.activate_object(forum); (5) String reference = orb.object_to_string(rootpoa.id_to_reference(servantid)); (6) PrintWriter file = new PrintWriter("ObjectRef"); file.println(reference); file.close(); (7) rootpoa.the_poamanager().activate(); (8) orb.run();

Développement du Client Etape 4: Développement du client: (1) intilalisation de l orb, (2) Obtenir la référence du servant corba distant (org.omg.corba.object) (3) Instancier un stub (proxy) de l objet distant (XHelper.narrow), (4) utiliser le proxy pour effectuer des invocations distantes. (1) ORB orb = ORB.init(args, null); (2) BufferedReader filereader = new BufferedReader(new FileReader("ObjectRef")); String stringior = filereader.readline(); filereader.close(); (3) org.omg.corba.object reference = orb.string_to_object(stringior); (4) Forum forumproxy = ForumHelper.narrow(reference); (5) Message m = new Message("CORBA","moi","10/01/2008","Corba c est bien"); forumproxy.postmessage(m); Message tmp = forumproxy.getmessage("corba"); System.out.println("Titre : " + tmp.title); System.out.println("Auteur : " + tmp.author); System.out.println("Message : " + tmp.body); Serge Midonnet (serge.midonnet@univ-paris-est.fr)

Structure du langage module td1 interface INTERFACE NAME définitions: de types utilisateur (typedef, struct), d exceptions, d attributs. opérations: oneway nom de méthode ( attribut directionnel (in out inout) paramêtre ) exceptiona, exceptionb

les sequences Dans l IDL: typedef sequence <Message> MessageSet; MessageSet messagelist(); Dans le servant: private ConcurrentHashMap<String,Message> messages = new ConcurrentHashMap<String,Message>();... public Message[] messagelist() { return messages.values().toarray(new Message[messages.size()]);...

Exceptions Dans l IDL: exception Reject { string message; ; Dans le Servant: public void postmessage(message m) throws Reject { Message minmap = messages.putifabsent(m.title,m); if (minmap!= null) { throw new Reject("PostMessage : message with title "+ m.title + " already exists!"); Dans le Client: try { Message m = new Message("CORBA", "moi", (new Date()).toString(), "Corba c est bien!"); forumproxy.postmessage(m); catch (Reject r) { System.err.println(r.message);

les paramètres out Dans l IDL: void getinfo(out string theme, out string moderator, out long size); Dans le servant: public void getinfo(stringholder theme, StringHolder moderator, IntHolder size theme.value = this.theme; moderator.value = this.moderator; size.value = messages.size(); Dans le client: StringHolder themeholder = new StringHolder(); StringHolder moderatorholder = new StringHolder(); IntHolder sizeholder = new IntHolder(); forumproxy.getinfo(themeholder,moderatorholder,sizeholder); System.out.println("Theme : " + themeholder.value); System.out.println("Modérateur : " + moderatorholder.value); System.out.println("Nombre de messages : " + sizeholder.value);

Implantation par délégation: le servant interface Forum { readonly attribute string theme; readonly attribute string moderator; boolean postmessage(in Message m); Message getmessage(in string title); boolean removemessage(in string title); ; interface ForumAdmin { attribute string theme; attribute string moderator; public class ForumImpl implements ForumOperations, ForumAdminOperations { String theme (); String moderator (); boolean postmessage (Message m); Message getmessage (String title); boolean removemessage (String title); void theme (String newtheme); void moderator (String newmoderator);

Implantation par délégation: le serveur ORB orb = ORB.init(args, null); POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); ForumImpl f1 = new ForumImpl ("rtsj","damien"); Forum ftie = new ForumPOATie (f1); ForumAdmin fatie = new ForumAdminPOATie (f1); byte[] servantid1 = rootpoa.activate_object(ftie); byte[] servantid2 = rootpoa.activate_object(fatie); NamingContextExt context = NamingContextExtHelper. narrow ( orb. resolve_initial NameComponent [] name1 = context. to_name (" Forum"); NameComponent [] name2 = context. to_name (" ForumAdmin"); context.rebind (name1, rootpoa. id_to_reference( servantid1)); context.rebind (name2, rootpoa. id_to_reference( servantid2));

architecture du service de nommage Le Service de nommage est composé de conteneurs (NamingContext) et d objets associant noms et références des Servants. Les objets NamingContext sont des objets Corba.

Graphe de noms Les NamingContext peuvent etre organisés an arbre de nommage. Un nom sera composé: tableau d éléments "nom.type" et d un séparateur "/". Exemple: forum.nc/reseaux.nc/protocoles.nc/atm.service

Interfaces Module CosNaming /Interfaces NamingContext et NamingContextExt module CosNaming { typedef string Istring; struct NameComponent { Istring id; Istring kind; typedef sequence<namecomponent> Name;... Interface NamingContextExt : NamingContext { typedef string StringName; StringName to_string (in Name n) raises (InvalidName); Name to_name(in StringName sn) raises (InvalidName); Object resolve_str (in StringName n);

Interface NamingContext(1) ajouter une liaison de type liaison d objet Void bind ( in Name n, in Object obj) raises (NotFound, CannotProceed, InvalidName, AlreadyBound); pour modifier une liaison deja existante : rebind (in Name n, in Object obj): pour modifier une liaison d objet supprimer une liaison de l arbre : unbind (in Name n) Retouver un objet dans l arbre : résolution de désignation Object resolve (in Name n) Créer un nouveau context de désignation bind_new_context() Modifier une liaison de contexte de désignation rebind_context() : pour modifier une liaison de contexte supprimer un contexte de désignation destroy()

Serveur NS import org.omg.cosnaming.*; import org.omg.cosnaming.namingcontextpackage.*;... public class ForumServer { public static void main(string args[]) throws org.omg.cosnaming.namingcontextp org.omg.cosnaming.namingcontextpackage.notfound, org.omg.cosnaming.namingcontextpackage.cannotproceed {... NamingContextExt namingcontext = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService")); org.omg.corba.object forumref = rootpoa.id_to_reference(forumservantid); NameComponent[] name = namingcontext.to_name("forum"); try { namingcontext.bind(name,forumref); catch (AlreadyBound e) { System.err.println("Nom : " + name + " déjà utilisé" ); namingcontext.rebind(name,forumref);

Client NS import org.omg.cosnaming.*; import org.omg.cosnaming.namingcontextpackage.*;... public class ForumClient { public static void main(string[] args) throws org.omg.cosnaming.namingcontextp org.omg.cosnaming.namingcontextpackage.notfound, org.omg.cosnaming.namingcontextpackage.cannotproceed { try { ORB orb = ORB.init(args, null); NamingContextExt namingcontext = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService")); NameComponent[] name = namingcontext.to_name("forum"); Forum forumproxy = ForumHelper.narrow(namingContext.resolve(name));

Liste et Itérateur de liaison void list (in unsigned long how_many, out BindingList bl, out BindingIterator bl on récupëre un itérateur de liaisons via l opération list de NaminContext interface BindingIterator { boolean next_one(out Binding b); boolean next_n (in unsigned long how_many, out BindingList bl); void destroy(); une liste de binding de type BindingList est décrite par : struct Binding { Name binding_name; BindingType binding_type; typedef sequence<binding> BindingList;

Lancements Lancement du serveur de nommage [JacORB] java -Djava.endorsed.dirs=/usr/local/apps/JacORB/lib -Djacorb.home=/usr/local/apps/JacORB -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton -Djacorb.naming.ior_filename=NSREF -classpath. org.jacorb.naming.nameserver Lancement du serveur de nommage [JDK] orbd - ORBInitialPort 1234 Lancement Client/Serveur [JacORB] java -Djava.endorsed.dirs=/usr/local/apps/JacORB/lib -Djacorb.home=/usr/local/apps/JacORB -Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB -Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton -classpath. %1 -ORBInitRef NameService=file:///d:/serge/dev/corba/NSREF Lancement Client/Serveur [JDK] java Client -ORBInitialPort 1234 -ORBInitialHost host java Server -ORBInitialPort 1234 -ORBInitialHost host

le type Any Dans le cas de l application Forum: plusieurs types de structures Message struct MessageAudio{ string titre; string auteur; struct MessageVideo{ string titre; string auteur; Vous modifierez le prototype des opérations postermessage et liremessage: Interface Forum{ boolean postmessage(in any m, in string titre) ; any getmessage(in string titre)

Any: manipulation Création d un any : create_any de la classe ORB org.omg.corba.orb.any a = orb.create_any(); pour insérer un type primitif : la classe org.omg.corba.any possède un ensemble de méthodes insert_xxx (xxx = un type primitif (insert_long, insert_string ) pour insérer un type utilisateur (struct, interface) : la classe Helper associée possède une méthode insert extraire un type primitif : méthode extract_xxx de la classe org.omg.corba.any extraire un type utilisateur : méthode extract de la classe Helper

TypeCode et TcKind Comment connaitre le contenu d un Any Si un client envoie un paramètre de type Any comment savoir quelle méthode d extraction utiliser (elle dépend du type contenu). Tout type IDL est associé à un TypeCode (c est aussi un type IDL). Un élément de type TypeCode contient un élément TcKind. Tous les types IDL possèdent un TcKind. TcKind est une énumération : enum TcKind {tk_null, tk_void, tk_short, tk_long

manipulation des TypeCodes Comment générer un TypeCode associé à un type IDL pour un type primitif : méthode get_primitive_tc() de la classe ORB. pour un type utilisateur : méthode type() de la classe Helper exemple : obtenir le typecode du type float: org.omg.corba.typecode tc = orb.get_primitive_tc ( org.omg.corba.tckind.tk_float ex : typecode de la structure C : tc = Chelper.type () ;

création d un typecode pour un type primitif : méthode get_primitive_tc() de la classe ORB. pour un type utilisateur : méthode type() de la classe Helper exemple : obtenir le typecode du type float: org.omg.corba.typecode tc = orb.get_primitive_tc ( org.omg.corba.tckind.tk_float ex : typecode de la structure C : tc = Chelper.type () ;

Exemple/1 MessageAudio m1 = new MessageAudio("Nouveau MP3","John","10/10/03","song.mp3"); MessageVideo m2 = new MessageVideo("Nouvelle vidéo","john","15:37","video.avi"); On crée deux objets de type Any : org.omg.corba.any any_envoye1 = orb.create_any(); org.omg.corba.any any_envoye2 = orb.create_any(); On affecte les Messages dans les any: MessageHelper.insert(any_envoye1,m1); MessageHelper.insert(any_envoye2,m2); On poste les deux messages : f1.postermessage(any_envoye1,"nouvel album 1"); f1.postermessage(any_envoye2,"nouvel album 2");

Exemple/2 Récupération des deux messages org.omg.corba.any any_recu1 = f1.liremessage("nouvel album 1"); org.omg.corba.any any_recu2 = f1.liremessage("nouvel album 2"); On regarde le type du premier message et on l extrait en fonction de ce dernier : org.omg.corba.typecode tc1 = any_recu1.type(); switch(tc1.kind().value()) { case org.omg.corba.tckind._tk_struct : if(tc1.equal(messageaudiohelper.type())) { System.out.println("Le message est de type MessageAudio"); MessageAudio mess = MessageAudioHelper.extract(any_recu1); else if(tc1.equal(messagevideohelper.type())) { System.out.println("Le message est de type Message2"); MessageVideo mess = MessageVideoHelper.extract(any_recu1);

Types d intercepteurs Fonctionalités: lire les paramètres des requêtes (mais pas modifier) détourner l appel vers un autre destinataire (exception ForwardRequest) ajouter/récupérer des informations aux requêtes (service_context) ajouter/récupérer des informations aux IOR (tag_component) Trois types d intercepteurs: Client, Serveur, IOR. 5 Points d interception pour un intercepteur Client: send_request (sending request) send_poll (sending request) receive_reply (receiving reply) receive_exception (receiving reply) receive_other (receiving reply) 5 points d interception pour un intercepteur Serveur: receive_request_service_contexts (receiving request) receive_request (receiving request) send_reply (sending reply) send_exception (sending reply) send_other (sending reply) Un point d interception pour un intercepteur d IOR: establish_component appelé lors de la création d une nouvelle référence d objet. L enregistrement des intercepteurs est fait via l interface ORBInitializer.

ORBInitializer Appelé lors de l initialisation de l ORB (orb.init()). Permet de créer les intercepteurs public class MyInterceptorORBInitializer extends LocalObject implements ORBInitializer { public static Interceptor interceptor; public String name() { return ""; public void pre_init(orbinitinfo info) { try { ClientInter inter = new ClientInter(); info.add_client_request_interceptor(inter); catch (Exception ex) { public void post_init(orbinitinfo info) { On ajoute la propriété suivante dans le serveur: Properties props = new Properties(); props.put("org.omg.portableinterceptor.orbinitializerclass.monorbinitializer","" ORB orb = ORB.init(args, props);

Intercepteur Client(exemple) public class ClientInter extends org.omg.corba.localobject implements ClientRequestInterceptor { public ClientInter(){ public String name(){ return "moninterceptor"; public void destroy(){ public void send_request(clientrequestinfo ri) throws org.omg.portableintercepto { System.out.println( "operation invoquée: " + ri.operation() ); public void send_poll(clientrequestinfo ri){ System.out.println("clientssend_poll"); public void receive_reply(clientrequestinfo ri){ System.out.println("receive_replyC"); public void receive_exception(clientrequestinfo ri){ System.out.println("receive_exceptionC"); public void receive_other(clientrequestinfo ri){ System.out.println("receive_otherC");

Intercepteur Client(exemple) Créer Le Type Service Contexte byte[] context_data Données associées au service context int context_id service contextid Pour ajouter le Service Contexte à l objet ClientRequestInfo public void add_request_service_context (ServiceContext service_context, boolean replace)

Intercepteur Client(exemple) public class MonClientRequestInterceptor extends org.omg.corba.localobject implements ClientRequestInterceptor { static int reqcount = 0; public void send_request(clientrequestinfo ri) throws ForwardRequest { // On ajoute l information dans le ServiceContext n.199 qui // nous indique le numero de l appel fait par la methode send_request System.out.println("********INTERCEPTOR*********"); System.out.println("la requete est : "+ ri.operation()); System.out.println("****************************"); reqcount++; byte[] data = new byte[1]; data[0] = new Integer(reqCount).byteValue(); ServiceContext sc = new ServiceContext(199, data); ri.add_request_service_context(sc, false);

Intercepteur Serveur(exemple) import org.omg.portableinterceptor.*; public class monorbinitializer extends org.omg.corba.localobject implements org.omg.portableinterceptor.orbinitializer { public void pre_init(orbinitinfo info){ System.out.println("preinit"); public void post_init(orbinitinfo info){ System.out.println("postinit"); try { //création des intercepteurs ServerInter inters = new ServerInter(); IORInter interi = new IORInter(); //enregistrement info.add_server_request_interceptor(inters); info.add_ior_interceptor(interi);...

Intercepteur Serveur(méthodes) public void receive_request_service_contexts(serverrequestinfo ri) { public void receive_request(serverrequestinfo ri) { public void send_reply(serverrequestinfo ri) { public void send_exception(serverrequestinfo ri) { public void send_other(serverrequestinfo ri) {

Le canal/1 Le service d événements CORBA permet une communication de type producteur / consommateur avec une transparence entre producteurs et consommateurs (découplage). Le producteur ne connait ni la référence ni le nombre de consommateurs. Le canal est un object dont le comportement vis-a-vis des entités producteur et consommateur est configurable. Le canal peut se comporter comme un client vis à vis du producteur il va alors extraire les données du producteur en appelant une méthode pull de l interface du Supplier. On parle dans ce cas de modèle Pull/Supplier. Le canal peut se comporter comme un serveur vis à vis du producteur il recoit alors les données transmises par le Supplier. On parle dans ce cas de modèle Push/Supplier. La spécification du service Event Chanel porte sur la définition des interfaces pull et push pour le producteur et pour le consommateur. Le canal est typé ou non typé. Si le canal est non typé les données transmises doivent être obligatoirement de type ANY. Les données transmises le sont par l intermédiaire des paramètres des opérations pull() et push(). Un mécanisme est prévu pour les transmissions typées, c est toujours le même type de données qui transitera dans le canal.

Le canal/2 import org.jacorb.events.*; import org.omg.coseventchanneladmin.*; import org.omg.cosnaming.*; org.omg.corba.orb orb = org.omg.corba.orb.init(argv, null); POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references("nameservice")); EventChannelImpl channel = new EventChannelImpl(orb,poa); poa.the_poamanager().activate(); byte[] channel_id = poa.activate_object(channel); org.omg.corba.object o = poa.id_to_reference(channel_id); nc.bind(nc.to_name("eventchannel"), o); orb.run();

Push Supplier/1 Obtention de la référence d un objet d administration et de la référence d un objet proxy. SupplierAdmin supplieradmin = cnl.for_suppliers(); PoxyPushConsumer ppcons = supplieradmin.obtain_push_consumer(); Initialisation et activation (enregistrement auprès du POA) de l objet producteur (servant). PushSupplier supplier = new PushSupplier(orb, consumer); byte[] supplierid = rootpoa.activate_object(supplier); Connection du producteur au canal (transmission de la référence du producteur au canal pour les appels callback. ppcons.connect_push_supplier (rootpoa.id_to_reference(supplierid))); production public void run () { org.omg.corba.any any = orb.create_any(); any.insert_string("abc"); consumer.push(any);

Push Supplier/2 Construction de la classe producteur (PushSupplier) public void disconnect_push_supplier () { System.out.println ("Supplier disconnected");

Pull Supplier/1 demande d un proxy vers l event channel le supplier demande un proxy du consumer en mode pull à l admin du channel SupplierAdmin supplieradmin = e.for_suppliers(); ProxyPullConsumer proxypullconsumer = supplieradmin.obtain_pull_consumer(); création de l objet (servant) supplier PullSupplierPOATie pt = new PullSupplierPOATie( new PullSupplier()); org.omg.corba.object o = poa.servant_to_reference( pt ); enregistrement du supplier au canal proxypullconsumer.connect_pull_supplier( PullSupplierHelper.narrow(o) );

Pull Supplier/2 Création de la classe PullSupplier: class PullSupplier implements PullSupplierOperations public Any pull() throws Disconnected { System.out.println("I m being pulled."); event = org.omg.corba.orb.init().create_any(); event.insert_string("pull."); return event; public void disconnect_pull_supplier() { System.out.println("Bye.");

Pull Consumer/1 NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService" ecs = EventChannelHelper.narrow(nc.resolve(nc.to_name("eventchannel.example"))); pullconsumer = new ForumPullConsumer(); ca = ecs.for_consumers(); pps = ca.obtain_pull_supplier(); pps.connect_pull_consumer(pullconsumer);

Pull Consumer/2 int i=0; while( i<10 ) { System.out.println("pulling event " + i); org.omg.corba.booleanholder bh = new org.omg.corba.booleanholder(); try{ received = pps.try_pull(bh); // received = pps.pull(); if( bh.value ){ System.out.println("received " + (i++) + " : " + received.extract_string() ); else{ Thread.currentThread().sleep(2000); pps.disconnect_pull_supplier();