Corba avec Java et C++ 2004 Jean­Marc Vanel Transiciel ­ Sogeti 1 1 Contenu et déroulement ➨Plan ➨Partie 1: survol vision Corba mise en oeuvre de Corba liaison et transport dans Corba services «communs» Annexe ­ exemple : HelloWorld ➨Partie 2 Service de nommage (désignation) Premier programme CORBA en C++ Etude du type « Any » Les mécanismes dynamiques de C.O.R.B.A. Synthèse sur C.O.R.B.A. 2 2 Vision de Corba 3 3 OMG : concepts­clés ➨Permettre l’interopérabilité des composants / applications par l’intermédiaire d’un mode de coopération unifié : l’appel d’objets distants ➨Gérer l’hétérogénéité des réseaux, machines, systèmes et langages ➨Vision utilisateur = langage pivot commun : OMG­IDL ➨Offrir une architecture globale 4 4 OMG : les objectifs techniques ➨Liaison avec tous les langages ➨Transparence des invocations ➨Invocation statique et dynamique ➨Système auto­descriptif ➨Activation automatique 5 ➨Interopérabilité entre bus 5 OMG : vision globale ➨ Common Object Request Broker Architecture CORBA appel de méthode réparti transparent passages de paramètres : in, out, in/out types de paramètres : types de base (entiers, string, etc), références d’objets, objets par valeur un bus à objets répartis (ORB) transport des requêtes, activation des objets des services de base (CORBAservices) des utilitaires communs (CORBAfacilities) des interfaces de domaines = objets métiers 6 « interopérabilité sémantique » 6 OMA : l’architecture globale Ident do e rm f aaic ne es Obj e t s a ppl i c a t i f s Sa nt é Spé c i f i que s Té lé co ms Ut i l i t a i r e s c o mmuns Fi na nc e Ad mi ni st ra ti on Wo rk fl ow Da ta Wa re IH M Bus d’o bj e t s r é pa r t i s Nommage Ve nde ur Li ce nc es Sé c ur i t é Re l at i onsCol l e c t i ons Te mps Cyc l e de vi e I nt e r r ogat i ons Tr an sa ct io ns Pr op ri ét és Pe rs is ta nc e Ev en ts Ext e r nal i s at i on Ch an ge me nt s Conc ur r e nc e Se r v i c e s o bj e t c o mmuns 7 7 OMG : le modèle client/serveur objet Référ ence d’objet Interface d’objet Code d’implantation Re quê t e Obj e t CORBA Ac t i v at i on Et at ORB 8 8 Mise en oeuvre de Corba 9 9 OMG­IDL : le langage d’interfaces ➨Rôle du langage décrire les interfaces des objets langage pivot entre applications générer des squelettes de programme dans les langages de programmation des applications 10 10 OMG­IDL : mise en oeuvre des interfaces ➨Projection des descriptions OMG­IDL vers les langages d’implantation des clients et des serveurs (e.g., C, C++, Java, etc). mode « statique » ➨Instanciation sous forme d’objets CORBA des descriptions OMG­IDL depuis un référentiel d’interfaces. mode « dynamique » 11 11 CORBA : les composantes du bus Interface du bus Interface d’invocation statique Ada pt a t e ur d’o bj e t I nt e r f a c e de s que l e t t e s s t a t i qu I nt e r f a c e de s que l e t t e s dy na mi q Interface d’invocation dynamique SSI SI I DI I ORB DSI OA Bus de c o mmuni c a t i o n IR Ré f é r e nt i e l de s i nt e r f ac e s I mpl R Ré f é r e nt i e l de s i mpl ant at i ons 12 12 Liaison et transport dans Corba 13 13 Les couches de transport de CORBA ➨GIOP : protocole d’interopérabilité entre bus de la norme CORBA 2 support à l’appel de méthode (enveloppe = REQUEST, REPLY, etc) encodage des données : CDR GIOP sur Internet = Internet Inter ORB Protocol (IIOP) champs « service context » (ex: standardisation ctxt transactions, sécurité) 14 14 Nommage dans Corba ➨ Noms du domaine Corba Interoperable Object Reference : IOR identification protocole interface OMG­IDL ➨ Sous­domaine Corba/Internet adresse IP + port 15 15 Mise en place d’une liaison Invocation Servant applicatif Interface applicative (issue de l’interface IDL) IOR servant Talon client (IOR) Emballeur GIOP Adaptateur d’objet Squelette serveur Emballeur GIOP Liaison IIOP 16 16 Services «communs» 17 17 Les services communs (1) ➨Services de localisation d’objets service de nommage (Naming) pour retrouver un objet par un nom service de type « pages blanches » service de courtage (Trader) pour retrouver un objet par des propriétés service de type « pages jaunes » 18 18 Les services communs (2) ➨Services de communications asynchrones Events, Notification, Messaging ➨Services de sûreté de fonctionnement Security, Transactions, Concurrence ➨Services concernant la vie des objets Life Cycle, Property, Relationship, Externalization, Persistent Object, Query, Collection, Versionning, Time, Licencing 19 19 Exemple : « Hello World » en Java 20 20 Chaine de production de programme Hello.idl Compilateur OMG-IDL / Java _HelloStub.java HelloClient.java Client HelloPOA.java HelloPOATie.jav a HelloOperations.jav a Hello.java HelloHelper.java HelloHolder.java HelloImpl.java HelloServeur.java Serveur 21 21 De l’IDL à Java ➨ Interface OMG­IDL Hello <Hello.idl> interface Hello { void doHello(); }; ➨ Interfaces Java HelloOperations, Hello <Hello.java> public interface HelloOperations { public void doHello(); } public interface Hello extends HelloOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity {} ➨Classes Java HelloHelper, HelloHolder 22 22 Implantation du serveur Corba <HelloServeur.java> 23 public class HelloServeur { public static void main(String args[]) { // Initialisation du Bus Corba et d’un POA org.omg.CORBA.ORB orb = ORB.init(args, null); org.omg.PortableServer.POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); // récupération du serveur de nom org.omg.CosNaming.NamingContext ns = NamingContextHelper.narrow( orb.resolve_initial_references("NameService")); // Creation du servant et enregistrement au serveur de noms HelloImpl hello = new HelloImpl(); ns.rebind( new NameComponent[] { new NameComponent("HelloObj","")}, hello ); // Mise en attente du serveur orb.run(); } 23 Implantation du client Corba <HelloClient.java> public class HelloClient { public static void main(String args[]) { // Initialisation du Bus Corba org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // récupération du serveur de nom org.omg.CosNaming.NamingContext ns = org.omg.CosNaming. NamingContextHelper.narrow( orb.resolve_initial_references("NameService")); // Récupération de la souche depuis le serveur de nom org.omg.CORBA.Object obj_ref = ns.resolve(new org.omg.CosNaming.NameComponent[] {new NameComponent("HelloObj","")}); Hello hello = HelloHelper.narrow(obj_ref); // Invocation de l'objet distant hello.doHello(); } } 24 24 Les classes générées (client et serveur) ➨ Classe _HelloStub : implantation du talon sert à envoyer les requêtes utilisé en lieu et place de l'objet Hello dans le client ➨ Classe HelloPOA reçoit et décode les requêtes implantation par héritage délégation ➨ Classe HelloPOATie reçoit et décode les requêtes implantation par <HelloImpl.java> public class HelloImpl extends HelloPOA { public HelloImpl() {} public void doHello() { System.out.println("Hello world!"); } } 25 25 Corba dynamique 26 26 L’invocation dynamique ➨Référentiel d’interfaces (IR) accessible comme objet Corba gestion de méta­objets Corba (ModuleDef, InterfaceDef, OperationDef, AttributeDef, TypedefDef, …) ➨API (DII) de construction de requêtes ➨Un objet Request = un nom d’opération, une liste de couples type­valeur (au sens de l’IR), une structure pour le résultat, des méthodes: 27 invoke send_deferred, get_response, poll_response send_oneway 27 Le squelette dynamique ➨API (DSI) de décodage de requêtes ➨Pas d’utilisation de squelettes pré­générés ➨Utilisée pour implanter dynamiquement des objets ➨Cas d’utilisation : création de passerelles 28 28