SlideShare une entreprise Scribd logo
1  sur  65
Télécharger pour lire hors ligne
RMI
Remote Method Invocation
Didier DONSEZ
Université Joseph Fourier (Grenoble 1) IMA – LSR/ADELE
'LGLHU'RQVH]#LPDJIU'LGLHU'RQVH]#LHHHRUJ
Hafid Bourzoufi
8QLYHUVLWpGH9DOHQFLHQQHV ,679
KWWSZZZDGHOHLPDJIUaGRQVH]FRXUV
50,
+%RXU]RXIL''RQVH]
2
Sommaire
■ Rappel et Limites des RPC (Remote Procedure Call)
■ Principe des RMI
■ Etapes de développement et d ’exécution
■ Paramètres des méthodes
■ Objet Activable
■ Personnalisation de la couche de transport
■ Ramasse-Miette distribuée
■ Autour des RMI
• CORBA, IIOP, EJB
50,
+%RXU]RXIL''RQVH]
3
Rappel des RPC
■ RPC (Remote Procedure Call)
• modèle client/serveur
• appel de procédures à distances entre un client et un serveur
• le client appelle une procédure
• le serveur exécute la procédure et renvoie le résultat
• Outil USFJHQ
• génère la souche d ’invocation et le squelette du serveur
(en C, C++, Fortran, …)
• la souche et le squelette ouvre un socket BSD et encode/décode les paramètres
• Couche de présentation ;'5 (eXchange Data Representation)
format pivot de représentation des données de types primitifs et structurés
(tableau de longueur variable, structures) quelque soit
ªl ’architecture (Little Endian/Big Endian, IEEE, …)
ªle langage (ordre ligne/colonne dans les tableaux C et les tableaux Fortran)
ªou le système (ASCII, IBM ’ECDCII, ...)
50,
+%RXU]RXIL''RQVH]
4
Limites des RPC
■ Limitations
• paramêtres et valeur de retour sont des types primitifs
• programmation procédurale
• dépendance à la localisation du serveur
• pas d ’ objet
• pas de « référence distante »
■ Evolutions
• CORBA
• Multilangage, multi-plateforme (architecture+OS), MuliVendeurs
• Java RMI
• mono-langage : Java, multiplateforme : de JVM à JVM
• DCOM / Object RPC / .NET Remoting
• multi-langages, plateforme Win32 principalement, il existe des implémentations (non
MicroSoft) pour Unix, Propriétaire
• .NET Remoting
• multi-langages (CLR), plateforme Win32 principalement
• Normalisé à l’ ECMA et à l’ ISO
• SOAP (Simple Access Object Protocol)
• multi-langages, multi-plateforme
• Réponse et requête en XML (DTD SOAP), Transport sur HTTP, IETF
50,
+%RXU]RXIL''RQVH]
5
Principes des RMI
■ RPC à la Java
• invoquer de façon simple des méthodes sur des objets distribués.
■ Outils
• pour la génération des stub/skeleton, l ’ enregistrement par le nom, l ’activation
• Tous les détails ( connexion, transfert de données ..)
sont transparents pour le développeur grâce au stub/skeleton généré
■ Mono-langage et Multiplateforme.
• Java : de JVM à JVM OHVGRQQpHVHWREMHWVRQWODPrPHUHSUpVHQWDWLRQTTVOD-90
■ Orienté Objet
• Les RMIs utilisent le mécanisme standard de sérialisation de JAVA
pour l ’envoi d ’objets.
■ Dynamique
• Les classes des Stubs et des paramêtres
peuvent être chargées dynamiquement via HTTP (http://) ou NFS (file:/)
■ Sécurité
• un SecurityManager vérifie si certaines opérations sont autorisés par le serveur
50,
+%RXU]RXIL''RQVH]
6
Structure des couches RMI (i)
O ¶DUFKLWHFWXUHORJLTXH
OLHQW50,
$SSOLFDWLRQ $SSOHW  6HUYOHW
+HOOROLHQW+HOOR$SSOHW
6RXFKHRX6WXE
+HOOR,PSOB6WXE
RXFKHGH5pIpUHQFH
MDYDUPL1DPLQJ
RXFKHGH7UDQVSRUW
MDYDQHW6RFNHWSRXU73
5pVHDX
,3
6HUYHXU50,
+HOOR6HUYHUUPLG
6TXHOHWWHRX6NHOHWRQ
+HOOR,PSOB6NHO
RXFKHGH5pIpUHQFH
MDYDUPL1DPLQJ
RXFKHGH7UDQVSRUW
MDYDQHW6RFNHW6HUYHU SRXU73
,QYRFDWLRQGH
PpWKRGHV
VD+HOOR 
,QWHUIDFH'LVWDQWH
+HOOR
,PSOpPHQWDWLRQ'LVWDQWH
+HOOR,PSO
50,
+%RXU]RXIL''RQVH]
7
Structure des couches RMI (ii)
■ Souche RX6WXE (sur le client)
• représentant local de l’ objet distant qui implémente les méthodes
“exportées” de l ’ objet distant
• “marshalise” les arguments de la méthode distante et les envoie en un flot
de données au serveur
• “démarshalise” la valeur ou l ’objet retournés par la méthode distante
• la classe xx_Stub peut être chargée dynamiquement par le client (Applet)
■ Squelette RX6NHOHWRQ (sur le serveur)
• “démarshalise” les paramètres des méthodes
• fait un appel à la méthode de l’ objet local au serveur
• “marshalise” la valeur ou l ’objet renvoyé par la méthode
50,
+%RXU]RXIL''RQVH]
8
Structure des couches RMI (ii)
■ Couche des références distantes
• traduit la référence locale au stub en une référence à l’ objet
distant
• elle est servie par un processus tier : rmiregistry
■ Couche de transport
• écoute les appels entrants
• établit et gère les connexions avec les sites distants
• java.rmi.UnicastRemoteObject utilise les classes Socket et
SocketServer (TCP)
• cependant d ’ autres classes peuvent être utilisées par la
couche transport (Compression sur TCP, SSL sur TCP, UDP)
50,
+%RXU]RXIL''RQVH]
9
KRVWUHJ
KRVWUHJ
La configuration
UPLUHJLVWU
UPLUHJLVWU
KRVWFOL
KRVWFOL
OLHQW+HOOROLHQW
OLHQW+HOOROLHQW
KRVWZZZ
KRVWZZZ
KWWSG
KWWSG
KRVWVHU
KRVWVHU
6HUYHXU+HOOR6HUYHU
6HUYHXU+HOOR6HUYHU
,QVWDQFH
FODVV
6WXE 6NHO
,PSO
 
 
 
KWWSRXQIV
6RFNHW
50,
+%RXU]RXIL''RQVH]
10
KRVWUHJ
KRVWUHJ
L ’enregistrement de l ’objet
UPLUHJLVWU
UPLUHJLVWU
KRVWFOL
KRVWFOL
OLHQW+HOOROLHQW
OLHQW+HOOROLHQW
KRVWZZZ
KRVWZZZ
KWWSG
KWWSG
KRVWVHU
KRVWVHU
6HUYHXU+HOOR6HUYHU
6HUYHXU+HOOR6HUYHU
,QVWDQFH
FODVV
6WXE 6NHO
,PSO
+HOOR2EMHFW
 
 OHVHUYHXUHQUHJLVWUH
O·REMHWGLVWDQW
LOFRPPXQLTXH
XQHLQVWDQFHGH6WXE
 OHVHUYHXUFKDUJHOHVFODVVHV
6WXE HW6NHO
G ·DSUqVMDYDUPLVHUYHUFRGHEDVH
KWWSRXQIV
6RFNHW
50,
+%RXU]RXIL''RQVH]
11
KRVWUHJ
KRVWUHJ
La récupération du Stub
UPLUHJLVWU
UPLUHJLVWU
KRVWFOL
KRVWFOL
OLHQW+HOOROLHQW
OLHQW+HOOROLHQW
KRVWZZZ
KRVWZZZ
KWWSG
KWWSG
KRVWVHU
KRVWVHU
6HUYHXU+HOOR6HUYHU
6HUYHXU+HOOR6HUYHU
,QVWDQFH
FODVV
6WXE 6NHO
,PSO
+HOOR2EMHFW
 
 OHFOLHQWUpFODPHOH6WXEDVVRFLpj+HOOR2EMHFW
 UPLUHJLVWU UHWRXUQHOH6WXE
 OHFOLHQWFKDUJHODFODVVH6WXE
G ·DSUqVMDYDUPLVHUYHUFRGHEDVH
KWWSRXQIV
6RFNHW
50,
+%RXU]RXIL''RQVH]
12
KRVWUHJ
KRVWUHJ
Invocation d ’une méthode
UPLUHJLVWU
UPLUHJLVWU
KRVWFOL
KRVWFOL
OLHQW+HOOROLHQW
OLHQW+HOOROLHQW
KRVWZZZ
KRVWZZZ
KWWSG
KWWSG
KRVWVHU
KRVWVHU
6HUYHXU+HOOR6HUYHU
6HUYHXU+HOOR6HUYHU
,QVWDQFH
FODVV
6WXE 6NHO
,PSO
+HOOR2EMHFW
 
 OHFOLHQWLQYRTXH
XQHPpWKRGHVXUOH 6WXE
 OH6WXE© PDVKDOOH ª
OHVSDUDPrWUHVGHODPpWKRGH
HWOHVHQYRLHDXVHUYHXU
 OH6NHO © GHPDVKDOOH ªOHV
SDUDPqWUHVGHODPpWKRGH
HWLQYRTXHODPpWKRGHVXUO ·REMHW
UHWRXUQHOHUpVXOWDW PDUVKDOOp
 OH6WXE © GHPDVKDOOH ª
OHUpVXOWDWGHODPpWKRGH
DSSHOPpWKRGH
6RFNHW
50,
+%RXU]RXIL''RQVH]
13
Création et manipulation d'
objets
distants
■ 5 Packages
• java.rmi : pour accéder à des objets distants
• java.rmi.server : pour créer des objets distants
• java.rmi.registry : lié à la localisation et au nommage d’objets distants
• java.rmi.dgc : ramasse-miettes pour les objets distants
• java.rmi.activation support pour l ’ activation d ’objets distants.
■ Etapes du développement
1- Spécifier et écrire l'
interface de l'
objet distant.
2- Ecrire l'
implémentation de cette interface.
3- Générer les Stub/Skeleton correspondants. (outil rmic)
■ Etapes de l ’exécution
4- Ecrire le serveur qui instancie l'
objet implémentant l'
interface,
exporte son Stub puis attend les requêtes via le Skeleton.
5- Ecrire le client qui réclame l ’ objet distant, importe le Stub
et invoque une méthode de l'
objet distant via le Stub.
50,
+%RXU]RXIL''RQVH]
14
1- Spécifier l ’interface d'
un objet distant
■ Format
• l ’interface étend MDYDUPL5HPRWH
• les méthodes doivent pouvoir lever MDYDUPL5HPRWH([FHSWLRQ
■ Exemple
SDFNDJH H[DPSOHVKHOOR
SXEOLFLQWHUIDFH+HOOR H[WHQGV MDYDUPL5HPRWH^
SXEOLFVWDWLF ILQDO LQW (1   (QJOLVK
SXEOLF VWDWLF ILQDO LQW )5  )UHQFK
SXEOLF VWDWLF ILQDO LQW (6   6SDQLVK
6WULQJ VD+HOOR WKURZV MDYDUPL5HPRWH([FHSWLRQ
6WULQJ VD+HOOR 6WULQJ QDPH WKURZVMDYDUPL5HPRWH([FHSWLRQ
6WULQJ VD+HOOR 6WULQJ QDPH LQWODQJ WKURZVMDYDUPL5HPRWH([FHSWLRQ
`
50,
+%RXU]RXIL''RQVH]
15
Implémentation de l ’objet distant
■ La classe HelloImpl
• doit implémenter l ’interface distante Hello
• et étendre une des sous-classes de java.rmi.server.RemoteServer
comme java.rmi.server.UnicastRemoteObject
■ java.rmi.server.UnicastRemoteObject
• sous classe le plus souvent utilisée
• offre toutes les fonctionnalités des classes distantes
• appelle la classe squelette pour la (dé)marshalisation
• utilise TCP/IP pour la couche transport
50,
+%RXU]RXIL''RQVH]
16
Implémentation de l ’objet distant
SDFNDJH H[DPSOHVKHOOR
SXEOLFFODVV +HOOR,PSOH[WHQGV MDYDUPLVHUYHU8QLFDVW5HPRWH2EMHFW LPSOHPHQWV +HOOR ^
SULYDWHLQWGHIDXOWODQJ
SXEOLF +HOOR,PSO LQWGHIDXOWODQJ WKURZV MDYDUPL5HPRWH([FHSWLRQ^
VXSHU WKLVGHIDXOWODQJ GHIDXOWODQJ`
SXEOLF6WULQJ VD+HOOR ^UHWXUQ VD+HOOR QXOO GHIDXOWODQJ `
SXEOLF6WULQJ VD+HOOR 6WULQJ QDPH ^UHWXUQ VD+HOOR QDPH GHIDXOWODQJ `
SXEOLF6WULQJ VD+HOOR 6WULQJ QDPH LQWODQJ ^
VZLWFK ODQJ ^
FDVH+HOOR(1EUHDNFDVH+HOOR)5EUHDNFDVH+HOOR(6EUHDN
GHIDXOW  ODQJ +HOOR(1`
VZLWFK ODQJ ^
FDVH+HOOR(1UHWXUQ+HOOR QDPH QXOO :RUOG QDPH 
FDVH+HOOR)5UHWXUQ%RQMRXU QDPH QXOO WRXWOHPRQGH QDPH 
FDVH+HOOR(6UHWXUQ+ROD  QDPH QXOO WRGRHOPXQGR QDPH 
GHIDXOW UHWXUQ QXOO`
`// methodStringsayHello(Stringname, int lang)
`// classHelloImpl
50,
+%RXU]RXIL''RQVH]
17
La génération des Stub et Skeleton
■ L ’outil rmic génère
• la classe souche examples.hello.HelloImpl_Stub
• la classe squelette examples.hello.HelloImpl_Skel
à partir de l ’ implémentation examples.hello.HelloImpl
■ Exemple VRXV:LQ
VHW/$663$7+ /$663$7+PFODVVHV
MDYDF G?PFODVVHV +HOORMDYD
MDYDF G?PFODVVHV+HOOR,PSOMDYD
UPLF NHHSJHQHUDWHG GPFODVVHVH[DPSOHVKHOOR+HOOR,PSO
5HPDUTXH NHHSJHQHUDWHG à conserve les sources des Stub et Skeleton
50,
+%RXU]RXIL''RQVH]
18
Implémentation
du serveur de l ’objet distant
• Crée un ou plusieurs objets distants (une ou plusieurs classes)
• Naming.bind() : les enregistre auprès du serveur de liaison
UPLUHJLVWU
■ Exemple
SDFNDJH H[DPSOHVKHOOR
SXEOLFFODVV +HOOR6HUYHU ^
SXEOLF VWDWLFYRLG PDLQ 6WULQJ DUJV@ ^DUJXPHQWO ¶K{WHSRUWGXUPLUHJLVWU
UpHHW,QVWDOOHXQ6HFXULW0DQDJHU
LI 6VWHPJHW6HFXULW0DQDJHU  QXOO ^
6VWHPVHW6HFXULW0DQDJHU QHZMDYDUPL50,6HFXULW0DQDJHU `
WU ^
LQVWDQFLHO ¶REMHW
+HOOR,PSOREM QHZ +HOOR,PSO +HOOR(1 
(QUHJLVWUHO ¶REMHWVRXVOHQRP+HOOR2EMHFWDXSUqVGHUPLUHJLVWU
MDYDUPL1DPLQJELQG DUJV@+HOOR2EMHFWREM 
`FDWFK ([FHSWLRQH ^HSULQW6WDFN7UDFH `
``
• MDYDF G?PFODVVHV+HOOR6HUYHUMDYD
50,
+%RXU]RXIL''RQVH]
19
Implémentation
du serveur de l ’objet distant
■ Remarques
• L ’ objet distant servi peut être d ’ une sous classe de HelloImpl
SXEOLFFODVV +HOOR(6,PSOH[WHQGV +HOOR,PSO ^
SXEOLF+HOOR(6,PSO WKURZV MDYDUPL5HPRWH([FHSWLRQ^VXSHU +HOOR(6 `
`
HWGDQV+HOOR6HUYHU
MDYDUPL1DPLQJUHELQG DUJV@+HOOR2EMHFWQHZ+HOOR(6,PSO 
• Le serveur peut crée et enregistré
plusieurs objets appartenant à une ou plusieurs classes
• l ’enregistrement peut se faire auprès des plusieurs rmiregistry
50,
+%RXU]RXIL''RQVH]
20
Implémentation
du serveur de l ’objet distant
■ Remarques
• il faut prévoir une procédure d ’arrêt (shutdown) du serveur
• Demande d ’ arrêt
Unix : kill SIGQUIT 12345
Win32 : ??
• Arrêt des objets UnicastRemoteObject
publicstaticvoidNaming.unbind(Stringname)
publicstaticbooleanUnicastRemoteObject.unexportObject(Remote, booleanforce)
• Dans les exemples et tutoriels, le serveur est constitué par la
méthode main(Stringargs[]) de l ’ implémentation HelloImpl
50,
+%RXU]RXIL''RQVH]
21
Implémentation
d ’un client invoquant l ’objet distant
• Demande un stub auprès du serveur de liaison UPLUHJLVWU
• invoque des méthodes sur le stub chargé
■ Exemple (Application)
SDFNDJH H[DPSOHVFOLHQW
SXEOLFFODVV +HOOROLHQW ^
SXEOLFVWDWLFYRLG PDLQ 6WULQJ DUJV@ ^
6WULQJPHVVDJH EODQN
WU ^UpFXSqUHOHVWXEGHO ¶REMHWHQUHJLVWUpDXQRPGH© +HOOR2EMHFW ª
+HOOR REM  +HOOR MDYDUPL1DPLQJORRNXS  DUJV@+HOOR2EMHFW 
LQYRFDWLRQGHVPpWKRGHV
PHVVDJH REMVD+HOOR  6VWHPRXWSULQWOQ PHVVDJH 
PHVVDJH REMVD+HOOR DUJV@  6VWHPHUUSULQWOQ PHVVDJH 
6VWHPHUUSULQWOQ REMVD+HOOR DUJV@ ,QWHJHUSDUVH,QW DUJV@ 
`FDWFK ([FHSWLRQH ^HSULQW6WDFN7UDFH `
``
• MDYDF G?PFODVVHV+HOOROLHQWMDYD
50,
+%RXU]RXIL''RQVH]
22
Implémentation
d ’un client invoquant l ’objet distant
■ Exemple (Applet)
LPSRUWMDYDUPL1DPLQJ
SXEOLFFODVV +HOOR$SSOHWH[WHQGV MDYDDSSOHW$SSOHW^
6WULQJPHVVDJH EODQN
SXEOLFYRLGLQLW ^
WU ^UpFXSqUHOH VWXE GHO ¶REMHWHQUHJLVWUpDXQRPGH© +HOOR2EMHFW ª
5HPDUTXHUPLUHJLVWUHWOHVHUYHXU:HEGRLWrWUHVXUODPrPHPDFKLQH PrPH,3
+HOOR REM  +HOOR 1DPLQJORRNXS JHWRGH%DVH JHW+RVW +HOOR2EMHFW 
LQYRFDWLRQG ¶XQHGHVPpWKRGHV
PHVVDJH REMVD+HOOR 
`FDWFK ([FHSWLRQH ^VRUWLHG ¶HUUHXUVXUODFRQVROH
6VWHPRXWSULQWOQ HelloApplet exception:HJHW0HVVDJH HSULQW6WDFN7UDFH 
`
`
SXEOLF YRLGSDLQW MDYDDZW*UDSKLFVJ ^ JGUDZ6WULQJ PHVVDJH `
`
• MDYDF G?PFODVVHV+HOOR$SSOHWMDYD
50,
+%RXU]RXIL''RQVH]
23
L ’exécution
Coté Serveur
■ Le serveur de liaison rmiregistry
• expose un objet distant serveur de liaisons (de noms)
• le port de liaison par défaut est le port TCP 1099
KRVWUHJ! UPLUHJLVWU
A
KRVWUHJ! UPLUHJLVWU 
A
KRVWUHJ! UPLUHJLVWU 
• cet objet fait la correspondance entre nom et instance de Stub
enregistré par le(s) serveur(s) avec Naming.bind()
50,
+%RXU]RXIL''RQVH]
24
L ’exécution Coté Serveur
L ’accès au serveur de liaison
■ La classe Naming
• encaspule le dialogue avec plusieurs objets serveur de liaison
• URL de liaison
rmi://hostreg:2001/Hello/World
rmi://:2001/Hello/World
//:2001/Hello/World
/Hello/World
• Méthodes Statiques
• ELQG 6WULQJ XUO 5HPRWH U UHELQG 6WULQJ XUO5HPRWH U XQELQG 6WULQJ XUO
enregistre/désenregistre un objet auprès du serveur
• 5HPRWHORRNXS 6WULQJXUO
retourne un stub
• 6WULQJ@ OLVW
liste les noms enregistrés
50,
+%RXU]RXIL''RQVH]
25
L ’exécution Coté Serveur
L implantation du serveur de liaison
■ Les objets serveur de liaison
• réalise la correspondance nom avec stub
• Interface d ’ un objet serveur de liaison
• VXQUPLUHJLVWU5HJLVWU H[WHQGV MDYDUPL5HPRWH
• Implémentation par défaut de l ’ objet serveur de liaison
• VXQUPLUHJLVWU5HJLVWU,PSO
• Méthodes non statiques
• ELQG UHELQG XQELQG ORRNXS OLVW
■ La classe LocateRegistry
• localise ou active un objet serveur de liaison
• Méthodes Statiques
• 5HJLVWUFUHDWH5HJLVWU LQW SRUW
crée un objet serveur de liaison sur le port spécifié
• 5HJLVWUJHW5HJLVWU LQW SRUW
récupère l ’ objet serveur de liaison qui a été crée
50,
+%RXU]RXIL''RQVH]
26
L ’exécution
Coté Serveur
■ Le serveur d ’objets distants
• OH 6WXE GRLWrWUHGDQVOH/$663$7+RXFKDUJHDEOHYLD)6RX+773
• KHOORSROLF DXWRULVHO ¶XVDJHGX DFFHSW HWGX FRQQHFW VXUOHV 6RFNHWV
hostserjava
-Djava.security.policy=./hello.policy
-Djava.rmi.server.codebase=http://hostwww/hello/myclasses/
examples.hello.HelloServer hostreg:1099
• 0DLVDXVVL
-Djava.rmi.server.codebase=file://dev/hello/myclasses/Unix
-Djava.rmi.server.codebase=file:/c:devhellomyclasses/ Win32
• KHOORSROLF
grant { permissionjava.net.SocketPermission*:1024-65535,connect,accept;
permissionjava.net.SocketPermission*:80, connect;
// permissionjava.security.AllPermission; /* ouautorisetout */ };
50,
+%RXU]RXIL''RQVH]
27
L ’exécution
Coté Client
■ L ’application
• OH 6WXE GRLWrWUHGDQVOH/$663$7+RXFKDUJHDEOHYLD)6RX+773
• KHOORSROLF DXWRULVHO ¶XVDJHGXFRQQHFW VXUOHV 6RFNHWV
hostclijava
-Djava.security.policy=./client.policy
-Djava.rmi.server.codebase=http://hostwww/hello/myclasses/
examples.client.HelloClient hostreg:1099
• FOLHQWSROLF
grant { permissionjava.net.SocketPermission*:1024-65535,connect;
permissionjava.net.SocketPermission*:80, connect; };
50,
+%RXU]RXIL''RQVH]
28
L ’exécution
Coté Client
■ L ’applet
• O ¶pOpPHQW+70/ DSSOHW GRLWVSpFLILHUOHFRGHEDVH
HTMLtitleHelloWorld/titlecenterh1HelloWorld/h1/center
ThemessagefromtheHelloServer is:br
applet codebase=myclasses/
code=examples.client.HelloApplet width=500height=120
/applet/HTML
• VHXOVOHVVRFNHWVYHUVKRVWZZZVRQWDXWRULVpVSDUODVDQGER[
• GRQFKRVWUHJ KRVWVHU KRVWZZZ
hostcliappletviewer http://hostwww/hello/hello.html
50,
+%RXU]RXIL''RQVH]
30
Le passage de paramètres
■ Les paramêtres des méthodes invoquées sur un objet
distant sont soit:
• une valeur de type Primitif
• La valeur est passée
• un objet d ’ une classe qui implemente l ’ interface Serialisable
(ou l ’ interface Externalizable)
• l ’ objet est sérialisé et envoyé à l ’ objet distant : le paramétre est alors
déserialisé pour l ’ objet d istant l ’ utilse
• un objet d ’ une classe qui implémente l ’ interface Remote
• c ’ est l ’ objet Stub qui est sérialisé et envoyé à l ’objet distant : quand l ’ objet
distant invoque un méthode sur le paramêtre, l ’ invocation est distante.
■ Une exception est levée
si un paramêtre ne rentre pas dans ces trois cas.
50,
+%RXU]RXIL''RQVH]
31
Le passage de paramètres
■ Un exemple plus complexe
packageexamples.order;
publicclassOrderLineimplementsjava.io.Serializable{ // uneclassesérialisable
publicStringproductname;
publicint quantity;
}
packageexamples.order;
import java.util.Vector; // uneclassesérialisable
publicinterfaceOrder extendsjava.rmi.Remote{ // l ’interfacedistante
publicfloat price(Stringproductname, int quantity) throwsjava.rmi.RemoteException;
publicfloat price(Vector orderlines) throwsjava.rmi.RemoteException;
publicfloat price(OrderLine[] orderlines) throwsjava.rmi.RemoteException;
publicVector priceInDetail(Vector orderlines) throwsjava.rmi.RemoteException;
publicVector priceInDetail(OrderLine[] orderlines) throwsjava.rmi.RemoteException;
}
50,
+%RXU]RXIL''RQVH]
33
Passage d ’un paramètre de classe
inconnue du serveur
• La sous classe d’un paramètre est inconnue du serveur
• le serveur charge la classe du sous-type inconnu
à partir du java.rmi.server.codebase du client à défaut du CLASSPATH
■ Voir : jdk1.2.2/docs/guide/rmi/codebase.htm
50,
+%RXU]RXIL''RQVH]
34
Passage d ’un paramètre de classe
inconnue du serveur (i)
KRVWFOL
KRVWFOL
OLHQW+HOOROLHQW
OLHQW+HOOROLHQW
KRVWZZZ
KRVWZZZ
KWWSG
KWWSG
KRVWVHU
KRVWVHU
6HUYHXU+HOOR6HUYHU
6HUYHXU+HOOR6HUYHU
3DUDPFODVV
,PSO
 OHFOLHQWLQYRTXH
XQHPpWKRGHDYHFXQSDUDPrWUH
LQFRQQXGXVHUYHXU
 OH6WXE VpULDOLVHO·LQVWDQFHGX
SDUDPrWUH HWO·HQYRLHDXVHUYHXU
 OHVHUYHXUFKDUJHODFODVVH
G ·DSUqVMDYDUPLVHUYHUFRGHEDVH
GXFOLHQW
DSSHOPpWKRGH
6RFNHW
,QVWDQFH
50,
+%RXU]RXIL''RQVH]
35
Passage d ’un paramètre de classe
inconnue du serveur (ii)
KRVWFOL
KRVWFOL
OLHQW+HOOROLHQW
OLHQW+HOOROLHQW
KRVWZZZ
KRVWZZZ
KWWSG
KWWSG
KRVWVHU
KRVWVHU
6HUYHXU+HOOR6HUYHU
6HUYHXU+HOOR6HUYHU
3DUDPFODVV
,PSO
 O ·REMHWHVWGpVHULDOLVp
 ODPpWKRGHHVWLQYRTXpH
 OH6WXE © GpPDVKDOOH ª
OHUpVXOWDWGHODPpWKRGH
DSSHOPpWKRGH
6RFNHW
,QVWDQFH
 OH6NHO UHWRXUQHOHUpVXOWDW PDUVKDOOp
50,
+%RXU]RXIL''RQVH]
36
Passage d ’un paramêtre de classe
inconnue du serveur - Exemple
packageexamples.bank;
O ¶LQWHUIDFHGXHU SDUDPrWUH GHODPpWKRGHFUHGLW
publicinterfaceAccount extendsSerializable{ float getBalance(); voidsetBalance(float amount); }
O ¶LQWHUIDFHGHO ¶REMHWGLVWDQW
publicinterfaceBankimplementsRemote{ voidcredit(Account acc, float amount); }
XQHVRXVFODVVHGH$FFRXQWLQFRQQXHGXVHUYHXU
publicclassCheckingAccount implementsexamples.bank.Account {
privateStringname; privatefloat balance;
publicCheckingAccount(Stringname, float initamount) {
this.name=name; this.balance=initamount; }
publicfloat getBalance(returnbalance;)
publicvoidsetBalance(float amount) { balance=amount; }
}
XQFOLHQW
examples.bank.Bankmybank=(Bank) java.rmi.Naming.lookup(//hostreg/MyBank);
examples.bank.Account accjohn=newCheckingAccount(john,1000.0);
mybank.credit(accjohn,2000.0);
50,
+%RXU]RXIL''RQVH]
39
Passage d ’un Stub en paramêtre
■ Méthode 1
• Le Stub est celui d ’un objet distant déjà servi
■ Méthode 2 : Objet Distant Temporaire
• But:
• L ’objet distant est local au client et n ’ est utilisé que pour la durée
d ’ une ou plusieurs invocations distantes depuis le client
• Solution
• exporter l ’objet avec la méthode UnicastRemoteObject.exportObjet()
• l ’objet doit implémenter l ’ interface Unreferenced pour être ramassé
par le GC
50,
+%RXU]RXIL''RQVH]
40
Objet Distant Temporaire
/HFOLHQW
publicclassAsyncHelloClient {
publicstaticvoidmain( String[] args) {
Hellohello=(Hello) Naming. lookup(//hostreg/HelloObject);
Personperson=newPersonImpl(Didier,Donsez);
UnicastRemoteObject.exportObject(person);
Stringhellomessage=hello.sayHello(person, Hello.EN);
person=null; // forceleGClocal et leGCreparti
System.println.out(hellomessage);
...
}
}
50,
+%RXU]RXIL''RQVH]
41
Objet Distant Temporaire
/HVHUYHXUWHPSRUDLUH
publicinterfacePersonextendsRemote{
StringgetFirstname() throwsRemoteException;
StringgetLastname() throwsRemoteException;
}
publicclassPersonImpl implementsPerson, 8QUHIHUHQFHG {
privateStringlastname; privateStringfirstname;
PersonImpl(Stringlastname, Stringfirstname) {
this.lastname=lastname,this.firstname=firstname;
}
StringgetFirstname() throwsRemoteException{ returnfirstname; }
StringgetLastname() throwsRemoteException{ returnlastname; }
YRLGXQUHIHUHQFHG ^
7KUHDG*URXS WJ 7KUHDGFXUUHQW7KUHDG JHW7KUHDG*URXS 
WJVWRS
`
}
50,
+%RXU]RXIL''RQVH]
42
Objet Distant Temporaire
/ ¶REMHWGLVWDQWHWVRQVHUYHXU
publicinterfaceHelloextendsRemote{
StringsayHello(Personperson, int lang) throwsRemoteException;
StringsayHello(Stringname, int lang) throwsRemoteException;
}
publicclassHelloImpl extendsjava.rmi.server.UnicastRemoteObject implementsHello{
StringsayHello(Personperson, int lang) throwsRemoteException{
Stringfirstname=person.getFirstname(); // invocationdistantesur leStub
Stringlastname=person.getLastname(); // invocationdistantesur leStub
returnsayHello(firstname+  +lastname, lang);
} …}
publicclassHelloServer {
publicstaticvoidmain(Stringargs[]) {
if (System.getSecurityManager() ==null) {
System.setSecurityManager(newjava.rmi.RMISecurityManager()); }
try{
HelloImpl obj =newHelloImpl(Hello.EN);
java.rmi.Naming.rebind(//hostreg/HelloObject, obj);
} catch(Exceptione) { e.printStackTrace(); } } }
50,
+%RXU]RXIL''RQVH]
43
Objet Distant Temporaire
'pURXOHPHQWGHO ¶H[pFXWLRQ
KRVWVHU
KRVWVHU
-90+HOOR6HUYHU
-90+HOOR6HUYHU
KRVWFOL
KRVWFOL
-90$VQF+HOOROLHQW
-90$VQF+HOOROLHQW
PDLQWKUHDG KHOOR XQLFDVWREMHFWWKUHDG
DWWHQWHG ¶XQHLQYRFDWLRQGHPpWKRGH
SHUVRQWKUHDG V FUpDWLRQGHSHUVRQ
H[SRUWGHSHUVRQ
LQYRFDWLRQGHKHOORVD+HOOR SHUVRQ+HOOR(1
H[pFXWLRQGH
KHOORVD+HOOR SHUVRQ+HOOR(1
DWWHQWHGXUpVXOWDW
DWWHQWHG ¶XQHPpWKRGH
H[pFXWLRQGH
SHUVRQJHW)LUVWQDPH
LQYRFDWLRQGH
SHUVRQJHW)LUVWQDPH
H[pFXWLRQGH
SHUVRQJHW/DVWQDPH
LQYRFDWLRQGH
SHUVRQJHW/DVWQDPH
UpFHSWLRQHWH[pFXWLRQ
GH XQUHIHUHQFHG
'*
UpFHSWLRQGXUpVXOWDW
DWWHQWHG ¶XQHLQYRFDWLRQGHPpWKRGH
50,
+%RXU]RXIL''RQVH]
46
L ’activation d ’objets distants
■ Rappel (JDK1.1)
• l ’objet distant est actif au démarrage du serveur RMI
■ Motivation
• principe du démon inetd d ’ Unix
• Le démon rmid démarre une JVM qui sert l ’ objet distant seulement au
moment de l ’ invocation d ’ une méthode (à la demande) ou au reboot.
■ JDK1.2 introduit
• un nouveau package java.rmi.activation
• un objet activable doit dériver de la classe Activatable
• un démon RMI rmid
• qui active les objets à la demande ou au reboot de la machine
■ Info : jdk1.2.2docsguidermiactivation.html
■ Remarque : l’activition est très utilisée par JINI !
50,
+%RXU]RXIL''RQVH]
47
Créer une implémentation activable
• La classe doit étendre MDYDUPLDFWLYDWLRQ$FWLYDEOH
et implémenter l ’interface distante
• La classe doit déclarer un constructeur avec 2 arguments
java.rmi.activation.ActivationID, java.rmi.MarshalledObject
SXEOLFFODVV +HOOR$FWLYDWDEOH,PSO
H[WHQGV MDYDUPLDFWLYDWLRQ$FWLYDWDEOH LPSOHPHQWV +HOOR ^
SULYDWHLQWGHIDXOWODQJ
SXEOLF $FWLYDWDEOH,PSOHPHQWDWLRQ $FWLYDWLRQ,' LG 0DUVKDOOHG2EMHFW GDWD
WKURZV MDYDUPL5HPRWH([FHSWLRQ ^
VXSHU LG 
WKLVGHIDXOWODQJ ,QWHJHU GDWDJHW LQW9DOXH 
`
LPSOpPHQWDWLRQGHVPpWKRGHV
SXEOLF6WULQJ VD+HOOR WKURZVMDYDUPL5HPRWH([FHSWLRQ ^«`
`
50,
+%RXU]RXIL''RQVH]
48
Créer le programme d ’enregistrement
(Setup)
■ Rôle
• passer l ’ information nécessaire à l ’activation de l ’ objet
activable au démon rmid
puis enregistrer l ’ objet auprès de rmiregistry
■ Descripteur
• ActivationDesc: description des informations nécessaires à rmid
■ Groupes d’objets activables
• rmid active une JVM par groupe
• Les objets du même groupe partagent la même JVM
• ActivationGroup: représente un groupe d ’objets activables
• ActivationGroupDesc: description d ’un groupe
• ActivationGroupID: identifiant d ’un groupe
50,
+%RXU]RXIL''RQVH]
49
Créer le programme d ’enregistrement
([HPSOH SDUWLH
import java.rmi.*; import java.rmi.activation.*; import java.util.Properties;
publicclassSetupActivHello{
publicstaticvoidmain(String[] args) throwsException{
System.setSecurityManager(newRMISecurityManager());
// créationd’ungrouped’objetsactivables
Propertiesprops=newProperties(); props.put(java.security.policy, ./helloactiv.policy);
ActivationGroupDesc.CommandEnvironment ace=null;
// descripteur dugroupe
ActivationGroupDescagroupdesc=newActivationGroupDesc(props, ace);
//
ActivationSystemasystem=ActivationGroup.getSystem();
ActivationGroupIDagi =asystem.registerGroup(agroupdesc);
// enregistrement dugroupe
ActivationGroup.createGroup(agi, agroupdesc, 0);
50,
+%RXU]RXIL''RQVH]
50
Créer le programme d ’enregistrement
([HPSOH SDUWLH
// ledescripteur doit contenir lecodebasepour chercher lesclasses
Stringclasseslocation=http:/hostwww/hello/myclasses/;
// ledescripteur peut contenir unobjet sérialisablepour l ’initialisationdel ’objet ; datapeut
êtrenull
MarshalledObject data=newMarshalledObject (newInteger(Home.ES));
// créationd’undescripteur pour l ’objet activable
ActivationDescadesc=newActivationDesc
(agi, examples.hello.HelloActivatableImpl, classeslocation, data);
// enregistrement del ’objet auprèsdudémonrmid: récupérationd’unstub
Helloobj =(Hello)Activatable.register(adesc);
// enregistrement dustubauprèsdurmiregistry
Naming.rebind(//hostreg/HelloActiv, obj);
System.exit(0);
}
}
50,
+%RXU]RXIL''RQVH]
51
Personnaliser la couche Transport des RMI
■ Rappel
• Par défaut, TCP est utilisé par la couche de transport RMISocketFactory
(classes java.net.Socket et java.net.SocketServer)
2 cependant dans les cas de Firewall/proxies, elle invoque les méthodes en
utilisant la méthode POST de HTTP.
• La propriété java.rmi.server.disableHttp=true désactive le tunneling HTTP
■ Motivation
• utiliser d ’ autres classes (que Socket et SocketServer)
basées sur
ª TCP pour de la compression, du chiffrage, …
ªRemarque : RMI over SSL utilise cette technique (voir l ’ exemple)
ª ou non (UDP)
■ ,QIRMGN?GRFV?JXLGH?UPL?UPLVRFNHWIDFWRUGRFKWPO
50,
+%RXU]RXIL''RQVH]
52
Personnaliser la couche Transport des RMI
■ Etape 1
Écrire 2 sous classes de
MDYDUPL50,OLHQW6RFNHW)DFWRU
MDYDUPL50,6HUYHU6RFNHW)DFWRU
qui utilisent 2 autres classes de transport que
MDYDQHW6RFNHW
MDYDQHW6RFNHW6HUYHU
(voir cours Socket)
50,
+%RXU]RXIL''RQVH]
53
Personnaliser la couche Transport des
RMI
SDFNDJH H[DPSOHVUPLVRFIDF
LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPLVHUYHU 
SXEOLFFODVV RPSUHVVLRQOLHQW6RFNHW)DFWRU
LPSOHPHQWV 50,OLHQW6RFNHW)DFWRU 6HULDOL]DEOH ^
SXEOLF 6RFNHWFUHDWH6RFNHW 6WULQJKRVW LQW SRUW WKURZV ,2([FHSWLRQ^
UHWXUQQHZ RPSUHVVLRQ6RFNHW KRVWSRUW 
``
SXEOLFFODVV RPSUHVVLRQ6HUYHU6RFNHW)DFWRU
LPSOHPHQWV 50,6HUYHU6RFNHW)DFWRU 6HULDOL]DEOH ^
SXEOLF 6HUYHU6RFNHWFUHDWH6HUYHU6RFNHW LQW SRUW WKURZV ,2([FHSWLRQ^
UHWXUQQHZ RPSUHVVLRQ6HUYHU6RFNHW SRUW 
``
50,
+%RXU]RXIL''RQVH]
54
Personnaliser la couche Transport des
RMI
■ Etape 2
Spécifier les factories dans le constructeur de l ’ objet distant qui
hérite de la classe 8QLFDVW5HPRWH2EMHFW
SURWHFWHG8QLFDVW5HPRWH2EMHFW LQW SRUW
50,OLHQW6RFNHW)DFWRU FVI
50,6HUYHU6RFNHW)DFWRU VVI
■ Exemple:
SXEOLF$FFRXQW,PSO WKURZV5HPRWH([FHSWLRQ ^
VXSHU  QHZ RPSUHVVLRQOLHQW6RFNHW)DFWRU 
QHZ RPSUHVVLRQ6HUYHU6RFNHW)DFWRU

«`
50,
+%RXU]RXIL''RQVH]
55
RMI et SSL
■ Couche de transport custom
• SSLClientSocketFactory, SSLServerSocketFactory
• utilisent SSLSocket, SSLServerSocket (www.phaos.com)
■ voir
• jdk1.2.2docsguidermiSSLInfo.html
• jdk1.2.2docsguidermiPhaosExample.html
50,
+%RXU]RXIL''RQVH]
56
RMI over SSL
50,OLHQW6RFNHW)DFWRUHW
50,6HUYHU6RFNHW)DFWRU
SDFNDJH H[DPSOHVUPLVVO
LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPLVHUYHU 
LPSRUWFUSVHF66/ LPSRUWHGHVFODVVHVGH66/ ZZZSKDRVFRP
SXEOLFFODVV66/OLHQW6RFNHW)DFWRU LPSOHPHQWV 50,OLHQW6RFNHW)DFWRU 6HULDOL]DEOH ^
SXEOLF6RFNHWFUHDWH6RFNHW 6WULQJKRVW LQW SRUW WKURZV ,2([FHSWLRQ^
UHWXUQ 6RFNHW QHZ66/6RFNHW KRVWSRUWQHZ66/3DUDPV 
``
SXEOLFFODVV66/6HUYHU6RFNHW)DFWRU LPSOHPHQWV 50,6HUYHU6RFNHW)DFWRU 6HULDOL]DEOH ^
WUDQVLHQWSURWHFWHG 66/3DUDPV SDUDPV
SXEOLF66/6HUYHU6RFNHW)DFWRU ^ WKLV QHZ66/3DUDPV `
SXEOLF66/6HUYHU6RFNHW)DFWRU 66/3DUDPVS ^ SDUDPV S`
SXEOLF6HUYHU6RFNHWFUHDWH6HUYHU6RFNHW LQW SRUW WKURZV ,2([FHSWLRQ^
UHWXUQQHZ66/6HUYHU6RFNHW SRUW 
``
50,
+%RXU]RXIL''RQVH]
57
50, RYHU 66/
O ¶REMHWGLVWDQW
SDFNDJH H[DPSOHVUPLVVO
LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPL LPSRUWMDYDUPLVHUYHU 
SXEOLFFODVV66/+HOOR,PSO H[WHQGV 8QLFDVW5HPRWH2EMHFWLPSOHPHQWV +HOOR^
SULYDWHLQWGHIDXOWODQJ 
SXEOLF66/+HOOR,PSO 66/6HUYHU6RFNHW)DFWRU VVILQWGHIDXOWODQJ 
WKURZV5HPRWH([FHSWLRQ ^
VXSHU QHZ66/OLHQW6RFNHW)DFWRU  VVI 
WKLVGHIDXOWODQJ GHIDXOWODQJ 
`
SXEOLF6WULQJ VD+HOOR WKURZV5HPRWH([FHSWLRQ ^`

`
50,
+%RXU]RXIL''RQVH]
58
RMI over SSL
OHVHUYHXU
SDFNDJH H[DPSOHVUPLVVO
LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPL LPSRUWMDYDUPLVHUYHU 
SXEOLFFODVV66/+HOOR6HUYHU^
SXEOLF VWDWLFYRLG PDLQ 6WULQJ DUJV@ ^WU ^
 LQLWLDOL]HVHUYHUFHUWLILFDWH
66/HUWLILFDWH FHUW QHZ66/HUWLILFDWH 
FHUWFHUWLILFDWH/LVW QHZ 9HFWRU 
FHUWFHUWLILFDWH/LVWDGG(OHPHQW QHZ; QHZ)LOH VHUYHUFHUWGHU 
FHUWFHUWLILFDWH/LVWDGG(OHPHQW QHZ; QHZ)LOH FDFHUWGHU 
66/3DUDPV SDUDPV QHZ66/3DUDPV  LQLWLDOL]H 66/ FRQWH[WREMHFW
SDUDPVVHW6HUYHUHUW FHUW 
SDUDPVVHW5HTXHVWOLHQWHUW WUXH  UHTXLUH FOLHQWDXWKHQWLFDWLRQ
6VWHPVHW6HFXULW0DQDJHU QHZ50,6HFXULW0DQDJHU 
VHFXUHVHUYHUVRFNHWIDFWRU WRXVHLQ UHPRWHREMHFWV
66/6HUYHU6RFNHW)DFWRU VVI QHZ66/6HUYHU6RFNHW)DFWRU SDUDPV 
FUHDWH D VHFXUHUPLUHJLVWU
5HJLVWUUHJLVWU /RFDWH5HJLVWUFUHDWH5HJLVWU QHZ66/OLHQW6RFNHW)DFWRU  VVI 
FUHDWH D UHPRWHREMHFWWKDWZLOOXVHD VHFXUH FOLHQWVHUYHUVRFNHW SDLU
66/+HOOR,PSOR QHZ66/+HOOR,PSO VVI+HOOR)5 
UHJLVWUUHELQG 66/+HOOR2EMHFWR 
`FDWFK ([FHSWLRQH ^6VWHPHUUSULQWOQ HJHW0HVVDJH HSULQW6WDFN7UDFH `
``
50,
+%RXU]RXIL''RQVH]
59
RMI over SSL
OHFOLHQW
SDFNDJH H[DPSOHVUPLVVO
LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPL LPSRUWMDYDUPLVHUYHU 
SXEOLFFODVV66/+HOOROLHQW^
SXEOLF VWDWLFYRLG PDLQ 6WULQJ DUJV@ ^
WU ^
LI DUJVOHQJWK  ^6VWHPHUUSULQWOQ 8VDJHKRVW1DPH! 6VWHPH[LW  `
6VWHPVHW6HFXULW0DQDJHU QHZ50,6HFXULW0DQDJHU 
 UHDWH D VHFXUHUPLUHJLVWU
5HJLVWUUHJLVWU /RFDWH5HJLVWU
JHW5HJLVWU DUJV@QHZ66/OLHQW6RFNHW)DFWRU 
2EWDLQ D UHIHUHQFH WR WKH+HOOR2EMHFW
+HOORKHOOR  +HOOR UHJLVWUORRNXS 66/+HOOR2EMHFW 
6VWHPRXWSULQWOQ 0HVVDJHKHOORVD+HOOR 
`FDWFK ([FHSWLRQH ^
HSULQW6WDFN7UDFH 
`
`
`
50,
+%RXU]RXIL''RQVH]
60
Le glaneur de cellules distibué des RMI
java.rmi.dgc
■ Motivation pour un GC réparti
• ramasser les objets distants
qui ne sont plus référencés (i.e. plus de stub sur des clients)
■ Principe
• basé sur le comptage de références
• interagit avec les GCs locaux de toutes les JVM
• maintient des ZHDNVUHIHUHQFHV pour éviter le ramassage par le GC local
■ Remarque:
• en cas de partition du réseau, les objets peuvent être prématurément
ramassés
50,
+%RXU]RXIL''RQVH]
61
Le glaneur de cellules distibué des RMI
java.rmi.dgc
■ Interface java.rmi.server.Unreferenced
packagejava.rmi.server;
publicinterfaceUnreferenced{ publicvoidunreferenced(); }
• Un objet distant peut être notifié quand il n ’ est plus référencé
• il doit implémenter l ’interface java.rmi.server.Unreferenced
• la méthode void unreferenced() est appelée par le DGC
quand il n ’ y a plus de référence.
50,
+%RXU]RXIL''RQVH]
63
Détail d ’implantation
■ Coté serveur
• Une thread par appel d ’un client
• + la thread d ’ écoute des nouveaux appels sur le socket
• L ’ appel concurrent aux méthodes n ’ est pas synchronisé
• La synchronisation est à la charge du développeur
• Un couple hôte,port pour tous les objets par une JVM
8QGHURQVWUXFWLRQ
(QRQVWUXFWLRQ
50,
+%RXU]RXIL''RQVH]
64
RMI over IIOP
■ Couche de transport : IIOP (www.omg.org)
8QGHURQVWUXFWLRQ
(QRQVWUXFWLRQ
50,
+%RXU]RXIL''RQVH]
65
RMI et EJB 8QGHURQVWUXFWLRQ
(QRQVWUXFWLRQ
50,
+%RXU]RXIL''RQVH]
67
RMI et JINI
■ JINI
• mécanisme de courtage distribué (GLVFRYHUMRLQORRNXS)
• Courtage tolérant aux pannes (redondance)
• Recherche par rapport
à l’interface du service (nom+signature méthodes)
à des attributs qualifiants (Entry)
à des groupes
• Le client récupère la liste des objets distants (stub RMI)
potentiellement actifs ou activables offrant ce service
■ JERI : JINI Extensible Remote Invocation
• Rendre extensible les couches transfort et sérialisation des
RMI
• http://pandonia.canberra.edu.au/java/jini/tutorial/Jeri.html
50,
+%RXU]RXIL''RQVH]
68
Ajout du J2SE 1.4
■ MDYDUPLVHUYHU50,ODVV/RDGHU6SL
• Délégation du chargement dynamique des classes
■ Support du POA (Portable Object Adapter)
pour rmic
• rmic -iiop -poa …
■ Génération d’IDL CORBA
• Pour l’ interopérabilité avec des serveurs CORBA via IIOP
• rmic -idl …
50,
+%RXU]RXIL''RQVH]
69
Ajout du J2SE 1.5
■ Nouveautés dans le langage Java : les annotations
• Avant 1.5
publicinterfaceIHelloextendsRemote{
publicStringsayHello(Stringname) throwsRemoteException;
}
publicclassHelloimplementsIHello{
publicStringsayHello(Stringname) throwsRemoteException{
returnHello+name;
}}
• Avec les annotations du 1.5
publicclassHello{ // with1.5annotations
public#UHPRWH StringsayHello(Stringname) {
returnHello+name;
}}
■ Impact sur les outils de génération comme rmic
50,
+%RXU]RXIL''RQVH]
70
Portable Interceptor  RMI
■ TODO
■ Voir CAROL d’ObjectWeb
50,
+%RXU]RXIL''RQVH]
71
Comparaison
50, 1(75HPRWLQJ
25%$ 62$3
3ODWHIRUPHV 0XOWL :LQ
)UHH%6' /LQX[
0XOWL 0XOWL
/DQJDJHV
GH3URJUDPPDWLRQ
-DYD
9%-
«
0XOWL 0XOWL
/DQJDJHVGH
'pILQLWLRQGH6HUYLFH -DYD /5
,'/ ;0/
5pVHDX
73+773,,23
FXVWRPLVDEOH
73+773
,,23
*,23,,23
3OXJJDEOH7UDQVSRUW/DHU
53+773
,QWHUFHSWHXU GHSXLV
2XL
DOORQWH[W
2XL
([WHQVLRQDSSOLFDWLYH
GDQVOHKHDGHU
([WUD
KDUJHPHQW
GQDPLTXH
GHVFODVVHV
6HUYLFHVRPPXQV
6HUYLFHV6HFWRULHOV
0DUVKDOOLQJ
6pULDOLVDWLRQ
-DYD
62$3
4XL 681 0LFUR6RIW(0$
20* :
1RPPDJH 50,-1',-,1, ,31RP
RV1DPLQJ ,33RUW85/
)RUPDWWHXUV
%LQDLUH62$3
3DVGHKDUJHPHQW
GQDPLTXH
GHVFODVVHV
5HSUpVHQWDWLRQ
,,23
53
0XOWL
«
53*(1
738'3
1RQ
68126)
,33RUW
50,
+%RXU]RXIL''RQVH]
73
Bibliographie
■ Spécification des RMI
• java.sun.com et jdk1.2.2/docs/guide/rmi/spec
■ Guide de la doc du JDK
• jdk1.2.2/docs/guide/rmi
■ Tutorial Java
• Trail sur les RMI et sur JINI (Objet activables)
• Online Training
• http://developer.java.sun.com/developer/onlineTraining/Programming/JDCBo
ok/rmi.html
■ Autres
• Jeremie : une implémentation OpenSource des RMI
• http://www.objectweb.org
50,
+%RXU]RXIL''RQVH]
74
Bibliographie
■ Gilles Roussel, Étienne Duris, Java et Internet, Concepts et
programmation, Ed Vuibert, 01/2000, ISBN : 2-7117-8654-4
• le chapitre 11 détaille bien les RMI du JDK1.2 et notamment les objets activables
■ Elliotte Rusty Harold, Programmation Réseau avec Java, Ed O Reilly,
1997, ISBN 2-84177-034-6
• date un peu
■ Java Distributed Computing, Ed Oreilly existe en français
• date un peu
■ Robert Orfali, Dan Harkey, “ Client/Server Programming with Java and
Corba ”, 2ème édition, 1998, Ed Wiley, ISBN 0-471-24578-X.
• survol rapide
• comparaison intéressante avec les autres techniques (DCOM, CORBA, …)

Contenu connexe

Similaire à rmi.pdf

Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchParis Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchMourad DACHRAOUI
 
Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...
Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...
Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...CERTyou Formation
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfrachidimstapha
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceOCTO Technology
 
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)Alphorm
 
Dw731 g formation-ibm-infosphere-streams-v3-administration
Dw731 g formation-ibm-infosphere-streams-v3-administrationDw731 g formation-ibm-infosphere-streams-v3-administration
Dw731 g formation-ibm-infosphere-streams-v3-administrationCERTyou Formation
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfonyjeUXdiCode
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016Antoine Rey
 
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Normandy JUG
 

Similaire à rmi.pdf (20)

Rails 3 au Djangocong
Rails 3 au DjangocongRails 3 au Djangocong
Rails 3 au Djangocong
 
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearchParis Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
Paris Scala User Group #43 - Spray (Magnet Pattern) + RxScala / ElasticSearch
 
Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...
Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...
Zv10 g formation-ibm-z-vm-et-linux-pour-zseries-connectivite-et-gestion-du-sy...
 
Developpement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdfDeveloppement web dynamique_Base de donnees.pdf
Developpement web dynamique_Base de donnees.pdf
 
Les secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquenceLes secrets de la JVM pour les algos à haute fréquence
Les secrets de la JVM pour les algos à haute fréquence
 
Power Shell V2 Full
Power Shell V2 FullPower Shell V2 Full
Power Shell V2 Full
 
Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 
spring.pdf
spring.pdfspring.pdf
spring.pdf
 
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)
Alphorm.com Support Formation Red Hat Administration Système III RHCSE-(Rh254)
 
Dw731 g formation-ibm-infosphere-streams-v3-administration
Dw731 g formation-ibm-infosphere-streams-v3-administrationDw731 g formation-ibm-infosphere-streams-v3-administration
Dw731 g formation-ibm-infosphere-streams-v3-administration
 
Cours php
Cours phpCours php
Cours php
 
Les Servlets et JSP
Les Servlets et JSPLes Servlets et JSP
Les Servlets et JSP
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Cours 8 squid.pdf
Cours 8 squid.pdfCours 8 squid.pdf
Cours 8 squid.pdf
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
technologie web
technologie webtechnologie web
technologie web
 
Support NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDBSupport NodeJS avec TypeScript Express MongoDB
Support NodeJS avec TypeScript Express MongoDB
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfony
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
 

Plus de Patiento Del Mar

Managed Extenibility Framework in C# - MEF
Managed Extenibility Framework  in C#  - MEFManaged Extenibility Framework  in C#  - MEF
Managed Extenibility Framework in C# - MEFPatiento Del Mar
 
hibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdfhibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdfPatiento Del Mar
 
hibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdfhibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdfPatiento Del Mar
 
Spring Data Advanced Querying.ppt
Spring Data Advanced Querying.pptSpring Data Advanced Querying.ppt
Spring Data Advanced Querying.pptPatiento Del Mar
 
Thymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.pptThymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.pptPatiento Del Mar
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdfPatiento Del Mar
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdfPatiento Del Mar
 
12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdfPatiento Del Mar
 
17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdfPatiento Del Mar
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdfPatiento Del Mar
 
15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdfPatiento Del Mar
 

Plus de Patiento Del Mar (20)

Managed Extenibility Framework in C# - MEF
Managed Extenibility Framework  in C#  - MEFManaged Extenibility Framework  in C#  - MEF
Managed Extenibility Framework in C# - MEF
 
grpc_tutorial.pdf
grpc_tutorial.pdfgrpc_tutorial.pdf
grpc_tutorial.pdf
 
0.coursGitEclipse.pdf
0.coursGitEclipse.pdf0.coursGitEclipse.pdf
0.coursGitEclipse.pdf
 
Primefaces.ppt
Primefaces.pptPrimefaces.ppt
Primefaces.ppt
 
hibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdfhibernateormoverview-140501154227-phpapp02.pdf
hibernateormoverview-140501154227-phpapp02.pdf
 
hibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdfhibernateormfeatures-140223193044-phpapp02.pdf
hibernateormfeatures-140223193044-phpapp02.pdf
 
Spring Data Advanced Querying.ppt
Spring Data Advanced Querying.pptSpring Data Advanced Querying.ppt
Spring Data Advanced Querying.ppt
 
Thymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.pptThymeleaf and Spring Controllers.ppt
Thymeleaf and Spring Controllers.ppt
 
Spring Security.ppt
Spring Security.pptSpring Security.ppt
Spring Security.ppt
 
momjms.pdf
momjms.pdfmomjms.pdf
momjms.pdf
 
synchronization.pdf
synchronization.pdfsynchronization.pdf
synchronization.pdf
 
cours6.pdf
cours6.pdfcours6.pdf
cours6.pdf
 
java_PAR.pdf
java_PAR.pdfjava_PAR.pdf
java_PAR.pdf
 
11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf11-Concurrence-Section critiques.pdf
11-Concurrence-Section critiques.pdf
 
22-reflection.pdf
22-reflection.pdf22-reflection.pdf
22-reflection.pdf
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf
 
12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf12-Concurrence-Rendez-vous.pdf
12-Concurrence-Rendez-vous.pdf
 
17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf17-Concurrence-Fork-Join.pdf
17-Concurrence-Fork-Join.pdf
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf
 
15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf15-Concurrence-Operations-Atomiques.pdf
15-Concurrence-Operations-Atomiques.pdf
 

rmi.pdf

  • 1. RMI Remote Method Invocation Didier DONSEZ Université Joseph Fourier (Grenoble 1) IMA – LSR/ADELE 'LGLHU'RQVH]#LPDJIU'LGLHU'RQVH]#LHHHRUJ Hafid Bourzoufi 8QLYHUVLWpGH9DOHQFLHQQHV ,679 KWWSZZZDGHOHLPDJIUaGRQVH]FRXUV
  • 2. 50, +%RXU]RXIL''RQVH] 2 Sommaire ■ Rappel et Limites des RPC (Remote Procedure Call) ■ Principe des RMI ■ Etapes de développement et d ’exécution ■ Paramètres des méthodes ■ Objet Activable ■ Personnalisation de la couche de transport ■ Ramasse-Miette distribuée ■ Autour des RMI • CORBA, IIOP, EJB
  • 3. 50, +%RXU]RXIL''RQVH] 3 Rappel des RPC ■ RPC (Remote Procedure Call) • modèle client/serveur • appel de procédures à distances entre un client et un serveur • le client appelle une procédure • le serveur exécute la procédure et renvoie le résultat • Outil USFJHQ • génère la souche d ’invocation et le squelette du serveur (en C, C++, Fortran, …) • la souche et le squelette ouvre un socket BSD et encode/décode les paramètres • Couche de présentation ;'5 (eXchange Data Representation) format pivot de représentation des données de types primitifs et structurés (tableau de longueur variable, structures) quelque soit ªl ’architecture (Little Endian/Big Endian, IEEE, …) ªle langage (ordre ligne/colonne dans les tableaux C et les tableaux Fortran) ªou le système (ASCII, IBM ’ECDCII, ...)
  • 4. 50, +%RXU]RXIL''RQVH] 4 Limites des RPC ■ Limitations • paramêtres et valeur de retour sont des types primitifs • programmation procédurale • dépendance à la localisation du serveur • pas d ’ objet • pas de « référence distante » ■ Evolutions • CORBA • Multilangage, multi-plateforme (architecture+OS), MuliVendeurs • Java RMI • mono-langage : Java, multiplateforme : de JVM à JVM • DCOM / Object RPC / .NET Remoting • multi-langages, plateforme Win32 principalement, il existe des implémentations (non MicroSoft) pour Unix, Propriétaire • .NET Remoting • multi-langages (CLR), plateforme Win32 principalement • Normalisé à l’ ECMA et à l’ ISO • SOAP (Simple Access Object Protocol) • multi-langages, multi-plateforme • Réponse et requête en XML (DTD SOAP), Transport sur HTTP, IETF
  • 5. 50, +%RXU]RXIL''RQVH] 5 Principes des RMI ■ RPC à la Java • invoquer de façon simple des méthodes sur des objets distribués. ■ Outils • pour la génération des stub/skeleton, l ’ enregistrement par le nom, l ’activation • Tous les détails ( connexion, transfert de données ..) sont transparents pour le développeur grâce au stub/skeleton généré ■ Mono-langage et Multiplateforme. • Java : de JVM à JVM OHVGRQQpHVHWREMHWVRQWODPrPHUHSUpVHQWDWLRQTTVOD-90 ■ Orienté Objet • Les RMIs utilisent le mécanisme standard de sérialisation de JAVA pour l ’envoi d ’objets. ■ Dynamique • Les classes des Stubs et des paramêtres peuvent être chargées dynamiquement via HTTP (http://) ou NFS (file:/) ■ Sécurité • un SecurityManager vérifie si certaines opérations sont autorisés par le serveur
  • 6. 50, +%RXU]RXIL''RQVH] 6 Structure des couches RMI (i) O ¶DUFKLWHFWXUHORJLTXH OLHQW50, $SSOLFDWLRQ $SSOHW 6HUYOHW +HOOROLHQW+HOOR$SSOHW 6RXFKHRX6WXE +HOOR,PSOB6WXE RXFKHGH5pIpUHQFH MDYDUPL1DPLQJ RXFKHGH7UDQVSRUW MDYDQHW6RFNHWSRXU73 5pVHDX ,3 6HUYHXU50, +HOOR6HUYHUUPLG 6TXHOHWWHRX6NHOHWRQ +HOOR,PSOB6NHO RXFKHGH5pIpUHQFH MDYDUPL1DPLQJ RXFKHGH7UDQVSRUW MDYDQHW6RFNHW6HUYHU SRXU73 ,QYRFDWLRQGH PpWKRGHV VD+HOOR ,QWHUIDFH'LVWDQWH +HOOR ,PSOpPHQWDWLRQ'LVWDQWH +HOOR,PSO
  • 7. 50, +%RXU]RXIL''RQVH] 7 Structure des couches RMI (ii) ■ Souche RX6WXE (sur le client) • représentant local de l’ objet distant qui implémente les méthodes “exportées” de l ’ objet distant • “marshalise” les arguments de la méthode distante et les envoie en un flot de données au serveur • “démarshalise” la valeur ou l ’objet retournés par la méthode distante • la classe xx_Stub peut être chargée dynamiquement par le client (Applet) ■ Squelette RX6NHOHWRQ (sur le serveur) • “démarshalise” les paramètres des méthodes • fait un appel à la méthode de l’ objet local au serveur • “marshalise” la valeur ou l ’objet renvoyé par la méthode
  • 8. 50, +%RXU]RXIL''RQVH] 8 Structure des couches RMI (ii) ■ Couche des références distantes • traduit la référence locale au stub en une référence à l’ objet distant • elle est servie par un processus tier : rmiregistry ■ Couche de transport • écoute les appels entrants • établit et gère les connexions avec les sites distants • java.rmi.UnicastRemoteObject utilise les classes Socket et SocketServer (TCP) • cependant d ’ autres classes peuvent être utilisées par la couche transport (Compression sur TCP, SSL sur TCP, UDP)
  • 10. 50, +%RXU]RXIL''RQVH] 10 KRVWUHJ KRVWUHJ L ’enregistrement de l ’objet UPLUHJLVWU UPLUHJLVWU KRVWFOL KRVWFOL OLHQW+HOOROLHQW OLHQW+HOOROLHQW KRVWZZZ KRVWZZZ KWWSG KWWSG KRVWVHU KRVWVHU 6HUYHXU+HOOR6HUYHU 6HUYHXU+HOOR6HUYHU ,QVWDQFH FODVV 6WXE 6NHO ,PSO +HOOR2EMHFW OHVHUYHXUHQUHJLVWUH O·REMHWGLVWDQW LOFRPPXQLTXH XQHLQVWDQFHGH6WXE OHVHUYHXUFKDUJHOHVFODVVHV 6WXE HW6NHO G ·DSUqVMDYDUPLVHUYHUFRGHEDVH KWWSRXQIV 6RFNHW
  • 11. 50, +%RXU]RXIL''RQVH] 11 KRVWUHJ KRVWUHJ La récupération du Stub UPLUHJLVWU UPLUHJLVWU KRVWFOL KRVWFOL OLHQW+HOOROLHQW OLHQW+HOOROLHQW KRVWZZZ KRVWZZZ KWWSG KWWSG KRVWVHU KRVWVHU 6HUYHXU+HOOR6HUYHU 6HUYHXU+HOOR6HUYHU ,QVWDQFH FODVV 6WXE 6NHO ,PSO +HOOR2EMHFW OHFOLHQWUpFODPHOH6WXEDVVRFLpj+HOOR2EMHFW UPLUHJLVWU UHWRXUQHOH6WXE OHFOLHQWFKDUJHODFODVVH6WXE G ·DSUqVMDYDUPLVHUYHUFRGHEDVH KWWSRXQIV 6RFNHW
  • 12. 50, +%RXU]RXIL''RQVH] 12 KRVWUHJ KRVWUHJ Invocation d ’une méthode UPLUHJLVWU UPLUHJLVWU KRVWFOL KRVWFOL OLHQW+HOOROLHQW OLHQW+HOOROLHQW KRVWZZZ KRVWZZZ KWWSG KWWSG KRVWVHU KRVWVHU 6HUYHXU+HOOR6HUYHU 6HUYHXU+HOOR6HUYHU ,QVWDQFH FODVV 6WXE 6NHO ,PSO +HOOR2EMHFW OHFOLHQWLQYRTXH XQHPpWKRGHVXUOH 6WXE OH6WXE© PDVKDOOH ª OHVSDUDPrWUHVGHODPpWKRGH HWOHVHQYRLHDXVHUYHXU OH6NHO © GHPDVKDOOH ªOHV SDUDPqWUHVGHODPpWKRGH HWLQYRTXHODPpWKRGHVXUO ·REMHW UHWRXUQHOHUpVXOWDW PDUVKDOOp OH6WXE © GHPDVKDOOH ª OHUpVXOWDWGHODPpWKRGH DSSHOPpWKRGH 6RFNHW
  • 13. 50, +%RXU]RXIL''RQVH] 13 Création et manipulation d' objets distants ■ 5 Packages • java.rmi : pour accéder à des objets distants • java.rmi.server : pour créer des objets distants • java.rmi.registry : lié à la localisation et au nommage d’objets distants • java.rmi.dgc : ramasse-miettes pour les objets distants • java.rmi.activation support pour l ’ activation d ’objets distants. ■ Etapes du développement 1- Spécifier et écrire l' interface de l' objet distant. 2- Ecrire l' implémentation de cette interface. 3- Générer les Stub/Skeleton correspondants. (outil rmic) ■ Etapes de l ’exécution 4- Ecrire le serveur qui instancie l' objet implémentant l' interface, exporte son Stub puis attend les requêtes via le Skeleton. 5- Ecrire le client qui réclame l ’ objet distant, importe le Stub et invoque une méthode de l' objet distant via le Stub.
  • 14. 50, +%RXU]RXIL''RQVH] 14 1- Spécifier l ’interface d' un objet distant ■ Format • l ’interface étend MDYDUPL5HPRWH • les méthodes doivent pouvoir lever MDYDUPL5HPRWH([FHSWLRQ ■ Exemple SDFNDJH H[DPSOHVKHOOR SXEOLFLQWHUIDFH+HOOR H[WHQGV MDYDUPL5HPRWH^ SXEOLFVWDWLF ILQDO LQW (1 (QJOLVK SXEOLF VWDWLF ILQDO LQW )5 )UHQFK SXEOLF VWDWLF ILQDO LQW (6 6SDQLVK 6WULQJ VD+HOOR WKURZV MDYDUPL5HPRWH([FHSWLRQ 6WULQJ VD+HOOR 6WULQJ QDPH WKURZVMDYDUPL5HPRWH([FHSWLRQ 6WULQJ VD+HOOR 6WULQJ QDPH LQWODQJ WKURZVMDYDUPL5HPRWH([FHSWLRQ `
  • 15. 50, +%RXU]RXIL''RQVH] 15 Implémentation de l ’objet distant ■ La classe HelloImpl • doit implémenter l ’interface distante Hello • et étendre une des sous-classes de java.rmi.server.RemoteServer comme java.rmi.server.UnicastRemoteObject ■ java.rmi.server.UnicastRemoteObject • sous classe le plus souvent utilisée • offre toutes les fonctionnalités des classes distantes • appelle la classe squelette pour la (dé)marshalisation • utilise TCP/IP pour la couche transport
  • 16. 50, +%RXU]RXIL''RQVH] 16 Implémentation de l ’objet distant SDFNDJH H[DPSOHVKHOOR SXEOLFFODVV +HOOR,PSOH[WHQGV MDYDUPLVHUYHU8QLFDVW5HPRWH2EMHFW LPSOHPHQWV +HOOR ^ SULYDWHLQWGHIDXOWODQJ SXEOLF +HOOR,PSO LQWGHIDXOWODQJ WKURZV MDYDUPL5HPRWH([FHSWLRQ^ VXSHU WKLVGHIDXOWODQJ GHIDXOWODQJ` SXEOLF6WULQJ VD+HOOR ^UHWXUQ VD+HOOR QXOO GHIDXOWODQJ ` SXEOLF6WULQJ VD+HOOR 6WULQJ QDPH ^UHWXUQ VD+HOOR QDPH GHIDXOWODQJ ` SXEOLF6WULQJ VD+HOOR 6WULQJ QDPH LQWODQJ ^ VZLWFK ODQJ ^ FDVH+HOOR(1EUHDNFDVH+HOOR)5EUHDNFDVH+HOOR(6EUHDN GHIDXOW ODQJ +HOOR(1` VZLWFK ODQJ ^ FDVH+HOOR(1UHWXUQ+HOOR QDPH QXOO :RUOG QDPH FDVH+HOOR)5UHWXUQ%RQMRXU QDPH QXOO WRXWOHPRQGH QDPH FDVH+HOOR(6UHWXUQ+ROD QDPH QXOO WRGRHOPXQGR QDPH GHIDXOW UHWXUQ QXOO` `// methodStringsayHello(Stringname, int lang) `// classHelloImpl
  • 17. 50, +%RXU]RXIL''RQVH] 17 La génération des Stub et Skeleton ■ L ’outil rmic génère • la classe souche examples.hello.HelloImpl_Stub • la classe squelette examples.hello.HelloImpl_Skel à partir de l ’ implémentation examples.hello.HelloImpl ■ Exemple VRXV:LQ VHW/$663$7+ /$663$7+PFODVVHV MDYDF G?PFODVVHV +HOORMDYD MDYDF G?PFODVVHV+HOOR,PSOMDYD UPLF NHHSJHQHUDWHG GPFODVVHVH[DPSOHVKHOOR+HOOR,PSO 5HPDUTXH NHHSJHQHUDWHG à conserve les sources des Stub et Skeleton
  • 18. 50, +%RXU]RXIL''RQVH] 18 Implémentation du serveur de l ’objet distant • Crée un ou plusieurs objets distants (une ou plusieurs classes) • Naming.bind() : les enregistre auprès du serveur de liaison UPLUHJLVWU ■ Exemple SDFNDJH H[DPSOHVKHOOR SXEOLFFODVV +HOOR6HUYHU ^ SXEOLF VWDWLFYRLG PDLQ 6WULQJ DUJV@ ^DUJXPHQWO ¶K{WHSRUWGXUPLUHJLVWU UpHHW,QVWDOOHXQ6HFXULW0DQDJHU LI 6VWHPJHW6HFXULW0DQDJHU QXOO ^ 6VWHPVHW6HFXULW0DQDJHU QHZMDYDUPL50,6HFXULW0DQDJHU ` WU ^ LQVWDQFLHO ¶REMHW +HOOR,PSOREM QHZ +HOOR,PSO +HOOR(1 (QUHJLVWUHO ¶REMHWVRXVOHQRP+HOOR2EMHFWDXSUqVGHUPLUHJLVWU MDYDUPL1DPLQJELQG DUJV@+HOOR2EMHFWREM `FDWFK ([FHSWLRQH ^HSULQW6WDFN7UDFH ` `` • MDYDF G?PFODVVHV+HOOR6HUYHUMDYD
  • 19. 50, +%RXU]RXIL''RQVH] 19 Implémentation du serveur de l ’objet distant ■ Remarques • L ’ objet distant servi peut être d ’ une sous classe de HelloImpl SXEOLFFODVV +HOOR(6,PSOH[WHQGV +HOOR,PSO ^ SXEOLF+HOOR(6,PSO WKURZV MDYDUPL5HPRWH([FHSWLRQ^VXSHU +HOOR(6 ` ` HWGDQV+HOOR6HUYHU MDYDUPL1DPLQJUHELQG DUJV@+HOOR2EMHFWQHZ+HOOR(6,PSO • Le serveur peut crée et enregistré plusieurs objets appartenant à une ou plusieurs classes • l ’enregistrement peut se faire auprès des plusieurs rmiregistry
  • 20. 50, +%RXU]RXIL''RQVH] 20 Implémentation du serveur de l ’objet distant ■ Remarques • il faut prévoir une procédure d ’arrêt (shutdown) du serveur • Demande d ’ arrêt Unix : kill SIGQUIT 12345 Win32 : ?? • Arrêt des objets UnicastRemoteObject publicstaticvoidNaming.unbind(Stringname) publicstaticbooleanUnicastRemoteObject.unexportObject(Remote, booleanforce) • Dans les exemples et tutoriels, le serveur est constitué par la méthode main(Stringargs[]) de l ’ implémentation HelloImpl
  • 21. 50, +%RXU]RXIL''RQVH] 21 Implémentation d ’un client invoquant l ’objet distant • Demande un stub auprès du serveur de liaison UPLUHJLVWU • invoque des méthodes sur le stub chargé ■ Exemple (Application) SDFNDJH H[DPSOHVFOLHQW SXEOLFFODVV +HOOROLHQW ^ SXEOLFVWDWLFYRLG PDLQ 6WULQJ DUJV@ ^ 6WULQJPHVVDJH EODQN WU ^UpFXSqUHOHVWXEGHO ¶REMHWHQUHJLVWUpDXQRPGH© +HOOR2EMHFW ª +HOOR REM +HOOR MDYDUPL1DPLQJORRNXS DUJV@+HOOR2EMHFW LQYRFDWLRQGHVPpWKRGHV PHVVDJH REMVD+HOOR 6VWHPRXWSULQWOQ PHVVDJH PHVVDJH REMVD+HOOR DUJV@ 6VWHPHUUSULQWOQ PHVVDJH 6VWHPHUUSULQWOQ REMVD+HOOR DUJV@ ,QWHJHUSDUVH,QW DUJV@ `FDWFK ([FHSWLRQH ^HSULQW6WDFN7UDFH ` `` • MDYDF G?PFODVVHV+HOOROLHQWMDYD
  • 22. 50, +%RXU]RXIL''RQVH] 22 Implémentation d ’un client invoquant l ’objet distant ■ Exemple (Applet) LPSRUWMDYDUPL1DPLQJ SXEOLFFODVV +HOOR$SSOHWH[WHQGV MDYDDSSOHW$SSOHW^ 6WULQJPHVVDJH EODQN SXEOLFYRLGLQLW ^ WU ^UpFXSqUHOH VWXE GHO ¶REMHWHQUHJLVWUpDXQRPGH© +HOOR2EMHFW ª 5HPDUTXHUPLUHJLVWUHWOHVHUYHXU:HEGRLWrWUHVXUODPrPHPDFKLQH PrPH,3 +HOOR REM +HOOR 1DPLQJORRNXS JHWRGH%DVH JHW+RVW +HOOR2EMHFW LQYRFDWLRQG ¶XQHGHVPpWKRGHV PHVVDJH REMVD+HOOR `FDWFK ([FHSWLRQH ^VRUWLHG ¶HUUHXUVXUODFRQVROH 6VWHPRXWSULQWOQ HelloApplet exception:HJHW0HVVDJH HSULQW6WDFN7UDFH ` ` SXEOLF YRLGSDLQW MDYDDZW*UDSKLFVJ ^ JGUDZ6WULQJ PHVVDJH ` ` • MDYDF G?PFODVVHV+HOOR$SSOHWMDYD
  • 23. 50, +%RXU]RXIL''RQVH] 23 L ’exécution Coté Serveur ■ Le serveur de liaison rmiregistry • expose un objet distant serveur de liaisons (de noms) • le port de liaison par défaut est le port TCP 1099 KRVWUHJ! UPLUHJLVWU A KRVWUHJ! UPLUHJLVWU A KRVWUHJ! UPLUHJLVWU • cet objet fait la correspondance entre nom et instance de Stub enregistré par le(s) serveur(s) avec Naming.bind()
  • 24. 50, +%RXU]RXIL''RQVH] 24 L ’exécution Coté Serveur L ’accès au serveur de liaison ■ La classe Naming • encaspule le dialogue avec plusieurs objets serveur de liaison • URL de liaison rmi://hostreg:2001/Hello/World rmi://:2001/Hello/World //:2001/Hello/World /Hello/World • Méthodes Statiques • ELQG 6WULQJ XUO 5HPRWH U UHELQG 6WULQJ XUO5HPRWH U XQELQG 6WULQJ XUO enregistre/désenregistre un objet auprès du serveur • 5HPRWHORRNXS 6WULQJXUO retourne un stub • 6WULQJ@ OLVW liste les noms enregistrés
  • 25. 50, +%RXU]RXIL''RQVH] 25 L ’exécution Coté Serveur L implantation du serveur de liaison ■ Les objets serveur de liaison • réalise la correspondance nom avec stub • Interface d ’ un objet serveur de liaison • VXQUPLUHJLVWU5HJLVWU H[WHQGV MDYDUPL5HPRWH • Implémentation par défaut de l ’ objet serveur de liaison • VXQUPLUHJLVWU5HJLVWU,PSO • Méthodes non statiques • ELQG UHELQG XQELQG ORRNXS OLVW ■ La classe LocateRegistry • localise ou active un objet serveur de liaison • Méthodes Statiques • 5HJLVWUFUHDWH5HJLVWU LQW SRUW crée un objet serveur de liaison sur le port spécifié • 5HJLVWUJHW5HJLVWU LQW SRUW récupère l ’ objet serveur de liaison qui a été crée
  • 26. 50, +%RXU]RXIL''RQVH] 26 L ’exécution Coté Serveur ■ Le serveur d ’objets distants • OH 6WXE GRLWrWUHGDQVOH/$663$7+RXFKDUJHDEOHYLD)6RX+773 • KHOORSROLF DXWRULVHO ¶XVDJHGX DFFHSW HWGX FRQQHFW VXUOHV 6RFNHWV hostserjava -Djava.security.policy=./hello.policy -Djava.rmi.server.codebase=http://hostwww/hello/myclasses/ examples.hello.HelloServer hostreg:1099 • 0DLVDXVVL -Djava.rmi.server.codebase=file://dev/hello/myclasses/Unix -Djava.rmi.server.codebase=file:/c:devhellomyclasses/ Win32 • KHOORSROLF grant { permissionjava.net.SocketPermission*:1024-65535,connect,accept; permissionjava.net.SocketPermission*:80, connect; // permissionjava.security.AllPermission; /* ouautorisetout */ };
  • 27. 50, +%RXU]RXIL''RQVH] 27 L ’exécution Coté Client ■ L ’application • OH 6WXE GRLWrWUHGDQVOH/$663$7+RXFKDUJHDEOHYLD)6RX+773 • KHOORSROLF DXWRULVHO ¶XVDJHGXFRQQHFW VXUOHV 6RFNHWV hostclijava -Djava.security.policy=./client.policy -Djava.rmi.server.codebase=http://hostwww/hello/myclasses/ examples.client.HelloClient hostreg:1099 • FOLHQWSROLF grant { permissionjava.net.SocketPermission*:1024-65535,connect; permissionjava.net.SocketPermission*:80, connect; };
  • 28. 50, +%RXU]RXIL''RQVH] 28 L ’exécution Coté Client ■ L ’applet • O ¶pOpPHQW+70/ DSSOHW GRLWVSpFLILHUOHFRGHEDVH HTMLtitleHelloWorld/titlecenterh1HelloWorld/h1/center ThemessagefromtheHelloServer is:br applet codebase=myclasses/ code=examples.client.HelloApplet width=500height=120 /applet/HTML • VHXOVOHVVRFNHWVYHUVKRVWZZZVRQWDXWRULVpVSDUODVDQGER[ • GRQFKRVWUHJ KRVWVHU KRVWZZZ hostcliappletviewer http://hostwww/hello/hello.html
  • 29. 50, +%RXU]RXIL''RQVH] 30 Le passage de paramètres ■ Les paramêtres des méthodes invoquées sur un objet distant sont soit: • une valeur de type Primitif • La valeur est passée • un objet d ’ une classe qui implemente l ’ interface Serialisable (ou l ’ interface Externalizable) • l ’ objet est sérialisé et envoyé à l ’ objet distant : le paramétre est alors déserialisé pour l ’ objet d istant l ’ utilse • un objet d ’ une classe qui implémente l ’ interface Remote • c ’ est l ’ objet Stub qui est sérialisé et envoyé à l ’objet distant : quand l ’ objet distant invoque un méthode sur le paramêtre, l ’ invocation est distante. ■ Une exception est levée si un paramêtre ne rentre pas dans ces trois cas.
  • 30. 50, +%RXU]RXIL''RQVH] 31 Le passage de paramètres ■ Un exemple plus complexe packageexamples.order; publicclassOrderLineimplementsjava.io.Serializable{ // uneclassesérialisable publicStringproductname; publicint quantity; } packageexamples.order; import java.util.Vector; // uneclassesérialisable publicinterfaceOrder extendsjava.rmi.Remote{ // l ’interfacedistante publicfloat price(Stringproductname, int quantity) throwsjava.rmi.RemoteException; publicfloat price(Vector orderlines) throwsjava.rmi.RemoteException; publicfloat price(OrderLine[] orderlines) throwsjava.rmi.RemoteException; publicVector priceInDetail(Vector orderlines) throwsjava.rmi.RemoteException; publicVector priceInDetail(OrderLine[] orderlines) throwsjava.rmi.RemoteException; }
  • 31. 50, +%RXU]RXIL''RQVH] 33 Passage d ’un paramètre de classe inconnue du serveur • La sous classe d’un paramètre est inconnue du serveur • le serveur charge la classe du sous-type inconnu à partir du java.rmi.server.codebase du client à défaut du CLASSPATH ■ Voir : jdk1.2.2/docs/guide/rmi/codebase.htm
  • 32. 50, +%RXU]RXIL''RQVH] 34 Passage d ’un paramètre de classe inconnue du serveur (i) KRVWFOL KRVWFOL OLHQW+HOOROLHQW OLHQW+HOOROLHQW KRVWZZZ KRVWZZZ KWWSG KWWSG KRVWVHU KRVWVHU 6HUYHXU+HOOR6HUYHU 6HUYHXU+HOOR6HUYHU 3DUDPFODVV ,PSO OHFOLHQWLQYRTXH XQHPpWKRGHDYHFXQSDUDPrWUH LQFRQQXGXVHUYHXU OH6WXE VpULDOLVHO·LQVWDQFHGX SDUDPrWUH HWO·HQYRLHDXVHUYHXU OHVHUYHXUFKDUJHODFODVVH G ·DSUqVMDYDUPLVHUYHUFRGHEDVH GXFOLHQW DSSHOPpWKRGH 6RFNHW ,QVWDQFH
  • 33. 50, +%RXU]RXIL''RQVH] 35 Passage d ’un paramètre de classe inconnue du serveur (ii) KRVWFOL KRVWFOL OLHQW+HOOROLHQW OLHQW+HOOROLHQW KRVWZZZ KRVWZZZ KWWSG KWWSG KRVWVHU KRVWVHU 6HUYHXU+HOOR6HUYHU 6HUYHXU+HOOR6HUYHU 3DUDPFODVV ,PSO O ·REMHWHVWGpVHULDOLVp ODPpWKRGHHVWLQYRTXpH OH6WXE © GpPDVKDOOH ª OHUpVXOWDWGHODPpWKRGH DSSHOPpWKRGH 6RFNHW ,QVWDQFH OH6NHO UHWRXUQHOHUpVXOWDW PDUVKDOOp
  • 34. 50, +%RXU]RXIL''RQVH] 36 Passage d ’un paramêtre de classe inconnue du serveur - Exemple packageexamples.bank; O ¶LQWHUIDFHGXHU SDUDPrWUH GHODPpWKRGHFUHGLW publicinterfaceAccount extendsSerializable{ float getBalance(); voidsetBalance(float amount); } O ¶LQWHUIDFHGHO ¶REMHWGLVWDQW publicinterfaceBankimplementsRemote{ voidcredit(Account acc, float amount); } XQHVRXVFODVVHGH$FFRXQWLQFRQQXHGXVHUYHXU publicclassCheckingAccount implementsexamples.bank.Account { privateStringname; privatefloat balance; publicCheckingAccount(Stringname, float initamount) { this.name=name; this.balance=initamount; } publicfloat getBalance(returnbalance;) publicvoidsetBalance(float amount) { balance=amount; } } XQFOLHQW examples.bank.Bankmybank=(Bank) java.rmi.Naming.lookup(//hostreg/MyBank); examples.bank.Account accjohn=newCheckingAccount(john,1000.0); mybank.credit(accjohn,2000.0);
  • 35. 50, +%RXU]RXIL''RQVH] 39 Passage d ’un Stub en paramêtre ■ Méthode 1 • Le Stub est celui d ’un objet distant déjà servi ■ Méthode 2 : Objet Distant Temporaire • But: • L ’objet distant est local au client et n ’ est utilisé que pour la durée d ’ une ou plusieurs invocations distantes depuis le client • Solution • exporter l ’objet avec la méthode UnicastRemoteObject.exportObjet() • l ’objet doit implémenter l ’ interface Unreferenced pour être ramassé par le GC
  • 36. 50, +%RXU]RXIL''RQVH] 40 Objet Distant Temporaire /HFOLHQW publicclassAsyncHelloClient { publicstaticvoidmain( String[] args) { Hellohello=(Hello) Naming. lookup(//hostreg/HelloObject); Personperson=newPersonImpl(Didier,Donsez); UnicastRemoteObject.exportObject(person); Stringhellomessage=hello.sayHello(person, Hello.EN); person=null; // forceleGClocal et leGCreparti System.println.out(hellomessage); ... } }
  • 37. 50, +%RXU]RXIL''RQVH] 41 Objet Distant Temporaire /HVHUYHXUWHPSRUDLUH publicinterfacePersonextendsRemote{ StringgetFirstname() throwsRemoteException; StringgetLastname() throwsRemoteException; } publicclassPersonImpl implementsPerson, 8QUHIHUHQFHG { privateStringlastname; privateStringfirstname; PersonImpl(Stringlastname, Stringfirstname) { this.lastname=lastname,this.firstname=firstname; } StringgetFirstname() throwsRemoteException{ returnfirstname; } StringgetLastname() throwsRemoteException{ returnlastname; } YRLGXQUHIHUHQFHG ^ 7KUHDG*URXS WJ 7KUHDGFXUUHQW7KUHDG JHW7KUHDG*URXS WJVWRS ` }
  • 38. 50, +%RXU]RXIL''RQVH] 42 Objet Distant Temporaire / ¶REMHWGLVWDQWHWVRQVHUYHXU publicinterfaceHelloextendsRemote{ StringsayHello(Personperson, int lang) throwsRemoteException; StringsayHello(Stringname, int lang) throwsRemoteException; } publicclassHelloImpl extendsjava.rmi.server.UnicastRemoteObject implementsHello{ StringsayHello(Personperson, int lang) throwsRemoteException{ Stringfirstname=person.getFirstname(); // invocationdistantesur leStub Stringlastname=person.getLastname(); // invocationdistantesur leStub returnsayHello(firstname+ +lastname, lang); } …} publicclassHelloServer { publicstaticvoidmain(Stringargs[]) { if (System.getSecurityManager() ==null) { System.setSecurityManager(newjava.rmi.RMISecurityManager()); } try{ HelloImpl obj =newHelloImpl(Hello.EN); java.rmi.Naming.rebind(//hostreg/HelloObject, obj); } catch(Exceptione) { e.printStackTrace(); } } }
  • 39. 50, +%RXU]RXIL''RQVH] 43 Objet Distant Temporaire 'pURXOHPHQWGHO ¶H[pFXWLRQ KRVWVHU KRVWVHU -90+HOOR6HUYHU -90+HOOR6HUYHU KRVWFOL KRVWFOL -90$VQF+HOOROLHQW -90$VQF+HOOROLHQW PDLQWKUHDG KHOOR XQLFDVWREMHFWWKUHDG DWWHQWHG ¶XQHLQYRFDWLRQGHPpWKRGH SHUVRQWKUHDG V FUpDWLRQGHSHUVRQ H[SRUWGHSHUVRQ LQYRFDWLRQGHKHOORVD+HOOR SHUVRQ+HOOR(1 H[pFXWLRQGH KHOORVD+HOOR SHUVRQ+HOOR(1 DWWHQWHGXUpVXOWDW DWWHQWHG ¶XQHPpWKRGH H[pFXWLRQGH SHUVRQJHW)LUVWQDPH LQYRFDWLRQGH SHUVRQJHW)LUVWQDPH H[pFXWLRQGH SHUVRQJHW/DVWQDPH LQYRFDWLRQGH SHUVRQJHW/DVWQDPH UpFHSWLRQHWH[pFXWLRQ GH XQUHIHUHQFHG '* UpFHSWLRQGXUpVXOWDW DWWHQWHG ¶XQHLQYRFDWLRQGHPpWKRGH
  • 40. 50, +%RXU]RXIL''RQVH] 46 L ’activation d ’objets distants ■ Rappel (JDK1.1) • l ’objet distant est actif au démarrage du serveur RMI ■ Motivation • principe du démon inetd d ’ Unix • Le démon rmid démarre une JVM qui sert l ’ objet distant seulement au moment de l ’ invocation d ’ une méthode (à la demande) ou au reboot. ■ JDK1.2 introduit • un nouveau package java.rmi.activation • un objet activable doit dériver de la classe Activatable • un démon RMI rmid • qui active les objets à la demande ou au reboot de la machine ■ Info : jdk1.2.2docsguidermiactivation.html ■ Remarque : l’activition est très utilisée par JINI !
  • 41. 50, +%RXU]RXIL''RQVH] 47 Créer une implémentation activable • La classe doit étendre MDYDUPLDFWLYDWLRQ$FWLYDEOH et implémenter l ’interface distante • La classe doit déclarer un constructeur avec 2 arguments java.rmi.activation.ActivationID, java.rmi.MarshalledObject SXEOLFFODVV +HOOR$FWLYDWDEOH,PSO H[WHQGV MDYDUPLDFWLYDWLRQ$FWLYDWDEOH LPSOHPHQWV +HOOR ^ SULYDWHLQWGHIDXOWODQJ SXEOLF $FWLYDWDEOH,PSOHPHQWDWLRQ $FWLYDWLRQ,' LG 0DUVKDOOHG2EMHFW GDWD WKURZV MDYDUPL5HPRWH([FHSWLRQ ^ VXSHU LG WKLVGHIDXOWODQJ ,QWHJHU GDWDJHW LQW9DOXH ` LPSOpPHQWDWLRQGHVPpWKRGHV SXEOLF6WULQJ VD+HOOR WKURZVMDYDUPL5HPRWH([FHSWLRQ ^«` `
  • 42. 50, +%RXU]RXIL''RQVH] 48 Créer le programme d ’enregistrement (Setup) ■ Rôle • passer l ’ information nécessaire à l ’activation de l ’ objet activable au démon rmid puis enregistrer l ’ objet auprès de rmiregistry ■ Descripteur • ActivationDesc: description des informations nécessaires à rmid ■ Groupes d’objets activables • rmid active une JVM par groupe • Les objets du même groupe partagent la même JVM • ActivationGroup: représente un groupe d ’objets activables • ActivationGroupDesc: description d ’un groupe • ActivationGroupID: identifiant d ’un groupe
  • 43. 50, +%RXU]RXIL''RQVH] 49 Créer le programme d ’enregistrement ([HPSOH SDUWLH import java.rmi.*; import java.rmi.activation.*; import java.util.Properties; publicclassSetupActivHello{ publicstaticvoidmain(String[] args) throwsException{ System.setSecurityManager(newRMISecurityManager()); // créationd’ungrouped’objetsactivables Propertiesprops=newProperties(); props.put(java.security.policy, ./helloactiv.policy); ActivationGroupDesc.CommandEnvironment ace=null; // descripteur dugroupe ActivationGroupDescagroupdesc=newActivationGroupDesc(props, ace); // ActivationSystemasystem=ActivationGroup.getSystem(); ActivationGroupIDagi =asystem.registerGroup(agroupdesc); // enregistrement dugroupe ActivationGroup.createGroup(agi, agroupdesc, 0);
  • 44. 50, +%RXU]RXIL''RQVH] 50 Créer le programme d ’enregistrement ([HPSOH SDUWLH // ledescripteur doit contenir lecodebasepour chercher lesclasses Stringclasseslocation=http:/hostwww/hello/myclasses/; // ledescripteur peut contenir unobjet sérialisablepour l ’initialisationdel ’objet ; datapeut êtrenull MarshalledObject data=newMarshalledObject (newInteger(Home.ES)); // créationd’undescripteur pour l ’objet activable ActivationDescadesc=newActivationDesc (agi, examples.hello.HelloActivatableImpl, classeslocation, data); // enregistrement del ’objet auprèsdudémonrmid: récupérationd’unstub Helloobj =(Hello)Activatable.register(adesc); // enregistrement dustubauprèsdurmiregistry Naming.rebind(//hostreg/HelloActiv, obj); System.exit(0); } }
  • 45. 50, +%RXU]RXIL''RQVH] 51 Personnaliser la couche Transport des RMI ■ Rappel • Par défaut, TCP est utilisé par la couche de transport RMISocketFactory (classes java.net.Socket et java.net.SocketServer) 2 cependant dans les cas de Firewall/proxies, elle invoque les méthodes en utilisant la méthode POST de HTTP. • La propriété java.rmi.server.disableHttp=true désactive le tunneling HTTP ■ Motivation • utiliser d ’ autres classes (que Socket et SocketServer) basées sur ª TCP pour de la compression, du chiffrage, … ªRemarque : RMI over SSL utilise cette technique (voir l ’ exemple) ª ou non (UDP) ■ ,QIRMGN?GRFV?JXLGH?UPL?UPLVRFNHWIDFWRUGRFKWPO
  • 46. 50, +%RXU]RXIL''RQVH] 52 Personnaliser la couche Transport des RMI ■ Etape 1 Écrire 2 sous classes de MDYDUPL50,OLHQW6RFNHW)DFWRU MDYDUPL50,6HUYHU6RFNHW)DFWRU qui utilisent 2 autres classes de transport que MDYDQHW6RFNHW MDYDQHW6RFNHW6HUYHU (voir cours Socket)
  • 47. 50, +%RXU]RXIL''RQVH] 53 Personnaliser la couche Transport des RMI SDFNDJH H[DPSOHVUPLVRFIDF LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPLVHUYHU SXEOLFFODVV RPSUHVVLRQOLHQW6RFNHW)DFWRU LPSOHPHQWV 50,OLHQW6RFNHW)DFWRU 6HULDOL]DEOH ^ SXEOLF 6RFNHWFUHDWH6RFNHW 6WULQJKRVW LQW SRUW WKURZV ,2([FHSWLRQ^ UHWXUQQHZ RPSUHVVLRQ6RFNHW KRVWSRUW `` SXEOLFFODVV RPSUHVVLRQ6HUYHU6RFNHW)DFWRU LPSOHPHQWV 50,6HUYHU6RFNHW)DFWRU 6HULDOL]DEOH ^ SXEOLF 6HUYHU6RFNHWFUHDWH6HUYHU6RFNHW LQW SRUW WKURZV ,2([FHSWLRQ^ UHWXUQQHZ RPSUHVVLRQ6HUYHU6RFNHW SRUW ``
  • 48. 50, +%RXU]RXIL''RQVH] 54 Personnaliser la couche Transport des RMI ■ Etape 2 Spécifier les factories dans le constructeur de l ’ objet distant qui hérite de la classe 8QLFDVW5HPRWH2EMHFW SURWHFWHG8QLFDVW5HPRWH2EMHFW LQW SRUW 50,OLHQW6RFNHW)DFWRU FVI 50,6HUYHU6RFNHW)DFWRU VVI ■ Exemple: SXEOLF$FFRXQW,PSO WKURZV5HPRWH([FHSWLRQ ^ VXSHU QHZ RPSUHVVLRQOLHQW6RFNHW)DFWRU QHZ RPSUHVVLRQ6HUYHU6RFNHW)DFWRU «`
  • 49. 50, +%RXU]RXIL''RQVH] 55 RMI et SSL ■ Couche de transport custom • SSLClientSocketFactory, SSLServerSocketFactory • utilisent SSLSocket, SSLServerSocket (www.phaos.com) ■ voir • jdk1.2.2docsguidermiSSLInfo.html • jdk1.2.2docsguidermiPhaosExample.html
  • 50. 50, +%RXU]RXIL''RQVH] 56 RMI over SSL 50,OLHQW6RFNHW)DFWRUHW 50,6HUYHU6RFNHW)DFWRU SDFNDJH H[DPSOHVUPLVVO LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPLVHUYHU LPSRUWFUSVHF66/ LPSRUWHGHVFODVVHVGH66/ ZZZSKDRVFRP SXEOLFFODVV66/OLHQW6RFNHW)DFWRU LPSOHPHQWV 50,OLHQW6RFNHW)DFWRU 6HULDOL]DEOH ^ SXEOLF6RFNHWFUHDWH6RFNHW 6WULQJKRVW LQW SRUW WKURZV ,2([FHSWLRQ^ UHWXUQ 6RFNHW QHZ66/6RFNHW KRVWSRUWQHZ66/3DUDPV `` SXEOLFFODVV66/6HUYHU6RFNHW)DFWRU LPSOHPHQWV 50,6HUYHU6RFNHW)DFWRU 6HULDOL]DEOH ^ WUDQVLHQWSURWHFWHG 66/3DUDPV SDUDPV SXEOLF66/6HUYHU6RFNHW)DFWRU ^ WKLV QHZ66/3DUDPV ` SXEOLF66/6HUYHU6RFNHW)DFWRU 66/3DUDPVS ^ SDUDPV S` SXEOLF6HUYHU6RFNHWFUHDWH6HUYHU6RFNHW LQW SRUW WKURZV ,2([FHSWLRQ^ UHWXUQQHZ66/6HUYHU6RFNHW SRUW ``
  • 51. 50, +%RXU]RXIL''RQVH] 57 50, RYHU 66/ O ¶REMHWGLVWDQW SDFNDJH H[DPSOHVUPLVVO LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPL LPSRUWMDYDUPLVHUYHU SXEOLFFODVV66/+HOOR,PSO H[WHQGV 8QLFDVW5HPRWH2EMHFWLPSOHPHQWV +HOOR^ SULYDWHLQWGHIDXOWODQJ SXEOLF66/+HOOR,PSO 66/6HUYHU6RFNHW)DFWRU VVILQWGHIDXOWODQJ WKURZV5HPRWH([FHSWLRQ ^ VXSHU QHZ66/OLHQW6RFNHW)DFWRU VVI WKLVGHIDXOWODQJ GHIDXOWODQJ ` SXEOLF6WULQJ VD+HOOR WKURZV5HPRWH([FHSWLRQ ^` `
  • 52. 50, +%RXU]RXIL''RQVH] 58 RMI over SSL OHVHUYHXU SDFNDJH H[DPSOHVUPLVVO LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPL LPSRUWMDYDUPLVHUYHU SXEOLFFODVV66/+HOOR6HUYHU^ SXEOLF VWDWLFYRLG PDLQ 6WULQJ DUJV@ ^WU ^ LQLWLDOL]HVHUYHUFHUWLILFDWH 66/HUWLILFDWH FHUW QHZ66/HUWLILFDWH FHUWFHUWLILFDWH/LVW QHZ 9HFWRU FHUWFHUWLILFDWH/LVWDGG(OHPHQW QHZ; QHZ)LOH VHUYHUFHUWGHU FHUWFHUWLILFDWH/LVWDGG(OHPHQW QHZ; QHZ)LOH FDFHUWGHU 66/3DUDPV SDUDPV QHZ66/3DUDPV LQLWLDOL]H 66/ FRQWH[WREMHFW SDUDPVVHW6HUYHUHUW FHUW SDUDPVVHW5HTXHVWOLHQWHUW WUXH UHTXLUH FOLHQWDXWKHQWLFDWLRQ 6VWHPVHW6HFXULW0DQDJHU QHZ50,6HFXULW0DQDJHU VHFXUHVHUYHUVRFNHWIDFWRU WRXVHLQ UHPRWHREMHFWV 66/6HUYHU6RFNHW)DFWRU VVI QHZ66/6HUYHU6RFNHW)DFWRU SDUDPV FUHDWH D VHFXUHUPLUHJLVWU 5HJLVWUUHJLVWU /RFDWH5HJLVWUFUHDWH5HJLVWU QHZ66/OLHQW6RFNHW)DFWRU VVI FUHDWH D UHPRWHREMHFWWKDWZLOOXVHD VHFXUH FOLHQWVHUYHUVRFNHW SDLU 66/+HOOR,PSOR QHZ66/+HOOR,PSO VVI+HOOR)5 UHJLVWUUHELQG 66/+HOOR2EMHFWR `FDWFK ([FHSWLRQH ^6VWHPHUUSULQWOQ HJHW0HVVDJH HSULQW6WDFN7UDFH ` ``
  • 53. 50, +%RXU]RXIL''RQVH] 59 RMI over SSL OHFOLHQW SDFNDJH H[DPSOHVUPLVVO LPSRUWMDYDLR LPSRUWMDYDQHW LPSRUWMDYDUPL LPSRUWMDYDUPLVHUYHU SXEOLFFODVV66/+HOOROLHQW^ SXEOLF VWDWLFYRLG PDLQ 6WULQJ DUJV@ ^ WU ^ LI DUJVOHQJWK ^6VWHPHUUSULQWOQ 8VDJHKRVW1DPH! 6VWHPH[LW ` 6VWHPVHW6HFXULW0DQDJHU QHZ50,6HFXULW0DQDJHU UHDWH D VHFXUHUPLUHJLVWU 5HJLVWUUHJLVWU /RFDWH5HJLVWU JHW5HJLVWU DUJV@QHZ66/OLHQW6RFNHW)DFWRU 2EWDLQ D UHIHUHQFH WR WKH+HOOR2EMHFW +HOORKHOOR +HOOR UHJLVWUORRNXS 66/+HOOR2EMHFW 6VWHPRXWSULQWOQ 0HVVDJHKHOORVD+HOOR `FDWFK ([FHSWLRQH ^ HSULQW6WDFN7UDFH ` ` `
  • 54. 50, +%RXU]RXIL''RQVH] 60 Le glaneur de cellules distibué des RMI java.rmi.dgc ■ Motivation pour un GC réparti • ramasser les objets distants qui ne sont plus référencés (i.e. plus de stub sur des clients) ■ Principe • basé sur le comptage de références • interagit avec les GCs locaux de toutes les JVM • maintient des ZHDNVUHIHUHQFHV pour éviter le ramassage par le GC local ■ Remarque: • en cas de partition du réseau, les objets peuvent être prématurément ramassés
  • 55. 50, +%RXU]RXIL''RQVH] 61 Le glaneur de cellules distibué des RMI java.rmi.dgc ■ Interface java.rmi.server.Unreferenced packagejava.rmi.server; publicinterfaceUnreferenced{ publicvoidunreferenced(); } • Un objet distant peut être notifié quand il n ’ est plus référencé • il doit implémenter l ’interface java.rmi.server.Unreferenced • la méthode void unreferenced() est appelée par le DGC quand il n ’ y a plus de référence.
  • 56. 50, +%RXU]RXIL''RQVH] 63 Détail d ’implantation ■ Coté serveur • Une thread par appel d ’un client • + la thread d ’ écoute des nouveaux appels sur le socket • L ’ appel concurrent aux méthodes n ’ est pas synchronisé • La synchronisation est à la charge du développeur • Un couple hôte,port pour tous les objets par une JVM 8QGHURQVWUXFWLRQ (QRQVWUXFWLRQ
  • 57. 50, +%RXU]RXIL''RQVH] 64 RMI over IIOP ■ Couche de transport : IIOP (www.omg.org) 8QGHURQVWUXFWLRQ (QRQVWUXFWLRQ
  • 58. 50, +%RXU]RXIL''RQVH] 65 RMI et EJB 8QGHURQVWUXFWLRQ (QRQVWUXFWLRQ
  • 59. 50, +%RXU]RXIL''RQVH] 67 RMI et JINI ■ JINI • mécanisme de courtage distribué (GLVFRYHUMRLQORRNXS) • Courtage tolérant aux pannes (redondance) • Recherche par rapport à l’interface du service (nom+signature méthodes) à des attributs qualifiants (Entry) à des groupes • Le client récupère la liste des objets distants (stub RMI) potentiellement actifs ou activables offrant ce service ■ JERI : JINI Extensible Remote Invocation • Rendre extensible les couches transfort et sérialisation des RMI • http://pandonia.canberra.edu.au/java/jini/tutorial/Jeri.html
  • 60. 50, +%RXU]RXIL''RQVH] 68 Ajout du J2SE 1.4 ■ MDYDUPLVHUYHU50,ODVV/RDGHU6SL • Délégation du chargement dynamique des classes ■ Support du POA (Portable Object Adapter) pour rmic • rmic -iiop -poa … ■ Génération d’IDL CORBA • Pour l’ interopérabilité avec des serveurs CORBA via IIOP • rmic -idl …
  • 61. 50, +%RXU]RXIL''RQVH] 69 Ajout du J2SE 1.5 ■ Nouveautés dans le langage Java : les annotations • Avant 1.5 publicinterfaceIHelloextendsRemote{ publicStringsayHello(Stringname) throwsRemoteException; } publicclassHelloimplementsIHello{ publicStringsayHello(Stringname) throwsRemoteException{ returnHello+name; }} • Avec les annotations du 1.5 publicclassHello{ // with1.5annotations public#UHPRWH StringsayHello(Stringname) { returnHello+name; }} ■ Impact sur les outils de génération comme rmic
  • 62. 50, +%RXU]RXIL''RQVH] 70 Portable Interceptor RMI ■ TODO ■ Voir CAROL d’ObjectWeb
  • 63. 50, +%RXU]RXIL''RQVH] 71 Comparaison 50, 1(75HPRWLQJ 25%$ 62$3 3ODWHIRUPHV 0XOWL :LQ )UHH%6' /LQX[ 0XOWL 0XOWL /DQJDJHV GH3URJUDPPDWLRQ -DYD 9%- « 0XOWL 0XOWL /DQJDJHVGH 'pILQLWLRQGH6HUYLFH -DYD /5 ,'/ ;0/ 5pVHDX 73+773,,23 FXVWRPLVDEOH 73+773 ,,23 *,23,,23 3OXJJDEOH7UDQVSRUW/DHU 53+773 ,QWHUFHSWHXU GHSXLV 2XL DOORQWH[W 2XL ([WHQVLRQDSSOLFDWLYH GDQVOHKHDGHU ([WUD KDUJHPHQW GQDPLTXH GHVFODVVHV 6HUYLFHVRPPXQV 6HUYLFHV6HFWRULHOV 0DUVKDOOLQJ 6pULDOLVDWLRQ -DYD 62$3 4XL 681 0LFUR6RIW(0$ 20* : 1RPPDJH 50,-1',-,1, ,31RP RV1DPLQJ ,33RUW85/ )RUPDWWHXUV %LQDLUH62$3 3DVGHKDUJHPHQW GQDPLTXH GHVFODVVHV 5HSUpVHQWDWLRQ ,,23 53 0XOWL « 53*(1 738'3 1RQ 68126) ,33RUW
  • 64. 50, +%RXU]RXIL''RQVH] 73 Bibliographie ■ Spécification des RMI • java.sun.com et jdk1.2.2/docs/guide/rmi/spec ■ Guide de la doc du JDK • jdk1.2.2/docs/guide/rmi ■ Tutorial Java • Trail sur les RMI et sur JINI (Objet activables) • Online Training • http://developer.java.sun.com/developer/onlineTraining/Programming/JDCBo ok/rmi.html ■ Autres • Jeremie : une implémentation OpenSource des RMI • http://www.objectweb.org
  • 65. 50, +%RXU]RXIL''RQVH] 74 Bibliographie ■ Gilles Roussel, Étienne Duris, Java et Internet, Concepts et programmation, Ed Vuibert, 01/2000, ISBN : 2-7117-8654-4 • le chapitre 11 détaille bien les RMI du JDK1.2 et notamment les objets activables ■ Elliotte Rusty Harold, Programmation Réseau avec Java, Ed O Reilly, 1997, ISBN 2-84177-034-6 • date un peu ■ Java Distributed Computing, Ed Oreilly existe en français • date un peu ■ Robert Orfali, Dan Harkey, “ Client/Server Programming with Java and Corba ”, 2ème édition, 1998, Ed Wiley, ISBN 0-471-24578-X. • survol rapide • comparaison intéressante avec les autres techniques (DCOM, CORBA, …)