TP N°4 : RMI IIOP avec IDL - ENONCE

> POSITIONNEMENT DU TP

Secteur Cible Cours Chapitre Durée Logiciels nécessaires
Informatique niveau master /
cycle ingénieur
Middleware et Systèmes distribués RMI et Corba 2 heures javac : compilateur java
idlj : pre-processeur idl
orbd : Orb Corba (Object Request Broken Daemon)

>OBJECTIFS DU TP

L'objectif du TD consiste à comprendre la notion d'architecture d'objets distribués dans un contexte RMI et CORBA en utilisant le protocole IIOP et en utilisant une interface ouverte normalisée basée sur un Interface Définition Langage (IDL).

> Exercice 1

A quoi sert un IDL ? Quel intéret d'utiliser un IDL par rapport à la solution du TP3 qui utilise une interface java ?
Réponse 1

> Exercice 2

Faite un schéma de l’architecture d’une application reposant sur RMI-IIOP et situez la place de l’IDL.
Réponse 2

> Exercice 3

Se familiariser avec le langage IDL CORBA : ressource utilisable : Introduction à CORBA IDL
Ecrire le fichier BonjourLaReunion.idl comportant 2 opérations :
   - ditBonjourLaReunion() qui retourne au client un message de bienvenue a afficher par le client mais construit par le serveur"
   - shutdown() qui est une opération qui fait stopper le serveur et qui sans bloquer le client voir mot clé "oneway" de l'IDL.

Réponse 3

> Exercice 4

Ecrire le serveur dans un fichier BonjourLaReunionServer.java
Vous avez ici la trame globale du fichier :
//BonjourLaReunionServer.java
import BonjourLaReunionApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;

import java.util.Properties;

class BonjourLaReunionImpl extends BonjourPOA {
  private ORB orb;

  public void setORB(ORB orb_val) {
    orb = orb_val;
  }
   
  // implementation de l'opération ditBonjourLaReunion()
  *** A faire (exo4.1) ***
  }
   
  // implementation de l'opération shutdown() method
  public void shutdown() {
    orb.shutdown(false);
  }
}


public class BonjourLaReunionServer {

  public static void main(String args[]) {
    try{
      // creer et initialiser l'ORB

      // récupérer la référence au POA et activer son POAManager

      // creer un servant et l'enregistrer dans l'ORB

      // récupérer la référence de l'objet remote dans le servant
        
      // Récupérer le contexte de nommage

      // lier la référence de l'objet remote à un libellé associé dans le service de nommage
// ici notre objet offert par le servant sera identifier par le libellé "BonjourLaReunion"

// le serveur est pret et le fait savoir !

      // wait for invocations from clients

    } catch (Exception e) {
        System.err.println("ERROR: " + e);
        e.printStackTrace(System.out);
    }
         
      System.out.println("Fermeture du serveur BonjourLaReunionServer ...");
       
  }
}
   
Complétez la trame globale du fichier avec les éléments de code suivant, en identifiant à quels endroits ils doivent être placés :
*** A faire (exo4.2) ***
  1. BonjourLaReunionImpl bonjourLaReunionImpl = new BonjourLaReunionImpl();
    bonjourLaReunionImpl.setORB(orb);
  2. org.omg.CORBA.Object ref = rootpoa.servant_to_reference(bonjourLaReunionImpl);
    Bonjour href = BonjourHelper.narrow(ref);
  3. System.out.println("Le Serveur BonjourLaReunion est ready il attend ...");
  4. orb.run();
  5. POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
    rootpoa.the_POAManager().activate();
  6. org.omg.CORBA.Object objRef =
    orb.resolve_initial_references("NameService");
    // Utilisation de NamingContextExt qui est un élément défini dans l'Interoperable
    // Naming Service (INS) specification.
    NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
  7. ORB orb = ORB.init(args, null);
  8. String name = "BonjourLaReunion";
    NameComponent path[] = ncRef.to_name( name );
    ncRef.rebind(path, href);
Réponse 4


> Exercice 5

Ecrire le client dans un fichier BonjourLaReunionServer.java
Vous avez ici la trame globale du fichier :
//BonjourLaReunionClient.java
import BonjourLaReunionApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

public class BonjourLaReunionClient
{
static Bonjour bonjourLaReunionImpl;

public static void main(String args[])
{
try{
// Création et initialisation de l'ORB

// Récupération du contexte de nommage racine

// Résolution de l'Object Reference par le service de nommage

//appel à la fonction ditBonjourlaReunion sur servant

//arrêt du servant

} catch (Exception e) {
System.out.println("ERROR : " + e) ;
e.printStackTrace(System.out);
}
}

}
Complétez la trame globale du fichier avec les éléments de code suivant, en identifiant à quels endroits ils doivent être placés :
*** A faire (exo5.1) ***
  1. org.omg.CORBA.Object objRef = 
    orb.resolve_initial_references("NameService");
    NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);;
  2. String name = "BonjourLaReunion";
    bonjourLaReunionImpl = BonjourHelper.narrow(ncRef.resolve_str(name));
  3. ORB orb = ORB.init(args, null);
  4. bonjourLaReunionImpl.shutdown();
  5. System.out.println(bonjourLaReunionImpl.ditBonjourLaReunion());

Réponse 5

> Exercice 6

Compilation et tests
/Creer le stub and skeleton ainsi que le POA:
============================================
idlj -fall BonjourLaReunion.idl

*** Quels sont les fichiers générés par cette commande (exo6.1) ? ***

*** Repérez vous l'utilisation de patron(s) présentés en cours dans les fichiers générés (exo6.2) ? lequels et dans quels fichiers sources ?***

 
Compiler le serveur et le client
==========================================
javac *.java BonjourLaReunionApp/*.java

Lancer le service de nomage RMI-IIOP
=====================================
Unix /Linux/ OsX :
orbd -ORBInitialPort 1050&
Microsoft Windows:
start orbd -ORBInitialPort 1050

Lancer le Serveur :
=====================
java BonjourLaReunionServer -ORBInitialPort 1050 -ORBInitialHost localhost&

Lancer le Client :
====================
java BonjourLaReunionClient -ORBInitialPort 1050 -ORBInitialHost localhost

Test en env. distribué :
========================
Tester l'exécution de l'application sur deux machines distinctes de la salle TP

*** Montrer l'exécution à l'encadrant du TP (exo6.3) ***


Les deux machines doivent être sur le même sous-réseau.
Par exemple vérifier que les machines qui communiquent ensemble soient toutes
sur le réseau cablé, les adresse IP échangées doivent être en 10.230.130.xx
(qui correspond aux IP lorsqu'on est cablé).


Réponse 6


A me rendre :
Les réponses aux questions de ce TP
Un zip du code produit