+ All Categories
Home > Documents > Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota...

Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota...

Date post: 27-Jul-2020
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
24
Object Oriented Middleware: Java RMI LSUB GSYC 5 de abril de 2016
Transcript
Page 1: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

Object Oriented Middleware: Java RMI

LSUB

GSYC

5 de abril de 2016

Page 2: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

(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.

Page 3: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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.

Page 4: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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.

Page 5: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

RMI

Imagen c©O’Reilly

Page 6: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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

Page 7: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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).

Page 8: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ;

}

Page 9: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ) ;

Page 10: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ) ;

Page 11: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ( ) ;

}}

}

Page 12: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ) ;

Page 13: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ” ) ;

Page 14: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ( ) ;

}}

}

Page 15: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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.

Page 16: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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.

Page 17: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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

Page 18: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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.

Page 19: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

RMI: descarga dinamica de clases

(c) Oracle

Page 20: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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).

Page 21: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 /

Page 22: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ( ) ) ;

}

Page 23: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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 ;

} ;

Page 24: Object Oriented Middleware: Java RMIlsub.org/ast/13.rmi.pdf · RMI En resumen: I La clase remota debe estar partida en una interfaz y una clase que la implemente. I Todos los m etodos

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


Recommended