Partie1: Technologies de distribution
Atelier 1: Remote Method Invocation
Dr. Hassen Lazrag
Démarche RMI
Cours JEE 2023 Hassen Lazrag
Démarche RMI
1. Créer les interfaces des objets distants
2. Créer les implémentation des objets distants
3. Générer les stubs et skeletons
4. Créer le serveur RMI
5. Créer le client RMI
6. Déploiement Lancement
Lancer l’annuaire RMIREGISTRY
Lancer le serveur
Lancer le client
Cours WS 2023 Hassen Lazrag
Démarche RMI
Serveur
1. Créer l’objet distant
od: BanqueImpl
Client
4. Créer le stub Conversion(double mt):double
[Link](5) [Link]=50 [Link](5) [Link]=50
: STUB 5. Connexion : SKELETON
7. conversion(5) Port=x
[Link]=50
2. Publier
3. Récupérer
la référence de la référence de
l’objet distant Naming Service : IP et Port connus l’objet distant
Nom de l’objet distant Référence de l’objet distant
Banque Réf1 : IP /Port/ Ad mém
OD2 Réf2
Cours WS 2023 Hassen Lazrag
TP: Bank Project
Cours JEE 2023 Hassen Lazrag
Bank Project
Supposant qu’on veut créer un serveur RMI qui crée un
objet qui offre les services distants suivant à un client
RMI:
Convertir un montant de l’euro en DT
Consulter un compte par son code
Consulter la liste des comptes
Cours WS 2023 Hassen Lazrag
RMI Server Project
Cours MS 2023 Hassen Lazrag
Interface IBanqueRemote
Créer est une interface : IBanqueRemote dans le package rmi
L’interface RMI doit respecter deux exigences techniques :
o 1: cette interface doit hériter d’une interface qui s’appelle Remote formée par RMI
o 2: toutes les méthodes doivent lever l’exception « RemoteExeption ».
package rmi;
import [Link];
import [Link];
import [Link];
import [Link];
public interface IBanqueRemote extends Remote {
public double conversion(double mt) throws RemoteException;
public Compte consulterCompter(int code) throws RemoteException;
public List<Compte> listComptes() throws RemoteException;
}
Cours WS 2023 Hassen Lazrag
Classe Compte
Créer les entités de métiers :
o Créer la classe métier Compte:
package metier;
import [Link];
import [Link];
public class Compte implements Serializable{
private int code;
private double solde;
private Date dateCreation;
public Compte() {
super();
}
public Compte(int code, double solde, Date dateCreation) {
super();
[Link] = code;
[Link] = solde;
[Link] = dateCreation;
}
// Getters et Setters
Cours WS 2023 Hassen Lazrag
Service : BanqueRemoteService
Créer une classe qui s’appelle BanqueRmiService dans rmi.
L’implémentation de la classe doit respecter un certain nombre de
règles :
1ère règle : Cette classe doit hériter d’une classe Skeleton ,« un petit service
d’écoute », qui permet d’accéder à l’objet à distance : UnicastRemoteObject.
2ème règle : Cette classe doit implémenter l’interface IBanqueRemote
Implémenter toutes les méthodes
Créer un constructeur sans paramètres : le numéro de port est choisi arbitrairement
(on peut choisir un constructeur avec paramètres, mais c’est déconseiller car il faut
à chaque fois fixer le port)
Cours WS 2023 Hassen Lazrag
Couche rmi : classe BanqueRmiService
package rmi;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class BanqueRmiService extends UnicastRemoteObject implements IBanqueRemote {
public BanqueRmiService() throws RemoteException {
super();
}
@Override
public double conversion(double mt) throws RemoteException {
[Link]("Conversion du montant "+mt);
return mt*3.32;
}
Cours WS 2023 Hassen Lazrag
Couche rmi : classe IBanqueRemote
@Override
public List<Compte> listComptes() throws RemoteException {
[Link]("Consultation des comptes");
List<Compte> cptes = new ArrayList<Compte>();
[Link](new Compte(1, [Link]()*9000, new Date()));
[Link](new Compte(2, [Link]()*9000, new Date()));
[Link](new Compte(3, [Link]()*9000, new Date()));
return cptes;
}}
Cours WS 2023 Hassen Lazrag
Serveur: ServeurRMI
Créer une classe ServeurRMI
avec une méthode main.
Ce serveur exécute les taches
suivantes:
1. démarrer le serveur annuaire
2. Instancier l’objet distante od
(créer l’objet)
3. Publier la référence de cette
objet dans un annuaire
Cours WS 2023 Hassen Lazrag
Classe ServeurRMI
import [Link];
import [Link];
import [Link];
import [Link];
public class ServeurRMI {
public static void main(String[] args) {
try {
//1. Demarrage par programmation de l'annuaire
[Link](1099);
//2. Creation de l'objet
BanqueRmiService od = new BanqueRmiService();
//4. Affichage de l'objet distant
[Link]([Link]());
//2. Publication la Ref de l'objet dans l'annuaire
[Link]("rmi://localhost:1099/BK", od);
} catch (Exception e) {
// TODO Auto-generated catch block
[Link]();
}
}
}
Cours WS 2023 Hassen Lazrag
RMI Client Project
Cours MS 2023 Hassen Lazrag
Projet RMIClient
Le client a besoin seulement de l’interface IBanqueRemote :
Copier le package rmi du serveur vers le client, sauf qu’on a pas besoin de la
classe d’implémentation.
l’interface a besoin aussi de la classe Compte, on doit copier le package
metier aussi : généralement les entités manipuler doit se trouver dans les deux
côtés
Créer le client : La classe ClientRMI avec main
Cours WS 2023 Hassen Lazrag
Client: classe ClientRMI
public class ClientRMI {
public static void main(String[] args) {
try {
IBanqueRemote stub = (IBanqueRemote)
[Link]("rmi://localhost:1099/BK");
[Link]([Link](1500));
[Link]("-------Consultation d'un compte à distance------");
Compte cp= [Link](2);
[Link]("Code= "+[Link]());
[Link]("Solde= "+[Link]());
[Link]("Date= "+[Link]());
[Link]("-------Consultation de la liste des comptes------");
List<Compte> cptes = [Link]();
for(Compte c:cptes) {
[Link]("----------------------------");
[Link]("Code= "+[Link]());
[Link]("Solde= "+[Link]());
[Link]("Date= "+[Link]());
}
} catch (Exception e) {
[Link]();
}
}
}
Cours WS 2023 Hassen Lazrag
Exécution:
Dans l’IDE
Exécuter le serveur
Exécuter le client
Cours WS 2023 Hassen Lazrag