Java RMI

Transcription

Java RMI
Université de Provence
M ASTER I NFORMATIQUE
Programmation Parallèle
et Distribuée
2011-2012
Java RMI
1
RMI
1. Donner toutes les manières possibles d’obtenir un objet distant. Pour chacune d’entre elles,
proposer un exemple illustratif.
2. Un objet distant peut-il être considéré comme une variable partagée entre différents clients
RMI ? Si oui, comment doit-on gérer les accès concurrent ?
3. Qu’est-ce qu’un ramasse-miette ? En quoi un ramasse-miette distribué devrait être différent
d’un ramasse-miette local.
2
Calcul Parallèle
Etant donnée la formule de Leibniz :
∞
X
(−1)n
2n + 1
n=0
n
Pj
Il s’agit ici de distribuer le calcul en sous-sommes de i à j ( n=i (−1)
2n+1 ). Le client devra distribue le calcul parmi un certain nombre de serveurs.
1. Quel est le problème avec le code ci-après ? Comment peut-on résoudre le problème ?
Calcul.java
π = 4 arctan(1) = 4
import j a v a . rmi . ∗ ;
import j a v a . math . ∗ ;
public i n t e r f a c e C a l c u l extends Remote {
/ / m e t h o d e c a l c u l a n t l a somme d e i a j
public BigDecimal c a l c u l e r ( i n t debut , i n t f i n )
throws RemoteException ;
}
CalculImpl.java
import j a v a . rmi . ∗ ;
import j a v a . rmi . s e r v e r . ∗ ;
import j a v a . math . ∗ ;
public c l a s s CalculImpl extends UnicastRemoteObject implements C a l c u l {
public CalculImpl ( ) throws RemoteException {
super ( ) ;
}
public BigDecimal c a l c u l e r ( i n t debut , i n t f i n ) {
BigDecimal somme = BigDecimal . ZERO ;
f o r ( i n t j =debut ; j < f i n ; j + + ) {
i n t c o e f f = ( j %2==0)?1: −1;
BigDecimal terme = new BigDecimal ( c o e f f / ( 2 . 0 ∗ j + 1 . 0 ) ) ;
somme = somme . add ( terme ) ;
}
somme=somme . m u l t i p l y (new BigDecimal ( 4 ) ) ;
r e t u r n somme ;
}
}
1
CalculServer.java
import j a v a . math . ∗ ;
import j a v a . rmi . ∗ ;
public c l a s s C a l c u l S e r v e r {
public s t a t i c void main ( S t r i n g a r g s [ ] ) {
i f ( args . length ! =1 ) {
System . out . p r i n t l n ( " Syntaxe : j a v a C a l c u l S e r v e r p o r t " ) ;
}
try {
/ / C r e a t i o n d e l ’OD
CalculImpl od = new CalculImpl ( ) ;
/ / E n r e g i s t r e m e n t d e l ’OD d a n s RMI
Naming . rebind ( " // l o c a l h o s t : " + a r g s [ 0 ] + " / c a l c u l " , od ) ;
System . out . p r i n t l n ( " E n r e g i s t r e m e n t termine . . . " ) ;
}
catch ( Exception e ) {
System . out . p r i n t l n ( " L ’ e n r e g i s t r e m e n t a echoue . . . \ n " +e ) ;
}
}
}
CalculClient.java
import
import
import
import
j a v a . rmi . ∗ ;
j a v a . rmi . r e g i s t r y . ∗ ;
java . net . ∗ ; / / pour l e s u r l
j a v a . math . ∗ ;
public c l a s s C a l c u l C l i e n t {
public s t a t i c void main ( S t r i n g a r g s [ ] ) {
i n t nbServeur= a r g s . l e n g t h / 2 ;
int n ;
BigDecimal t o t a l = BigDecimal . ZERO ;
C a l c u l [ ] od=new C a l c u l [ nbServeur ] ;
i f ( a r g s . l e n g t h %2!=1) {
System . out . p r i n t l n ( " Syntaxe : j a v a C a l c u l C l i e n t n s e r v e u r 1 p o r t 1 s e r v e u r 2 p o r t 2 . . . " ) ;
}
else {
n= I n t e g e r . p a r s e I n t ( a r g s [ 0 ] ) ;
f o r ( i n t j = 0 ; j <nbServeur ; j + + ) {
/ / c r e a t i o n de l ’ u r l
S t r i n g u r l = " // " + a r g s [ 2 ∗ j +1]+ " : " + a r g s [ 2 ∗ j +2] + " / c a l c u l " ;
System . out . p r i n t l n ( "URL : " + u r l ) ;
/ / r e c u p e r a t i o n de l ’ o b j e t d i s t a n t
try {
od [ j ] = ( C a l c u l ) Naming . lookup ( u r l ) ;
}
c a t c h ( NotBoundException e ) { }
c a t c h ( MalformedURLException e ) { }
c a t c h ( RemoteException e ) { }
}
f o r ( i n t j = 0 ; j <nbServeur ; j + + ) {
/ / e x e c u t i o n de l a methode d i s t a n t e
try {
BigDecimal soussomme = od [ j ] . c a l c u l e r ( j ∗n/nbServeur , ( j +1)∗n/nbServeur ) ;
System . out . p r i n t l n ( " Sous−somme" + j + " : " +soussomme . t o S t r i n g ( ) ) ;
t o t a l = t o t a l . add ( soussomme ) ;
}
c a t c h ( RemoteException e ) {
System . out . p r i n t l n ( " E x c e p t i o n " +e ) ;
}
}
System . out . p r i n t l n ( " R e s u l t a t : " + t o t a l . t o S t r i n g ( ) ) ;
}
}
}
2