Systèmes et Applications Répartis

Programming, RPC, RMI, JMS · exam

Browse all programmation documents

Ecole Nationale des Sciences de l’Informatique

A. U. : 2013/2014

EXAMEN

Systèmes et Applications Répartis

Classe/Filières:

Durée :

Responsables : F. Najjar & N. Ben Azzouna

II2- SLE & RSR

2h00

02/06/2014

Date:

Documents: Non autorisés

Nb. Pages: 4

Prière de lire attentivement l’énoncé.

On demande des réponses concises mais claires et précises.

Exercice1 : Questions diverses (7 points – 1,5+1+1,5+0,5 +1+1+0,5)

1) Comparez les deux mécanismes de communication RPC et RMI, en complétant la table ci-

dessous :

Plateforme

(1/multi)

Langage de

programmation

RPC

RMI

…………………… ……………………

…………………… ……………………

Utilitaire d’IDL …………………… ……………………

Protocole réseau …………………… ……………………

Serveur de

nommage

…………………… ……………………

Extra

…………………… ……………………

2) Quelle commande Unix vous permet de vérifier quels sont les services RPC disponibles sur

votre serveur. En donnez au moins deux exemples communs de services.

3) Que fait chacune des commandes suivantes :

a) rpcinfo –u localhost 53667767

b) java -Djava.security.policy=../tous.policy \

-Djava.rmi.server.codebase=http://machine.ensi.rnu.tn/ \

chat.server.RemoteServerImpl MonNomServer

1

4) On suppose donner le code suivant, représentant un objet distant:

interface RobjInt extends Remote{

public void faire();

}

public class Robj implements RobjInt

extends UnicastRemoteObject{

public void faire(){

// code …

}

}

Afin d’obtenir une référence à l’objet distant, dire quelle ligne de code vous devriez

utiliser?

a) Robj q = (Robj)Naming.Lookup(...);

b) Robj q = Naming.Lookup(...);

c) Robj q = (RobjInt)Naming.Lookup(...);

d) RobjInt q = Naming.Lookup(...);

e) RobjInt q = (RobjInt)Naming.Lookup(...);

5) On rappelle que JMS est basé sur un ensemble de concepts de messagerie. Complétez le

tableau suivant par les interfaces correspondantes :

JMS parent

Destination

Session

Modèle

Point- to-Point

……………………

Modèle

Publish-Subscribe

……………………

…………………… ……………………

MessageProducer

……………………

……………………

MessageConsumer

……………………

……………………

6) Pour un client MOM, quelle est la différence entre réception synchrone et réception

asynchrone ?

7) Expliquer la relation entre JMS, JORAM et Scalagent.

Exercice 2: RPC (6 points—1,5+0,75+0,75+1,5+1,5)

On souhaite mettre en place un service de gestion de vols aériens (départs et arrivées) dans un

aéroport permettant de :

 Rajouter une ligne information (RefVol, campagnie, dest./départ, heure, etat) –int

Advertisement

AddRow(Info ligne)

 Supprimer une ligne –int DeleteRow(string Ref_vol)

2

 Retrouver l’heure à partir d’une référence de vol --Time FindH(string Ref_vol)

 On suppose que les type string et Time sont déjà prédéfinis.

1) Ecrire deux interfaces en RPCL, l’une utilisée par les employés de l’aéroport, Tableau.x,

et l’autre par les clients/voyageurs, RTable.x, qui leur permettent une consultation.

2) Dire à quoi sert le fichier RTable_xdr.c correspondant au fichier RTable.x?

3) On ne vous demande pas d’écrire tout le serveur mais seulement de donner le prototype de la

fonction FindH dans le serveur.

4) Comment un client, placé sur un site différent du serveur, peut s’y connecter et puis faire

appel à distance de la fonction FindH(TU 21537).

5) On souhaite modifier le serveur afin qu’il puisse offrir une autre fonction, FindBox, qui

retourne le numéro de box d’enregistrement pour une destination donnée. En donnez

l’interface RTable en RPCL de ce nouveau service. Et dire comment un client peut faire

appel à la fois à FindH(TU_2137) et puis FindBox(Lyon)? Expliquez succinctement

votre solution.

Exercice 3 : Réservation de chambre à distance par RMI (7 points— 1+1+2+1+1+…)

On considère une application client/serveur de réservation de chambre d’hôtel en ligne. Le service

distant correspondant s’appelle ReservationChambre. Il offre les opérations suivantes :

 int ReserverChambre(Information inf) qui permet de réserver une

chambre en se basant sur les informations encapsulées dans un objet de type

Information et rend une référence de réservation de type int. Une référence

nulle indique un échec de réservation.

 boolean AnnulerReservation(int ref) qui permet d’annuler une

réservation de chambre en se basant sur sa référence passée en paramètre et qui retourne

un boolean.

 Information DetailsReservation(int ref) qui rend les informations

concernant une réservation identifiée par sa référence.

Nous supposons pour toutes les classes d’implémentation le nom de la classe se termine

par Impl. Par exemple, la classe d’implémentation de ReservationChambre

s’appelle ReservationChambreImpl.

1) Quelle(s) condition(s) doit (doivent) être satisfaite(s) par les méthodes ReserverChambre

et AnnulerReservation pour y assurer un accès distant et concurrent ?(0,5 pt)

2) Ecrire l’interface correspondant à ce service.(1 pt)

3

3) L’entité Information sera implantée côté client et passée par valeur lors de l’invocation de

ReserverChambre. Quelle(s) condition(s) doit

(doivent) être

satisfaite(s) par

Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette

méthode ?(1 pt)

4) L’entité Information est actuellement passée par référence au serveur lors de l’appel de

ReserverChambre. Quelles modifications doivent être faites au niveau de l’objet

Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette

méthode ?(1 pt)

5) Parmi les choix d’implémentation faits au niveau des questions 3 et 4, quel est selon vous le

meilleur choix ? Justifier. (1 pt)

Ecrire l’implantation de Compte (CompteImpl).

6) Ecrire le code du client ReservationClient qui permet de : (1,5 pt)

 Récupérer une référence sur

l’instance de

l’objet ReservationChambre

enregistrée

dans

rmiregistry

en

utilisant

l’URL

correspondante :

rmi://machineServeur/Reservation.

 Créer une instance de l’objet Information qui prend 5 paramètres : le nom, le

nombre de chambres, le nombre de nuitées, le prix d’une nuitée et la date d’arrivée.

 Passer

une demande de

réservation de

chambre

auprès de

l’objet

ReservationChambre distant.

 Afficher la référence de réservation correspondante.

Bonne Réflexion

4

Proposition de Correction de l’Exam SAR du 02/06/2014

Exercice1 : Questions diverses (7 points – 1,5 +1+1,5+0,5+1+1+0,5)

1) Comparez les deux mécanismes de communication RPC et RMI, en complétant la table ci-dessous :

(1,5 --6 * 0,25/ligne)

Plateforme

(1/multi)

Langage de

programmation

RPC

Multi

Advertisement

RMI

Multi

C, C++, …

JAVA

Utilitaire d’IDL

rpcgen

Javac (rmic)

Protocole réseau

TCP/IP

TCP/IP, http,

IIOP

Serveur de

nommage

portmapper

Rmi(registry)

Extra

base de NFS

Rmi dynamique

0,

25

2) Quelle commande Unix vous permet de vérifier quels sont les services RPC disponibles sur

votre serveur. En donnez au - deux exemples communs de services. (1pt –0,5+2*0,25)

La commande rpcinfo –p permet de lister tous les programmes/services rpc tels

que portmap, rpcbind, NFS, …

3) Que fait chacune des commandes suivantes:

a) rpcinfo –u localhost 53667767

(0,5 pt)

Appelle la procédure 0 du programme numéro 53667767 sur la machine

localhost. Genre de ping afin de vérifier le bon fonctionnement du réseau et

que le serveur est opérationnel.

b) java -Djava.security.policy=../tous.policy \

(1 pt)

-Djava.rmi.server.codebase=http://machine.ensi.rnu.tn/ \

chat.server.RemoteServerImpl MonNomServer

5

Après lancement de rmiregistry, Lancez le Server MonNomServer en lui

indiquant quel fichier politique de sécurité (tous.policy) à utiliser et

quel est le codebase, c-à-d quel est l'URL du serveur HTTP capable de

servir les classes nécessaires pour utiliser ce serveur.

4) On suppose donner le code suivant, représentant un objet distant:

(0,5 pt)

interface RobjInt extends Remote{

public void faire();

}

public class Robj implements RobjInt

extends UnicastRemoteObject{

public void faire(){

// code …

}

}

Afin d’obtenir une référence à l’objet distant, dire quelle ligne de code vous devriez

utiliser?

a) Robj q = (Robj)Naming.Lookup(...);

b) Robj q = Naming.Lookup(...);

c) Robj q = (RobjInt)Naming.Lookup(...);

d) RobjInt q = Naming.Lookup(...);

e) RobjInt q = (RobjInt)Naming.Lookup(...);

5) On rappelle que JMS est basé sur un ensemble de concepts de messagerie. Complétez le

tableau suivant par les interfaces correspondantes :

(1 pt –4*0,25/ligne)

JMS parent

Modèle P-to-P

Modèle Pub-Sub

Destination

Queue

Topic

Session

QueueSession

TopicSession

MessageProducer

QueueSender

TopicSender

MessageConsumer QueueReceiver

TopicReceiver

6) Pour un client MOM, quelle est la différence entre réception synchrone et réception

asynchrone ?

(1 pt)

Réception synchrone  délivrance en mode pull ou consommation explicite

Réception asynchrone  délivrance en mode push ou consom. implicite

6

7) Expliquer la relation entre JMS, JORAM et Scalagent.

(0,5 pt)

JORAM – architecture MOM distribuée de l’implémentation JMS (OD)

Advertisement

Scalagent –implémentation de JMS d’agents distribués

Exercice 2 : RPC (6 points—1,5+1+0,75+1,25+1,5)

1) Ecrire deux interfaces en RPCL, l’une utilisée par les employés de l’aéroport, Tableau.x,

et l’autre par les clients/voyageurs, RTable.x, qui leur permettent une consultation.

(1,5 pt –2*0,75)

Tableau.x

RTable.x

program RVols {

version RVol_VERS {

void VNULL (void) = 0;

Time FindH(String

Ref_vol)=1;

} = 1;

} = 0x34567891;

struct string chaine <25>

struct ligne {

chaine RefVol, campagnie;

chaine dest_dep;

Time heure,

chaine etat;

}

Typedef Info ligne ;

program GVols {

version GVols_VERS {

void VNULL (void) = 0;

int AddRow (Info)= 1;

int DeleteRow(string

Ref_vol)=2;

Time FindH(String Ref_vol)=3;

} = 1;

} = 0x23456789;

2) Dire à quoi sert le fichier RTable_xdr.c correspondant au fichier RTable.x? (0,75 pt)

RTable_xdr.c est un filtre ou une représentation des données, généré par

rpcgen sur RTable.x

3) On ne vous demande pas d’écrire tout le serveur mais seulement de donner le prototype de la

(0,75 pt)

fonction FindH dans le serveur. Expliquez brièvement.

Time FindH_1_svc(string vol, struct svc_req *rqstp)

Le post fixe indique la version (ici 1) et svc (implémentation coté serveur)

7

4) Comment un client, placé sur un site différent du serveur, peut s’y connecter et puis faire

(1,5 pt –1+0,5)

appel à distance de la fonction FindH(TU_21537).

CLIENT *clnt ;

clnt= clnt_create(server, RVols, RVols_VERS, path)?.

Connecter le client au serveur hébergeant le programme RVols de version

RVols_VERS

Time t=FindH_1(TU_2137, clnt)

5) On souhaite modifier le serveur afin qu’il puisse offrir une autre fonction, FindBox, qui

retourne le numéro de box d’enregistrement pour une destination donnée. En donnez

l’interface RTable en RPCL de ce nouveau service. Et dire comment un client peut faire

appel à la fois à FindH(TU_2137) et puis FindBox(Lyon)? Expliquez succinctement

(1,5 pt –2*0,75)

votre solution.

On rajoute dans RTable.x

program RVols {

version RVol_VERS {

void VNULL (void) = 0;

Time FindH(String Ref_vol)=1;

} = 1;

version RVol_VERS2 {

void VNULL (void) = 0;

//possible de ne pas mettre reprendre FindH

// mais ca va demander de se connecter apres 2 fois

Time FindH(String Ref_vol)=1;

Int FindBox(string name)= 2;

} = 2;

} = 0x34567891;

Ainsi, à l’appel des deux fonctions on se connecte une seule fois à version 2 ;

et dans le serveur la fonction FindH_2_svc fait appel elle-même FindH_1_svc

CLIENT *clnt ;

clnt= clnt_create(server, RVols, RVols_VERS2, path)?.

Time t=FindH_2(TU_2137, clnt) ; int nb = FindBox(Lyon) ;

8

Exercice 3 : Réservation de chambre à distance par RMI (7 points—

1+1+2+1+1)

1) Quelle(s) condition(s) doit (doivent) être satisfaite(s) par les méthodes ReserverChambre

et AnnulerReservation pour y assurer un accès distant et concurrent ?(0,5pt)

public et synchronized

2) Ecrire l’interface correspondant à ce service.(1pt)

import java.rmi.RemoteException;

import java.rmi.Remote;

public interface ReservationChambre extends Remote {

Advertisement

public int ReserverChambre(Information inf) throws RemoteException;

public boolean AnnulerReservation(int ref) throws RemoteException;

public Information DetailsReservation(int ref) throws RemoteException;

}

3) L’entité Information sera implantée côté client et passée par valeur lors de l’invocation de

ReserverChambre. Quelle(s) condition(s) doit

(doivent) être

satisfaite(s) par

Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette

méthode ?(1pt)

Etre Serializable ainsi que tous les objets qu’elle encapsule éventuellement.

ReservationChambre, ReservationChambreImpl, Information, InformationImpl

4) L’entité Information est actuellement passée par référence au serveur lors de l’appel de

ReserverChambre. Quelles modifications doivent être faites au niveau de l’objet

Information ? De quels fichiers class le serveur a-t-il besoin pour pouvoir exécuter cette

méthode ?(1pt)

Avoir une interface Remote et être exportée ou bien en héritant de UnicastRemoteObject ou

bien par appel de la méthode UnicastRemoteObject.exportObject(this).

ReservationChambre, ReservationChambreImpl, Information

5) Parmi les choix d’implémentation faits au niveau des questions 3 et 4, quel est selon vous le

meilleur choix ? Justifier. (1pt)

Celui de la question 3 parce que les informations concernant une réservation sont statiques

donc il vaut mieux passer une copie de ces informations et les exploiter localement : ça réduit la

charge au niveau du réseau et le temps de réponse.

6) Ecrire le code du client ReservationClient qui permet de :

9

Ecrire l’implantation de Compte (CompteImpl).

 Récupérer une référence sur

l’instance de

l’objet ReservationChambre

enregistrée

dans

rmiregistry

en

utilisant

l’URL

correspondante :

rmi://machineServeur/Reservation.

 Créer une instance de l’objet Information qui prend 5 paramètres : le nom, le

nombre de chambres, le nombre de nuitées, le prix d’une nuitée et la date d’arrivée.

 Passer

une demande de

réservation de

chambre

auprès de

l’objet

ReservationChambre distant.

 Afficher la référence de réservation correspondante.

ReservationObj

import java.rmi.Naming;

import java.rmi.server.UnicastRemoteObject;

public class ReservationClient {

public static void main(String args[]) {

try {

// Récupération d'un stub sur l'objet serveur.

ReservationChambre

Naming.lookup("rmi://machineServeur/Reservation");

//Création et exportation d’une instance de l’objet Etudiant

Information

InformationImpl("Nom", "date",nombrechambre,nombrenuitees, prix) ;

int ref = ReservarionObj.ReserverChambre(inf);

if (ref !=0)

System.out.println("La référence de réservation est "+ref) ;

else

System.out.println("Echec de réservation") ;

inf

=

=

(ReservationChambre)

new

} catch (Exception e) {

System.out.println("ReservationClient err: " + e.getMessage()) ;

e.printStackTrace(); }

}

}

7) L’entité Information possède une méthode getdate () qui rend la date d’arrivée à

l’hôtel. Cette méthode est appelée dans ReserverChambre afin de vérifier les disponibilités.

Si on considère le choix fait dans la question 3, cette méthode sera exécutée par la JVM serveur

ou client ? Justifier.

JVM serveur puisque Information est passée par copie et l’invocation est faite localement au

niveau du serveur sur le clone.

10