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