59
RMI Ingeniería del Software II Curso 2007/2008 Sergio Ilarri Artigas [email protected]

RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

RMI

Ingeniería del Software IICurso 2007/2008

Sergio Ilarri [email protected]

Page 2: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Índice

IntroducciónStubs y Skeletons (rmic)Objetos Remotos y Objetos Serializables:

Interface Remoto: ejemploObjeto Remoto: ejemplo

El Servicio de Nombres (rmiregistry)Ejemplo de Servidor y de ClienteIntercambio de Referencias RemotasAnexo: Algunos Conceptos Más Avanzados

Page 3: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Reflexión

¿Tienen los sockets alguna pega?

Necesita protocolos de aplicación

Page 4: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Introducción

En lugar de trabajar directamente con sockets, RMI:

Permite invocar métodos de objetos remotos de forma transparente

Asume un entorno Java homogéneo

Por tanto, podemos beneficiarnos de su modelo de objetos

Page 5: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Cómo podríamos invocar objetos remotos de forma transparente?

Que un objeto local se haga pasar por el objeto remoto y se encargue él de las comunicaciones

Reflexión

Page 6: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Cómo podríamos programar un objeto que trate las invocaciones remotas como si fueran locales?

Que otro objeto local se encargue de las comunicaciones y delegue en él la ejecución de las operaciones invocadas

Reflexión

Page 7: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Stubs y Skeletons

Stub SkeletonRed

Decodifica (unmarshalling/deserialization)los datos, invoca al método del servidor,devuelve resultados o excepciones

Invoca métodoimplementado porel objeto servidor

Cliente Servidor

Codifica (marshalling/serialization) y envía los datos y la invocaciónpor la red

Máquina 1Máquina 2

Page 8: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

StubCada clase de objetos remota tiene una clasestub asociada que implementa el interfaceremoto:

Usada por el cliente en sustitución de la claseremotaLas invocaciones remotas del cliente en realidadse dirigen al stubEn la implementación de cada operación, se envíaun mensaje con los parámetros de invocaciónserializados a la máquina virtual que ejecuta el objeto remoto

Page 9: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿A qué patrón suena esto?

Un stub es un Proxy

Reflexión

Visto en clase…

Page 10: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Skeleton

Clase usada por el servidor:Recibe los mensajes remotos

Deserializa los parámetros de invocación

Invoca el método del objeto queimplementa el interface remoto

Serializa los resultados y los devuelve al llamador, así como posibles excepciones

Page 11: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Reflexión

¿A qué patrón suena esto?

Un skeleton es un Adapter

Page 12: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Objetos Remotos y Serializables

Objetos remotos:Reciben invocaciones remotasSe pasan por referencia (remota)Tienen localización fijaImplementa un interface remoto

Objetos serializables:Encapsulan datosSe pasan por valorPueden transferirse a otra máquina virtual

Todo argumentoo valor de retorno

en RMI

implementsRemote

implementsSerializable

Page 13: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Interface Remoto (I)Define el protocolo de alto nivel entre clientey servidorEs un interface Java normal pero queextiende java.rmi.RemoteEn él el servidor declara los métodosdisponibles remotamente para los clientesTodos esos métodos deben lanzarjava.rmi.RemoteExceptionTodos los argumentos y resultados deben ser serializables

Page 14: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Ejemplo de Interface Remoto

import java.rmi.* ;public interface MessageWriter extends Remote {

void writeMessage(String s) throws RemoteException ;}

MessageWriter.java

Page 15: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Cómo conseguimos evitar que un método de un objeto remoto pueda ser invocado remotamente?

No definiéndolo en un interface que extienda java.rmi.Remote

Reflexión

Page 16: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Puede un cliente acceder remotamente a métodos estáticos?

No, pues no pueden definirse en un interfaceJava (igual que los atributos no constantes)

Reflexión

Page 17: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

public interface ClockWithMillis extends Clock{

...}No aparece extends Remote... Pero os digo que es un interface remoto... ¿Cómo es posible?

Será que Clock sí extiende el interface Remote

Reflexión

Page 18: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Interface Remoto (II)

El interface java.rmi.Remote:No declara ni métodos ni atributos

Su único propósito es “marcar” quecualquier interface que lo extienda debeser tratado por el sistema RMI como un interface remoto

El compilador de RMI rmic genera clasesstub y skeleton para aquellas clases queimplementan interfaces remotos

Page 19: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

public interface Clock{

public long getTime();} public interface ClockWithMillis extends Clock, Remote{...}

¿Por qué el ejemplo anterior no compilaría?

Porque getTime no declara que lanza RemoteException

Reflexión

Page 20: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

RemoteExceptionTodos los métodos remotos deben declararque pueden lanzar java.rmi.RemoteException(superclase de todas la excepciones RMI)

Invocaciones remotas: Sintácticamente como las locales

Pero pueden producirse fallos en la red, al serializar o deserializar argumentos, etc.

Se obliga al programador a tratar esos fallos

Las excepciones en el objeto “servidor” también se encapsulan y se propagan al “cliente”

Exceptionchaining

Page 21: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

El Objeto Remoto

Instancia de una clase que implementa un interface remoto

Esta clase debe extender normalmentejava.rmi.server.UnicastRemoteObject

Constructor (sin argumentos) que exporta el objeto al sistema RMI

El programador normalmente no usa esta claseexplícitamente, simplemente se extiende

Convención de nombrado: <nombreInterfaceRemoto>Impl

El constructor de la clase

implementada debe lanzar

RemoteException

Page 22: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Ejemplo de Objeto Remoto

import java.rmi.* ;import java.rmi.server.* ;public class MessageWriterImpl extends UnicastRemoteObject

implements MessageWriter {

public MessageWriterImpl() throws RemoteException {}

public void writeMessage(String s) throws RemoteException {System.out.println(s) ;

}

}

MessageWriterImpl.java

Page 23: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Compilador de RMI

Utilizado para “compilar” clases que implementan Remote (clases de implementación remotas)rmic (parte del JDK):

rmic ClassName genera las clases:ClassName_Stub (implementa el interface remoto)

ClassName_Skel (no con la versión del protocolo stub 1.2)

Con -keep, mantiene el código fuente intermedio del stub y del skeleton

Page 24: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Un “cliente” de una máquina desea comunicar con un “servidor”. ¿Cómo sabe dónde está?

-La localización se codifica en el código cliente-El usuario indica la localización-Nivel de indirección: servicio de nombres

Reflexión

Page 25: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (I)

Funciona como un listín telefónico:

Permite al cliente saber dónde se está ejecutando el objeto con el que desea contactar

Objetivo: independencia de localización

java.rmi.Naming

Page 26: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (II)En java.rmi.Naming tenemos los siguientes métodos estáticos:

public static void bind(String name, Remote object)public static void rebind(String name, Remote object)public static void unbind(String name)public static String[] list(String name)public static Remote lookup(String name)

Un parámetro nombre (name) es una URL con el formato://registryHost:port/logical_name

Por defecto, el host (opcional) es localhostPor defecto, el puerto (opcional) es 1099

Page 27: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (III)

Se abre un socket con el registry(servidor de nombres)

Se serializa el stub que implementa el objeto remoto

Se liga dicho stub con un nombre

bind(), rebind(),unbind()

El servidor asocia un nombre lógico al objeto

Bind y rebind

Page 28: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (IV)

lookup(): devuelve el stub ligado al nombre dado

list(): devuelve los nombres de todoslos objetos remotos registrados en eseservidor de nombres

list(),lookup()

El cliente obtiene una referencia al objeto a partir del nombre

Page 29: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (V)

java.rmi.Naming es una clase de utilidad que registra/contacta objetos a partir de una URL:

A partir de la URL, determina un objeto remoto registry, que implementa el interfacejava.rmi.registry.Registry, utilizando la clase de utilidad java.rmi.registry.LocateRegistry

Y ahora registra o contacta el objeto invocando un método de instancia, análogo al estático usado en java.rmi.Naming, sobre el objeto registry

Page 30: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (VI)

Código delcliente

Objetoremoto

Cliente Servidor

Registry Almacenareferencia

Solicitareferencia

Normalmente, el registry está en el servidor donde se aloja el objeto remoto

Page 31: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (VII)

Por tanto, distinguimos 3 pasos:1. Se llama a un método estático de Naming con

una cierta URL

2. Se analiza la URL y la información de máquina y puerto se utiliza para, a través de la claseLocateRegistry, obtenerse el stub del servidor de nombres (registry) correspondiente

3. Naming usa el stub para invocar el métodoapropiado del servidor de nombres

Page 32: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (VIII)

Aplicación rmiregistry:Contiene un objeto que implementa java.rmi.registry.RegistryNo es persistentePor seguridad, no permite (de)registrar objetos desde otra máquina

Cómo lanzar el servidor de nombres:rmiregistry 50500Desde código, en LocateRegistry:

public static createRegistry(int port)

Page 33: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Servicio de Nombres (IX)

Algunos inconvenientes:No es independiente de la localización:

La URL del objeto lleva la dirección y puerto del rmiregistry correspondienteSi el rmiregistry cambia de máquina, hay que cambiar los “clientes” o configurarlos para que “lean” la localización actual de algún sitio

Es una estructura de nombres “plana”No se permiten jerarquías (ej.: /is2/MessageWriter)No es escalable

Page 34: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Ejemplo de Servidor

import java.rmi.* ;public class HelloServer {

public static void main(String [] args) throws Exception {MessageWriter server = new MessageWriterImpl() ;Naming.rebind(“messageservice”, server) ;

}}

HelloServer.java

Este servidor crea un objeto remoto

Page 35: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Ejemplo de Cliente

import java.rmi.* ;public class HelloClient {

public static void main(String [] args) throws Exception {MessageWriter server = (MessageWriter) Naming.lookup(

“rmi://hendrix.cps.unizar.es/messageservice”) ;server.writeMessage(“Hello, world”) ;

}}

HelloClient.java

Page 36: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

A la vista de los ejemplo, ¿cuándo tenemos que referenciar los stubs y skeletons en el código?

Se manejan transparentemente

Reflexión

Page 37: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Intercambio de Referencias Remotas

Se pueden pasar como argumentos, y devolver como resultados, referencias a objetos remotos

public interface Printer extends Remote {

void print(String document) throws RemoteException ;

}

public interface PrinterHub extends Remote {

Printer getPrinter(int dpi, boolean isColor)

throws RemoteException ;

}

objetoremoto

Ejemplo: callbacks

Page 38: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Qué pasa si un objeto remoto recibe peticiones simultáneas de varios clientes?

Política multithread

Reflexión

Page 39: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Política MultithreadInvocaciones de diferentes clientes pueden ejecutarse concurrentemente en diferentes threads (ej., un thread por petición)

Por tanto, la clase que implementa el interface remoto tiene que ser thread-safe

Uso del modificador synchronizedSerializa las peticiones: cuidado con los deadlocks

Page 40: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Resumen Clases Java (I)

java.rmi.Remotejava.rmi.RemoteExceptionjava.rmi.server.UnicastRemoteObjectjava.rmi.activation.Activatablejava.rmi.server.RemoteRef

Page 41: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Resumen Clases Java (II)

java.rmi.Namingjava.rmi.registry.Registryjava.rmi.registry.LocateRegistryjava.rmi.UnmarshalExceptionjava.rmi.RMISecurityManager

Page 42: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Resumen Clases Java (III)

java.rmi.server.RMISocketFactoryjava.rmi.server.RMIServerSocketFactoryjava.rmi.server.RMIClientSocketFactory

Page 43: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Agradecimientos

Algunas de las transparencias e ideas de esta presentación estáninspiradas o han sido adaptadas de trabajos de:

Celsina Bignoli (http://www.smccd.edu/accounts/bignolic/)Bryan Carpenter (http://www.hpjava.org/courses/arl)

Page 44: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

ReferenciasRMI Trail (The Java Tutorial, Sun):http://java.sun.com/docs/books/tutorial/rmi/index.html

Remote Method Invocation Home (Sun): http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp

RMI Specification (Sun):http://java.sun.com/j2se/1.5.0/docs/guide/rmi/spec/rmiTOC.html

Page 45: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Fin

Page 46: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Anexo

Page 47: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Ejemplo de Clase Stub

public final class MessageWriterImpl_Stubextends java.rmi.server.RemoteStubimplements MessageWriter, java.rmi.Remote {

. . .public MessageWriterImpl_Stub(java.rmi.server.RemoteRef ref) {

super(ref);} public void writeMessage(java.lang.String $param_String_1)

throws java.rmi.RemoteException {try {

ref.invoke(this, $method_writeMessage_0,new java.lang.Object[] {$param_String_1},4572190098528430103L);

} . . .}

}

MessageWriterImpl_Stub.java (generado por rmic)

Page 48: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Tipos de Objetos Remotos

Antes hemos visto un ejemplo de unicastremote object:

Permanece en memoriaEl servidor debe estar siempre en funcionamiento

También hay activable objects:El objeto se activa la primera vez que se invoca un método del mismo (en lugar de estar esperando)Se puede desactivar (salir de memoria) mientras ningún cliente lo utilice

Extender java.rmi.server.UnicastRemoteObject o java.rmi.activation.Activatable

java.rmi.activationrmid tool

Page 49: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Recolección de Basura Distribuida

Desasigna memoria automáticamente

En el caso de objetos remotos:Una capa de referencias remotas:

En el servidor, mantiene una cuenta de referenciasEn el cliente, notifica al servidor cuando deja de usar unareferencia que mantiene localmente

Cuando la cuenta llega a 0, el servidor recolecta el objetoremoto

Un cliente con una referencia remota debe renovarperiódicamente un alquiler (lease) con servidor

Page 50: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Cuándo termina la ejecución de un programa servidor?

Depende de si sus objetos remotos se han registrado objetos en el servicio de nombres o no…

Reflexión

Page 51: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Necesita el cliente tener la clase del stub en su máquina?

No necesariamente al comienzo

Reflexión

Page 52: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Carga Dinámica de Clases (I)

La serialización almacena los datos, no el códigoSi al deserializar no se encuentra la clase:

java.rmi.UnmarshalExceptionjava.lang.ClassNotFoundException(excepción anidada)

Page 53: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Carga Dinámica de Clases (II)

¿Cómo podemos hacer la clase disponible en la máquina correspondiente?

Copiar las clases manualmente y situarlas en el CLASSPATHUtilizar un servidor web de clases:

Establecer la propiedad java.rmi.server.codebase, que se embebe automáticamente en la serialización (salvo si la clase se descargó de otra URL, en cuyo caso se embebe dicha URL)Cuando se deserializa el objeto en destino, la JVM puede descargar los bytecodes automáticamente

Page 54: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Carga Dinámica de Clases (III)

Para permitir la descarga de clases, hace falta establecer un SecurityManager (con una security policy):

System.setSecurityManager(new java.rmi.RMISecurityManager()) ;

Y definir una propiedad java.security.policy.

grant {permission java.security.AllPermission;

};Simple, pero peligroso…

Page 55: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Hablando de clases en general (no de stubs), si el cliente no tiene una clase necesaria localmente, ¿cómo lo vamos a compilar?

Por ejemplo, podría necesitar recibir unaclase más específica (subclase) que la que tiene

Reflexión

Page 56: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

¿Cómo es posible que el servidor no se caiga si matamos el rmiregistry?

Sólo es un servicio de nombres

Reflexión

Page 57: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Más Sobre el Intercambio de Referencias Remotas

Una referencia remota no es literalmente una referencia a un objeto Java en otra máquina virtual:

Es una referencia a un objeto Java local (que es una instancia de una clase stub) que implementa el mismo interface

Si intentamos hacer un cast de la referencia a una clase de implementación: ClassCastException

Si un argumento o resultado de un método remotoimplementa Remote, el tipo declarado debe ser un interface remoto, no puede ser una clase de implementación remota

Page 58: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Serialización en Java

Transformación de un objeto en un flujo (stream) de bytes, representación externaLa clase debe implementar el interfaceSerializable (NotSerializableException):

Es posible que haya que implementar los métodos readObject() y writeObject()Una clase que sólo referencia valores primitivos y clases serializables, también lo es

Modificador transient (no serializar)

Page 59: RMI - unizar.eswebdiis.unizar.es/~silarri/TEACHING/2007-08/ISII/RMIsilarri.pdf · El interface java.rmi.Remote: No declara ni métodos ni atributos Su único propósito es “marcar”

Callbacks

Un cliente puede pasar una referencia a sí mismo en el servidorEl servidor puede usar la referenciapara llamar a métodos remotos del cliente (callbacks)