RMI (Appel de Méthode à distance)

Le RMI (Appel de Méthode à distance) est une API qui fournit un mécanisme pour créer une application distribuée en java. Le RMI permet à un objet d’appeler des méthodes sur un objet s’exécutant dans une autre JVM.

Le RMI fournit une communication à distance entre les applications à l’aide de deux objets stub et skeleton.

Comprendre le talon et le squelette

RMI utilise le talon et l’objet squelette pour la communication avec l’objet distant.

Un objet distant est un objet dont la méthode peut être invoquée à partir d’une autre JVM. Comprenons les objets stub et skeleton:

stub

Le stub est un objet, agit comme une passerelle pour le côté client. Toutes les demandes sortantes y sont acheminées. Il réside côté client et représente l’objet distant. Lorsque l’appelant appelle la méthode sur l’objet stub, il effectue les tâches suivantes:

  1. Il initie une connexion avec la Machine Virtuelle distante (JVM),
  2. Il écrit et transmet (marshals) les paramètres à la Machine Virtuelle distante (JVM),
  3. Il attend le résultat
  4. Il lit (unmarshals) la valeur de retour ou l’exception, et
  5. Il renvoie enfin la valeur de retour à l’appelant.

squelette

Le squelette est un objet, agit comme une passerelle pour l’objet côté serveur. Toutes les demandes entrantes y sont acheminées. Lorsque le squelette reçoit la demande entrante, il effectue les tâches suivantes:

  1. Il lit le paramètre de la méthode distante
  2. Il appelle la méthode sur l’objet distant réel, et
  3. Il écrit et transmet (marshals) le résultat à l’appelant.

Dans le SDK Java 2, un protocole stub a été introduit qui élimine le besoin de squelettes. stub et squelette dans RMI

Comprendre les exigences pour les applications distribuées

Si une application effectue ces tâches, elle peut être une application distribuée.

.

  1. L’application doit localiser la méthode distante
  2. Elle doit fournir la communication avec les objets distants, et
  3. L’application doit charger les définitions de classe pour les objets.

L’application RMI possède toutes ces fonctionnalités, elle s’appelle donc l’application distribuée.

Exemple RMI Java

On donne les 6 étapes pour écrire le programme RMI.

  1. Créer l’interface distante
  2. Fournir l’implémentation de l’interface distante
  3. Compiler la classe d’implémentation et créer les objets stub et skeleton à l’aide de l’outil rmic
  4. Démarrer le service de registre par l’outil rmiregistry
  5. Créer et démarrer l’application distante
  6. Créer et démarrer l’application distante

Exemple RMI

Dans cet exemple, nous avons suivi les 6 étapes pour créer et exécuter l’application rmi. L’application cliente n’a besoin que de deux fichiers, l’interface distante et l’application cliente. Dans l’application rmi, le client et le serveur interagissent avec l’interface distante. L’application cliente appelle des méthodes sur l’objet proxy, RMI envoie la requête à la JVM distante. La valeur de retour est renvoyée à l’objet proxy, puis à l’application cliente.

 Exemple RMI

1) créer l’interface distante

Pour créer l’interface distante, étendez l’interface distante et déclarez l’exception RemoteException avec toutes les méthodes de l’interface distante. Ici, nous créons une interface distante qui étend l’interface distante. Il n’y a qu’une seule méthode nommée add() et elle déclare RemoteException.

2) Fournir l’implémentation de l’interface distante

Maintenant fournir l’implémentation de l’interface distante. Pour fournir l’implémentation de l’interface distante, nous devons

  • Soit étendre la classe UnicastRemoteObject,
  • ou utiliser la méthode exportObject() de la classe UnicastRemoteObject

Si vous étendez la classe UnicastRemoteObject, vous devez définir un constructeur qui déclare RemoteException.

3) créez les objets stub et skeleton à l’aide de l’outil rmic.

L’étape suivante consiste à créer des objets stub et skeleton à l’aide du compilateur rmi. L’outil rmic appelle le compilateur RMI et crée des objets stub et skeleton.

4) Démarrez le service de registre à l’aide de l’outil rmiregistry

Démarrez maintenant le service de registre à l’aide de l’outil rmiregistry. Si vous ne spécifiez pas le numéro de port, il utilise un numéro de port par défaut. Dans cet exemple, nous utilisons le numéro de port 5000.

5) Créez et exécutez l’application serveur

Maintenant, les services rmi doivent être hébergés dans un processus serveur. La classe Naming fournit des méthodes pour obtenir et stocker l’objet distant. La classe de nommage fournit 5 méthodes.

java statique public.rmi.Recherche à distance (java.lang.String) lance java.rmi.Je n’ai pas de problème avec java.net.MalformedURLException, java.rmi.RemoteException; Renvoie la référence de l’objet distant.
liaison vide statique publique (java.lang.Chaîne, java.rmi.À distance) lance java.rmi.Déjà une exception, java.net .MalformédURLException, java.rmi.RemoteException; Il lie l’objet distant avec le nom donné.
vide statique public unbind (java.lang.String) lance java.rmi.Exception à distance, java.rmi.NotBoundException, java.net.MalformedURLException; Il détruit l’objet distant qui est lié avec le nom donné.
rebind vide statique public (java.lang.Chaîne, java.rmi.À distance) lance java.rmi.RemoteException, java.net.MalformedURLException; Il lie l’objet distant au nouveau nom.
java statique public.lang.Liste de chaînes (java.lang.String) lance java.rmi.RemoteException, java.net.MalformedURLException; Renvoie un tableau des noms des objets distants liés dans le registre.

Dans cet exemple, nous lions l’objet distant par le nom sonoo.

6) Créez et exécutez l’application client

Chez le client, nous obtenons l’objet stub par la méthode lookup() de la classe de nommage et invoquons la méthode sur cet objet. Dans cet exemple, nous exécutons les applications serveur et client, sur la même machine, nous utilisons donc localhost. Si vous souhaitez accéder à l’objet distant à partir d’une autre machine, remplacez l’hôte local par le nom d’hôte (ou l’adresse IP) où se trouve l’objet distant.

Sortie de cet exemple RMI

 RMI  RMI

Exemple significatif d’application RMI avec base de données

Considérons un scénario, deux applications s’exécutent sur des machines différentes. Disons MachineA et MachineB, machineA est situé aux États-Unis et MachineB en Inde. MachineB veut obtenir la liste de tous les clients de l’application MachineA.

Développons l’application RMI en suivant les étapes.

1) Créez la table

Tout d’abord, nous devons créer la table dans la base de données. Ici, nous utilisons la base de données Oracle10.

 Application RMI avec base de données

2) Créer une classe client et un fichier d’interface distante

: Client.java

Remarque : La classe client doit être sérialisable.

Fichier: Banque.java

3) Créez la classe qui fournit l’implémentation du fichier d’interface distante

: BankImpl.java

4) Compilez l’outil rmic de classe et démarrez le service de registre par l’outil rmiregistry

 Exemple RMI avec la base de données

5) Créez et exécutez le fichier du serveur

: MyServer.java exemple d'appel de méthode distante

6) Créez et exécutez le fichier Client

: MyClient.java exemple réel de rmi