TP numéro 1 : Java RMI

Deuxième année Ingénierie Génie Logiciel
Middlewares et intégration d’applications
TP numéro 1 : Java RMI
(Enseignant de TP : Mohamed Lamine JELLAD)
RMI (Remote Method Invocation)
1.1. Définition
RMI est une interface de programmation (API) pour le langage Java qui permet
d'appeler des méthodes distantes, sur le principe des ORB (1). L'utilisation de cette API
nécessite l'emploi d'un registre RMI sur la machine distante hébergeant ces objets que l'on
désire appeler au niveau duquel ils ont été enregistrés. Cette interface de programmation est
très souvent utilisée en parallèle avec l'API d'annuaire JNDI (2) ou encore avec la
spécification de composants distribués transactionnels EJB (3) du langage Java.
(1) ORB (Object Request Broker) est un bus des objets qui envoient et reçoivent des
requêtes et des réponses, de manière transparente et portable : il s'agit de l'activation
ou de l'invocation à distance par un objet, d'une méthode d'un autre objet distribué.
(2) JNDI (Java Naming and Directory Interface) est une API Java de connexion à des
annuaires, notamment des annuaires LDAP (Lightweight Directory Access
Protocol).
(3) EJB (Enterprise JavaBeans) est une architecture de composants logiciels côté
serveur pour la plateforme de développement Java EE. Cette architecture propose un
M.L. Jellad
Page - 1
cadre pour créer des composants distribués (c’est-à-dire déployés sur des serveurs
distants) écrit en langage de programmation Java hébergés au sein d'un serveur
applicatif permettant de représenter des données (EJB dit entité), de proposer des
services avec ou sans conservation d'état entre les appels (EJB dit session), ou
encore d'accomplir des tâches de manière asynchrone (EJB dit message).
1.2. Etape de création d’un objet distant et son appel
Le développement coté serveur se compose de :

La définition d'une interface qui contient les méthodes qui peuvent être appelées
à distance

L'écriture d'une classe qui implémente cette interface

L'écriture d'une classe qui instanciera l'objet et l'enregistrera en lui affectant un
nom dans le registre de noms RMI (RMI Registry)
Le développement côté client se compose de :

L'obtention d'une référence sur l'objet distant à partir de son nom

L'appel à la méthode à partir de cette référence
Enfin, il faut générer les classes stub et skeleton en exécutant le programme rmic avec le
fichier source de l'objet distant
M.L. Jellad
Page - 2
TP numéro 1 en Middlewares et intégration d’applications : RMI
1.3. Exercice
Nous voulons implémenter le diagramme de classe suivant pour obtenir un objet distant
RMI qui possède une méthode qui renvoi une note d’un étudiant.
Figure 1.1 : un diagramme de classe de la collection d’étudiants.
La structure de projet est:
Figure 1.2 : la structure de projet RMIApp
M.L. Jellad
Page - 3
TP numéro 1 en Middlewares et intégration d’applications : RMI
Imprime écran de résultat du serveur RMI :
Figure 1.3 : Résultat souhaité de coté Serveur RMI.
Imprime écran de résultat du client :
Figure 1.4 : Résultat souhaité de coté Client RMI.
Enoncé d’exercice 1 :
Créer un projet Web vide sous Netbeans 7.3.1 nommé « RMIApp ».
Créer une interface NoteInterface dans un package nommé « serveur » qui hérite de
l’interface Java Remote comme il est motionné en diagramme de classe présent dans la figure
1.1. Ajouter la signature de la méthode getNote indiqué dans le même diagramme de classe.
Créer une classe NoteImpl qui implémente l’interface NoteInterface dans le même
package java « serveur ». La méthode getNote retourne une note aléatoire entre 10 et 20.
Créer une classe Serveur qui lance un objet de type NoteImpl comme un objet distant.
Voir l’annexe 1 à la suite.
M.L. Jellad
Page - 4
TP numéro 1 en Middlewares et intégration d’applications : RMI
Créer une classe Client dans un nouveau package java nommé « client » qui appel
l’objet distant publié par le serveur, le client utilise alors un nom d’objet sous forme d’une
URL. Voir l’annexe 2.
Annexe 1 : RMI de coté serveur
La méthode createRegistry(int port) de la classe Java LocateRegistry permet de créer
un registre. L’accès ce registre sera via le port indiqué (par défaut 1099).
Pour sécuriser la transaction utiliser le code suivant :
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
Pour exporter (enregistrer) l’objet RMI utiliser :
1. La méthode exportObject de la classe Java UnicastRemoteObject qui prend en
paramètre un objet d’une classe qui implémente une interface Romote et un autre
paramètre port par défaut 1099. La méthode exportObject retourne un objet de
type Remote.
2. La méthode rebind de la classe Java Naming qui prend en paramètres une url et un
objet de type Remote, la méthode va associer l’objet à l’url
Figure 1.5 : Code de publication d’un objet en RMI
Annexe 2 : RMI coté client
Pour sécuriser la transaction utiliser le code suivant :
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
M.L. Jellad
Page - 5
TP numéro 1 en Middlewares et intégration d’applications : RMI
}
Pour récupérer un l’objet RMI distant utilisez la méthode lookup(String url) de la classe
Java Naming. L’objet sera de type nom d’interface Remote, dans notre cas NoteInterface.
L’appel d’une méthode de cet objet est comme tous les objets Java :
nomObjet.nomMéthode(Liste de paramètres).
Pour éviter les problèmes en cas d’appel de la méthode getNote, utilisez un test
instanceof de l’objet retourné la méthode lookup () et n’oubliez pas de faire le transtypage
(casting) de l’objet en NoteInterface.
Remarque :
Pour réussir l’exécution, cherchez le chemin de votre JDK ou JRE Java, entez dans la
répertoire lib, puis la repertoire security, ouvrez le fichier java.policy, ajoutez les deux lignes
avant le code « }; » à la fin. La fin de fichier sera comme suite :
……
permission java.net.SocketPermission "*:1024-65535", "connect,accept";
permission java.net.SocketPermission "*:80", "connect";
};
Enregistrez alors, puis démarrer Netbeans. Dans mon cas le fichier java.policy est dans
C:\Program Files\Java\jdk1.7.0_21\jre\lib\security
Figure 1.6 : modification de fichier java. Policy.
M.L. Jellad
Page - 6