Remote Method Invocation
Généralités
Pour clôturer ce cours, nous allons maintenant parler du package RMI (Remote Method Invocation). Celui-ci se propose de vous fournir des mécanismes simples vous permettant de distribuer une application (des objets) sur plusieurs machines. Une partie de votre application va donc faire des appels de méthodes sur des objets qui ne seront pas forcément disposés sur la même machine. RMI se charge alors de faire transiter les paramètres et la valeur de retour de l'appel de méthode.
Une question peut alors se poser. Que se passe t'il si l'appel revoit un objet dont la classe est inconnue de la machine appelante ? RMI se charge aussi de faire transiter la classe d'une machine à l'autre.
Pour que cela fonctionne, nous avons besoin d'identifier, de façon unique, un tel objet. Le client peut alors localiser l'objet sur une machine distante et y effectuer un appel de méthode.
Pour un appel, aussi bien la machine appelante que la machine appelée doivent procéder à un certain nombre d'étapes pour finalement aboutir. Le tableau suivant indique ces étapes. Il est clair qu'il ne faudrait pas que le programmeur ai à écrire chacune d'elles. Dans ce but, le programme rmic se charge de créer des classes : une classe stub du coté de la machine appelante et une autre nommé skeleton pour la machine appelée. Ces deux classes fournissent les mécanismes suffisants pour traiter ces étapes.
Machine appelante
|
Identifier uniquement l'objet
Donner le nom de la méthode à appliquer
Capturer et transmettre les paramètres d'appels |
Machine appelée
|
Décoder les paramètres d'appels
Exécuter la méthode
Capturer et transmettre la valeur de retour |
Codage d'un objet distant
La première de choses à faire pour que votre programme puisse appeler un objet distant, c'est de lui en fournir une interface. Cette interface doit obligatoirement étendre l'interface Remote.
interface Product extends Remote {
public String getDescription() throws RemoteException;
} |
Ensuite, il vous faut implémenter l'objet distant. Cet objet doit forcément dériver de la classe UnicastRemoteServer et implémenter l'interface spécifiée à la machine appelante.
public class ProductImpl extends UnicastRemoteServer implements Product {
private String description = "default";
public ProductImpl(String des) { description = des; }
public String getDescription() { return description; }
} |
Il nous faut ensuite créer un objet de cette classe sur la machine appelée. On procède comme dans l'exemple suivant.
ProductImpl prod1 = new ProductImpl("Objet distant");
Naming.bind("distant",prod1); // identification |
A ce stade du développement, il ne reste plus qu'à écrire la déclaration de l'objet au sein de la machine appelante et ensuite, de l'utiliser (de manière transparente). Voici un petit exemple.
String url = "rmi://serverObjets.evol.fr/";
Product prod1 = (Product)Naming.lookup(url + "distant");
String descr = prod1.getDescription(); |
Il vous ai alors possible d'écrire un serveur d'objets distribués auquel diverses machines peuvent se connecter. En voici un petit exemple (le dernier )-: ).
public class ProductServer {
public static void main(String argv[]) {
try {
ProductImpl prod1 = new ProductImpl("Object 1");
prod1.rebind("obj1",prod1);
ProductImpl prod2 = new ProductImpl("Object 2");
prod2.rebind("obj2",prod2);
} catch(Exception e) { e.printStackTrace(); }
while(true);
}
} |
|