Chapitre 1 : Remote Method Invocation (RMI)

 

 

 

Guillaume Latu

Octobre 2003

 

Département d'informatique

UFR de Mathématique et Informatique

Université Louis Pasteur – Strasbourg

 

 

 

Table des matières

 

 

 

1. Introduction... 2

1.1 Avantages / Inconvénients. 2

1.2 Fonctionnement. 2

2. Réalisation d’une application... 3

2.1 Développement. 3

2.2 Exemple de code. 3

2.3  Compilation & Déploiement. 4

3. Mécanisme interne du RMI. 4

3.1  Passage de paramètre. 4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1. Introduction

 

L’objectif c’est de permettre à des applications clientes d’invoquer des méthodes sur des objets distants, càd localisés dans une autre application appelée « serveur ».

RMI constitue un moyen simple de développer des applications (client/serveur).

 

            1.1 Avantages / Inconvénients

 

Inconvénients :

 

o        RMI est la propriété de SUN (mais il est utilisable gratuitement : il fait parti du JAVA distribué par SUN)

o        Avec RMI, il n’est pas possible d’interagir avec les objets dans un autre langage

o        RMI est plus lent que CORBA

 

Avantages :

 

o        RMI est plus simple à mettre en œuvre que CORBA

o        RMI étend la fonctionnalité de Garbage Collector

o        RMI permet une gestion de la sécurité (communication)

o        RMI permet à une machine M1 de créer un objet et de le rendre disponible à une autre application. La machine M1 est le serveur et les applications utilisent l’objet, les clients

 

 

è Pour utiliser un objet distant, un client récupère sur sa machine une représentation de l’objet distant : le proxy stub. Ce stub implémente l’interface de l’objet distant.

 

Interface : (ex : A)

o        Prototype de fonction

o        Constantes au niveau des attributs de la classe

 

Implements

o        class B implements A, C, D extends E { … }

o        permet une forme d’héritage multiple

 

            1.2 Fonctionnement

 

         i.      Le client appelle une méthode sur le proxy de l’objet A

       ii.      Le proxy emballe l’identifiant de la méthode et ses arguments (sérialisation Marshalling)

      iii.      La requête est transmise sur le réseau

     iv.      Le squelette reçoit et dé-sérialise les arguments

       v.      La méthode est appelée sur l’objet A du serveur

     vi.      La méthode renvoie le résultat au squelette

    vii.      Le squelette sérialise le retour de la méthode

  viii.      Transmission au proxy de A

     ix.      Le proxy déballe le résultat

       x.      La méthode du proxy retourne le résultat comme une méthode ordinaire

 

2. Réalisation d’une application

            2.1 Développement

 

L’interface

-    Définition de l’interface des objets accessibles à distance à contrat

-    L’implémentation à code pour toutes les méthodes définies dans l’interface (code destiné à être exécuté sur le serveur)

Le serveur

- Développement du programme qui créer une instance de l’objet exécuté à distance (A)

Le client

- Développement d’application accédant à des méthodes de l’objet distant (A)

 

            2.2 Exemple de code

 

Interface : Message.java

 

import java.rmi Remote ;

import java.rmi RemoteException ;

 

public interface Message extends Remote {

      Public String messageDistant () throws RemoteException ;

}

 

MessageImpl.java

 

import java.rmi.server.UnicastRemoteObject;

import java.rmi RemoteException ;

 

public class MessageImpl extends UnicatRemoteObject implements Message {

      public MessageImpl () throws RemoteException {

            super();

      }

// la construction de l’implémentation doit faire appel au constructeur de la super classe

      public String messageDistant() throws RemoteException {

            return (“Message : Salut !!”);

      }

}

 

Serveur

 

import java.net.* ;     //utilisation d’URL

 

public class Serveur {

      public static void main (String [] args) {

            try

            {

                  MessageImpl objA = new MessageImpl() ;

                  Naming.rebind (“objA”, objA);

}

catch (RemoteException re) {}

catch (MalformedURLException m {}

      }

}

 

 

Client

 

import java.rmi.* ;

import java.net.MalformedURLException ;

 

public Client {

      public static void main (String [] args) {

            try {

                  Message objA = Naminglookup (“//machineDuServeur/objA”);

                  System.out.println (“Le client reçcoit”+ objA.messageDistant());

            }

            catch (NotBoundException nbe) {} 

            catch (RemoteException re) {}

catch (MalformedURLException m {}

 

            2.3  Compilation & Déploiement

 

$ javac *.java

$ rmi MessageImpl

$ rmiregistery &

$ java Serveur               //du côté serveur

$ java Client                // du côté client

      à TCP/IP

      à RMI SocketFactory

 

 

3. Mécanisme interne du RMI

            3.1  Passage de paramètre

 

-          type primitifs : par valeur

-          objet : par référence

 

Appel distant

 

Ø      les valeurs primitives sont passés par valeur

Ø      les objets sérialisables sont sérialisés et passés par copie (ex. d’objet non sérialisables à fichiers ouverts)

Ø      les objets accessibles à distance sont passés par référence (proxy de l’objet)

Ø      les objets non sérialisables et non accessibles à distance provoquent une exception (java.rmi.MarshallException)

 

Rappel

 

Les tableaux sont des objets

      float mat [][] = nex float [3][4] ;

      for (int i=0 ; i<mat.length ; i++) ...

 

Obtention d’un proxy

 

2 solutions :

Ø      utiliser un service de nommage (NammingLookup) qui conserve l’association entre un objet accessible à distance et un nom externe « en toutes lettres » ou une URL

Ø      appeler une méthode (à distance) qui renvoie/transmet un autre objet accessible à distance

 

 

 

 

 

Ø      sur M1 : B.methodeDistante (A,C)

Ø      sur M2 : B ne connaît pas A et C

Ø      sur M2 : création automatique des proxy A et C (pas d ‘envoi sur le réseau)