TP CORBA

Module SOI

Bertrand Dupouy et Frank Singhoff

SOMMAIRE

Les parties IV et V comportent des exercices à rendre.





I. Introduction

L'objectif de ces exercices est la mise en pratique des concepts abordés lors du cours d'introduction à CORBA. Ce TP est composé de trois exercices en Java. Le premier est un exemple complet d'un client/serveur CORBA utilisant une interface IDL simple. Cet exercice utilise les outils de base nécessaires à la réalisation d'une application CORBA élémentaire et présente les principales règles du mapping Java/IDL. Dans le deuxième exercice, on vous demande de compléter l'exemple précédent avec de nouvelles méthodes. Enfin, le troisième exercice illustre le fonctionnement d'une usine à objets. Les deux premiers exercices correspondent à la première partie du cours et le troisième exercice à la deuxième partie du cours.


II. Mise en place de l'environnement

L'ORB que nous allons utiliser, ORBacus, est distribué gratuitement par la société OOC. Cet ORB est conforme au standard CORBA 2.0. Il implante les interfaces d'invocation statique et dynamique, les mappings Java et C++ ainsi que plusieurs services d'objets de l'OMG.

Nous faisons maintenant l'hypothèse que vous utilisez zsh et que vous avez récupérer les sources des exercices, puis, utilisé la commande

tar xvf tp-corba-java.tar

pour les extraire de l'archive dans votre répertoire principal. Votre répertoire principal doit alors contenir le répertoire TP-CORBA. Dans ce dernier, se trouve le fichier corba.zsh. Celui-ci comprend la définition des variables nécessaires au bon fonctionnement de l'ORB. Pour positionner ces variables, il suffit alors d'utiliser la commande :

source corba.zsh

dans toutes les fenêtres où vous exécuterez des processus utilisant CORBA.


III. Exercice 1

Les sources de cet exercice se trouvent dans le répertoire ./TP-CORBA/EXO1.

Le premier exercice consiste en un exemple simple d'application client/serveur CORBA. Il s'agit de l'exemple présenté lors du TP RPC. Le serveur exporte deux méthodes (bid_carre et bid_rac) définies dans l'interface IDL calcul (fichier tpcorba.idl). Dans cet exercice, vous devez compiler et exécuter l'application. Pour ce faire, il faut :

On vous demande d'observer par quelles étapes passent le serveur et le client pour initialiser l'objet CORBA, et pour invoquer les méthodes de l'objet. Vous regarderez plus précisément les points suivants :

  1. Quelles sont les interactions entre le serveur et la BOA ?

  2. Quelle est la relation entre la classe d'implémentation (classe calcul_Impl.java) et le squelette (le squelette est défini par la classe _calculImplBase.java dans le répertoire tpcorba) ?

  3. Dans la souche (classe StubForcalcul.java), où se trouvent la construction et l'émission de la requête vers le serveur ? Comment le client obtient il la souche pour invoquer l'objet (voir la méthode narrow dans la classe calculHelper.java) ?

  4. Chercher dans le squelette (classe _calculImplBase.java) où se situent les appels à l'implémentation de l'objet (classe calcul_Impl.java).

  5. Enfin, identifier dans le fichier calcul.ref (fichier qui contient la référence d'objet) l'adresse IP où se trouve le serveur et le port TCP utilisé pour les interactions entre les clients et le serveur. Vous utiliserez à cet effet la commande :

    iordump `cat calcul.ref` (attention aux back quotes!)

    qui affiche à l'écran le contenu de la référence d'objet.





Vous trouverez ici le manuel en ligne d'ORBacus.

Pour vous aider, voici un bref rappel des principales règles du mapping IDL/Java qui vont vous être nécessaires dans ce TP (le mapping complet est accessible à cet endroit . Un résumé est donné en annexe dans le support de cours) :




IV. Exercice 2

Les sources de cet exercice se trouvent dans le répertoire ./TP-CORBA/EXO2.

On se propose dans ce deuxième exercice d'ajouter une fonctionnalité de ``mémoire'' à notre calculatrice. La mémoire est implantée sous la forme d'un attribut CORBA. On rappelle qu'un attribut d'interface CORBA est une donnée encapsulée dans un objet. Un attribut peut être consulté et/ou modifié à distance par un client. Dans notre cas, il s'agit d'un attribut en lecture seule.

Dans le mapping IDL/Java, un attribut en lecture/écriture nécessite la production de deux méthodes dans la souche. Le nom de ces méthodes est le nom de l'attribut lui-même. Ces méthodes sont utilisées par les clients pour manipuler les attributs à distance. Une seule méthode est générée dans le cas d'un attribut en lecture (voir les souches générées pour de plus amples informations).

On vous demande de :

  1. Compléter la description IDL tpcorba.idl en ajoutant à l'interface calcul, les méthodes ajouteMemoire, soustraitMemoire, multiplieMemoire et miseAZero. Chacune de ces méthodes prend un unique paramètre en in de type double (sauf miseAZero qui ne prend pas de paramètre). Elle mettent à jour la mémoire mais ne renvoient pas d'information au client. La méthode diviseMemoire doit lever une exception en cas de tentative de division par zéro. Une exception CORBA est un mécanisme proche d'une exception Java : une exception CORBA est un événement déclenché lors de l'invocation d'un objet et qui est transmis à l'appelant de cet objet. Appelant et appelé ne sont pas nécessairement localisés sur la même machine.

  2. Compléter la définition de la classe d'implémentation dans le fichier calcul_impl.java.

  3. Compléter le client afin de tester les quatre méthodes implantées. Le client doit afficher l'état initial de la mémoire, puis effectuer des opérations sur celle-ci. Enfin, avant de se terminer, il devra afficher l'état final de la mémoire.

  4. Que se passe-t-il lorsque la mémoire est utilisée par plusieurs clients successivement ?


PS : Les zones de code à compléter sont désignées par des étoiles.


V. Exercice 3

Les sources de cet exercice se trouvent dans le répertoire ./TP-CORBA/EXO3.

Une solution possible au problème posé par la quatrième question du deuxième exercice est d'utiliser plusieurs instances de l'interface ``calcul''. Pour ce faire, nous allons définir une usine à objets. Une usine à objets offre des services permettant de créer et gérer dynamiquement des objets CORBA (voir partie 5 du cours). Nous allons donc offrir aux clients la possibilité de créer et détruire dynamiquement des objets ``calcul'' et éventuellement de se partager un même objet.

Le serveur doit maintenant gérer un ensemble de calculatrices. Pour chaque calculatrice, il maintient une référence sur l'objet CORBA, un identifiant (un nom sous la forme d'une chaîne de caractères utilisé par les clients pour désigner une calculatrice particulière) ainsi qu'un nombre d'utilisateurs (nombre de clients qui manipulent la calculatrice).

Dans cet exercice, il vous est demandé de :

  1. Modifier le fichier tpcorba.idl en rédigeant pour l'interface usine les quatre méthodes décrites ci-dessous (n'oubliez pas de déclarer les exceptions utilisées par chaque méthode) :

  2. Compléter l'implantation de l'interface usine (c'est à dire le fichier usine_impl.java).

  3. Tester cette nouvelle interface avec le client.



Les méthodes qui vous devez ajouter au fichier tpcorba.idl sont :

  1. La méthode creation qui prend :

    Cette méthode doit créer une nouvelle instance de la classe calcul_impl, puis l'enregistrer auprès de la BOA grâce à la méthode obj_is_ready. Enfin, elle doit renvoyer au client une référence sur le nouvel objet CORBA créé (rappel : le mot clef interface est un constructeur de type, ``calcul'' est donc un type IDL).

    La méthode doit lever :

  2. La méthode suppression qui prend un paramètre en in de type string désignant le nom de la calculatrice à détruire. L'objet CORBA pourra être désactivé grâce à la méthode deactivate_obj de la BOA (cette méthode nécessite un seul paramètre : une référence d'objet CORBA).

    La méthode doit lever :

  3. La méthode connecter qui prend :

    Cette méthode doit incrémenter le nombre d'utilisateurs associé à une calculatrice. Par contre, elle ne crée pas d'objet CORBA : elle permet d'avertir l'usine à objets qu'un client souhaite utiliser une calculatrice déjà existante. Elle doit renvoyer au client une référence sur l'objet CORBA concerné. La méthode doit lever une exception si le paramètre string adresse une calculatrice inexistante (exception calculatriceInconnue).

  4. La méthode deconnecter qui prend un paramètre en in de type string désignant le nom de la calculatrice concernée. Cette méthode ``déconnecte'' un utilisateur d'une calculatrice. Elle permet d'avertir l'usine à objets que le client ne souhaite plus utiliser la calculatrice.

    La méthode doit lever :




©(Copyright) dupouy@inf.enst.fr singhoff@inf.enst.fr