Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota...
Transcript of Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota...
Object Oriented Middleware: Java RMI
LSUB
GSYC
5 de abril de 2016
(cc) 2015 Laboratorio de Sistemas,Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento -
NoComercial - SinObraDerivada (by-nc-nd). Para obtener la licencia completa, veasehttp://creativecommons.org/licenses/. Tambien puede solicitarse a Creative Commons, 559 Nathan Abbott Way,
Stanford, California 94305, USA.
Las imagenes de terceros conservan su licencia original.
RMI
I OOM (Object Oriented Middleware) de Java.
I Permite:
I Localizar objetos remotos.I Invocar metodos de objetos remotos.I Cargar dinamicamente definiciones de clases remotas.
I El compilador genera los stubs.
I Usa la serializacion de Java.
I El RMI registry se encarga del nombrado.
RMI
En resumen:
I La clase remota debe estar partida en una interfaz y una claseque la implemente.
I Todos los metodos remotos deben estar especificados en lainterfaz.
I La interfaz debe extender java.rmi.remote.
I Todos los metodos remotos deben especificar que levantanRemoteException.
I Si los metodos usan (argumentos, retorno) otro objeto remoto,este objeto tambien debe ser definido por una interfaz.
RMI
Imagen c©O’Reilly
Registry
I Es un servicio de nombrado sencillo para localizar los objetosremotos.
I En la maquina en la que creamos el registro debemos ejecutarel comando:
rmiregistry
RMI
Argumentos en RMI:
I Los objetos remotos se pasan por referencia. El objeto remotoen realidad es una instancia del stub de cliente que lerepresenta.
I Los objetos locales se pasan por valor, se envıa una copia delobjeto serializado (Serializable).
RMI: servidor
I Si una interfaz exiende la interfaz Remote hace que losmetodos sean accesibles por RMI.
I Las excepciones extra provocadas por los mecanismos de deRMI (el servidor no responde, error de aplanado, etc.) seengloban en RemoteException (es checked).
I Ademas de RemoteException, los metodos pueden levantarotras excepciones (existentes o definidas por el programador).Las excepciones funcionan como se espera: saltan en el cliente.
pub l i c i n t e r f a c e C l o c k S e r v e r extends Remote {pub l i c Date getTime ( ) throws RemoteExcept ion ;
}
RMI: Exportar el objeto
I Hay que instanciar un objeto de la clase y exportarlo.
I El metodo estatico exportObject() deUnicastRemoteObject permite crear el stub de servidor paraaceptar peticiones. Su segundo argumento es el puerto TCPque debe usar (0 significa que el puerto es anonimo).
I Dicho metodo retorna el stub de cliente para acceder a esteobjeto, que debemos registrar.
C l o c k S e r v e r c = new Clock ( ) ;C l o c k S e r v e r s t u b =
( C l o c k S e r v e r ) Un icas tRemoteObject . e x p o r t O b j e c t ( c , 0 ) ;
RMI: Exportar el objeto (ii)
I Para registrar el stub de cliente tenemos que localizar elregistro. La clase LocateRegistry permite crear un registroen esta JVM (metodo createRegistry()) o usar un registroexistente (metodo getRegistry()).
I Los metodos bind() / rebind() registran / reemplazan elstub con un nombre dado. Una aplicacion solo puede registrarobjetos remotos en su localhost.
I El metodo unbind() elimina el stub del registro.
R e g i s t r y r e g i s t r y = L o c a t e R e g i s t r y . c r e a t e R e g i s t r y ( 9 9 9 9 ) ;r e g i s t r y . r e b i n d ( ” Maste rC lock ” , s t u b ) ;
Codigo
pub l i c c l a s s Clock implements C l o c k S e r v e r{pub l i c Clock ( ) throws RemoteExcept ion{
super ( ) ;}
pub l i c Date getTime ( ) throws RemoteExcept ion{r e t u r n new Date ( ) ;
}
pub l i c s t a t i c vo id main ( S t r i n g a r g s [ ] ){t r y {
C l o c k S e r v e r c = new Clock ( ) ;C l o c k S e r v e r s t u b =
( C l o c k S e r v e r ) Un icas tRemoteObject . e x p o r t O b j e c t ( c , 0 ) ;R e g i s t r y r e g i s t r y = L o c a t e R e g i s t r y . c r e a t e R e g i s t r y ( 9 9 9 9 ) ;r e g i s t r y . r e b i n d ( ” Maste rC lock ” , s t u b ) ;System . out . p r i n t l n ( ” Clock bound ” ) ;
} catch ( E x c e p t i o n e ) {System . e r r . p r i n t l n ( ” Clock e x c e p t i o n : ” ) ;e . p r i n t S t a c k T r a c e ( ) ;
}}
}
RMI: cliente
I Debe conseguir una referencia al registro:
R e g i s t r y r e g i s t r y =L o c a t e R e g i s t r y . g e t R e g i s t r y ( ” pc1 . example . org ” , 9 9 9 9 ) ;
RMI: cliente
I list() lista las referencias remotas. Retorna un array deStrings.
I lookup() consigue el stub de cliente.
I Si no hay un objeto registrado que se ajuste a la peticion,retorna null.
C l o c k S e r v e r c =( C l o c k S e r v e r ) r e g i s t r y . l o o k u p ( ” Maste rC lock ” ) ;
Codigo
import org . l s u b . c l o c k s e r v e r . C l o c k S e r v e r ;
pub l i c c l a s s C l i e n t {pub l i c s t a t i c vo id main ( S t r i n g a r g s [ ] ){
t r y {R e g i s t r y r e g i s t r y = L o c a t e R e g i s t r y . g e t R e g i s t r y ( a r g s [ 0 ] ,
new I n t e g e r ( a r g s [ 1 ] ) ) ;C l o c k S e r v e r c = ( C l o c k S e r v e r ) r e g i s t r y . l o o k u p ( ” Maste rC lock ” ) ;System . out . p r i n t l n ( ” Maste rC lock s a y s : ” + c . getTime ( ) ) ;
} catch ( E x c e p t i o n e ) {System . e r r . p r i n t l n ( ” Clock e x c e p t i o n : ” ) ;e . p r i n t S t a c k T r a c e ( ) ;
}}
}
RMI runtime
I Solo hay un RMI runtime por JVM.
I Se encarga de crear y reutilizar los sockets para comunicar laJVM cliente y la JVM servidora.
I Permite compartir un pool de threads para multiplesservidores en la misma JVM.
Concurrencia
I Segun la especificacion de RMI, el runtime de RMI no daninguna garantıa sobre el mapeo de invocaciones a metodosremotos a threads en el servidor.
I Si varios threads de un mismo cliente invocan el metodoremoto concurrentemente, el stub de cliente los sincroniza.
I Pero distintos clientes en distintas JVMs pueden invocar elmetodo remoto concurrentemente.
I Por tanto, el metodo remoto puede tener condiciones decarrera (p. ej. si modifica un atributo).
I En ese caso, necesita ser synchronized o usar otromecanismo de sincronizacion.
Ejecucion
1. Como la clase Clock crea el registro con createRegistry()
no hace falta ejecutar en un terminal el comandormiregistry.
2. Maquina servidora (omac.lsub.org):java -cp rmiclock.jar org.lsub.clockserver.Clock
3. Maquina cliente (ignatz.lsub.org):java -cp rmiclock.jar org.lsub.clockclient.Client
omac.lsub.org 9999
Salida:MasterClock says: Fri Mar 15 13:23:18 CET 2013
RMI: descarga dinamica de clases
I RMI nos permite descargar clases dinamicamente si el clienteo el servidor no tienen todas las clases necesarias.
I Este mecanismo no es imprescindible, lo mas sencillo esdistribuir un jar con todas las clases.
I Complica la configuracion y puede suponer un problema deseguridad si no se configura con cuidado → no debemosusarlo si realmente no lo necesitamos.
RMI: descarga dinamica de clases
(c) Oracle
RMI: Codebase
java.rmi.server.codebase
I es la propiedad que indica la URL que puede usar un clientepara conseguir las clases si no estan en su classpath local.
I La URL debe especificar rutas absolutas y deben acabar con“/”.
I Lo usa el cliente, pero lo especifica el servidor.
I El propio Registry usa el codebase para encontrar el stub decliente.
I Si el codebase no esta bien puesto, la clase remota no podraregistrarse (bind/rebind fallara).
RMI: Codebase
I Para ejecutar el cliente, debemos anadir este argumento parala VM:
−Djava . rmi . s e r v e r . c ode bas e= f i l e : / U s e r s / e s o r i a n o / Java / workspace / c od eba se /
RMI: descarga dinamica de clases
Hay que instalar un Security Manager en el cliente y en el servidor:
I Determina los permisos (p. ej. el acceso al FS) del codigodescargado dinamicamente.
I Es necesario instalar uno para descargar clases.
i f ( System . g e t S e c u r i t y M a n a g e r ( ) == n u l l ) {System . s e t S e c u r i t y M a n a g e r (new S e c u r i t y M a n a g e r ( ) ) ;
}
Ejecucion
I Hay que generar ficheros de polıticas de seguridad (paracliente y servidor) para permitir que el SecurityManagerautorice las operaciones.
I Por ejemplo, este ficheroclient.policy hara que elSecurityManager de todos los permisos al cliente (¡ojo! ¡estoes inseguro!):
g r a n t {p e r m i s s i o n j a v a . s e c u r i t y . A l l P e r m i s s i o n ;
} ;
Ejecucion
I Para ejecutar el cliente, debemos anadir este argumento parala VM:
−Djava . s e c u r i t y . p o l i c y= f i l e : / U s e r s / e s o r i a n o / Java / workspace / r m i c l o c k / c l i e n t . p o l i c y