Práctica II: Java RMI
Práctica II: Java RMI (I): introducción Localización de objetos remotos. Comunicación con objetos remotos. Carga de código móvil. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (II): introducción Normalmente los sistemas RPC se declaran mediante IDL. JavaRMI utiliza una interfaz Java => sólo utilizable entre aplicaciones Java. Necesidades de las aplicaciones distribuidas: Localización de objetos remotos: Rmiregistry ó Paso de objetos como referencias remotas, ó Servicio de nombrado CORBA, en RMI/IIOP. Comunicación con objetos remotos. JavaRMI se ocupa de que la interacción entre objetos sea como invocaciones locales. Carga de los bytecodes de los objetos que se pasan como parámetros o valores de retorno. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (III): diferencias Diferencias con el modelo de objetos local Java: Los clientes de los objetos remotos tratan sólo con interfaces remotas, no con la implementación. Los argumentos “no remotos” se pasan siempre por copia, no por referencia. Los objetos remotos se pasan por referencia. Los clientes han de tratar más excepciones que antes. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (IV): interfaz java.rmi.Remote Interfaz que declara un conjunto de métodos que pueden invocarse desde una JVM remota. Una interfaz remota debe extender la interfaz java.rmi.Remote. Un método remoto: Debe incluir la excepción java.rmi.RemoteException (o superclases). Ejemplo: public interface BankAccount extends java.rmi.Remote { public void deposit(float amount) throws java.rmi.RemoteException; public void withdraw(float amount) throws OverdrawnException, java.rmi.RemoteException; public float getBalance() throws java.rmi.RemoteException; } Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (V): clase RemoteObject Parte servidora; tres subclases: Java.rmi.Server.RemoteObject: implementaciones para los métodos de Object: hashCode, equals, toString. Java.rmi.server.UnicastRemoteObject: define un objeto remoto Singleton cuyas referencias son sólo válidas mientras el proceso esté vivo. Java.rmi.server.Activatable: abstracta que define un objeto remoto activable “on request”. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (VI): localización Un cliente necesita referencia al objeto remoto que quiere invocar. La referencia se almacena en un servicio de registro (rmiregistry) mediante la convención de java.rmi.Naming: Look up. Bind. Rebind. Unbind. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (VII): stubs & skeletons Stub: proxy en la parte cliente para el objeto remoto. El cliente invoca el stub, que es quien se conecta con la parte servidora: Conexión con JVM remota. Marshalling. Espera de resultados. Unmarshalling de valores de retorno o excepciones. Devolución de resultado a la aplicación cliente. Skeleton: no necesario en Java2 Platform.Ejerce de dispatcher. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (VIII): garbage collection Borrado automático de objetos remotos cuando no son referenciados por ningún cliente. RMI se basa en Network Object de Modula-3. Cuando hay una nueva referencia: count++ Especialización de Leasing. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (IX): ejemplo Creación de la interfaz remota Java Implementación de la interfaz remota. Main: Gestor de seguridad. Creación de instancia del objeto remoto. Registro del objeto. Implementación de la aplicación cliente. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (X): compilación Entorno: set CLASSPATH=%CLASSPATH%;<practicas>\examples\hello;. Compilación de las fuentes. javac Hello.java HelloImpl.java HelloClient.java Generación de stubs/skeletons. rmic examples.hello.HelloImpl Genera: HelloImpl_Stub.class HelloImpl_Skel.class //opcional. Sistemas Distribuidos - Nebrija - Justo Hidalgo
Práctica II: Java RMI (XI): ejecución Arranque del rmiregistry: start set CLASSPATH= rmiregistry <puerto> Arranque del servidor: java -Djava.rmi.server.codebase=file:///<path>/ -Djava.security.policy=<path>\policy examples.hello.HelloImpl Arranque del cliente: java -Djava.rmi.server.codebase=file:///<path>/ -Djava.security.policy=<path>\policy examples.hello.HelloClient <host> Sistemas Distribuidos - Nebrija - Justo Hidalgo