Una introducción a Java RMI



Documentos relacionados
JAVA RMI (REMOTE METHOD INVOCATION)

Sistemas Distribuidos Java RMI (Remote Method Invocation) Alberto Lafuente Mikel Larrea Dpto. ATC, UPV/EHU

en otra máquina exactamente de la misma manera que si se encontrará en la misma máquina

Modelo de Objetos Distribuidos

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

1. Visión general de RMI

Llamada a métodos remotos (RMI). Curso 04/05. Tema 9. Departament d Informàtica. Universitat de València. 1. Introducción 2

DISEÑO DE UNA ARQUITECTURA CLIENTE/SERVIDOR MEDIANTE OBJETOS DISTRIBUIDOS EN JAVA

CONTENIDO. Serialización. Carga dinamica de stubs RMI AVANZADO. Callbacks. Carga dinámica de Stubs

Práctica 2: Java Remote Method Invocation (RMI)

RMI [Remote Method Invocation]

Java RMI Remote Method Invocation. Invocación Remota de Métodos en Java

Ingeniería del Software Arquitectura Física en 3 niveles

Arquitectura Cliente/Servidor. Invocación de Métodos Remotos RMI: Remote Method Invocation. Llamadas a Métodos Remotos

RMI Remote Method Invocation

JAVA - Serializacíon / RMI. (C) Philippe Roose , 2005

Interacción entre Aplicaciones: objetos distribuidos e invocación remota

CAPITULO 3 ARQUITECTURA DE COMPONENTES GIS EN INTERNET

PROGRAMACION DISTRIBUIDA MobileTracker: Ejemplo de implementación con RMI

Remote Method Invocation (RMI) de Java

Práctica 4: Java Remote Method Invocation (RMI)

Java RMI. las RPC de Java. Parte I. Luis Fernando Llana Díaz. Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

CREAR UN SERVICIO WEB BASICO CON JAVA AXIS2. Víctor J. Sosa

Sistemas Distribuidos (Capítulo 8 de Distributed Computing de M. L. Liu)

Introducción... 1 Qué es Java?... 1 Compilando a Bytecode... 1 Usando jgrasp Para Hacer el Trabajo Sucio... 5 El Entorno de jgrasp...

SISTEMAS DISTRIBUIDOS

Tema 3. Objetos distribuidos

5.1 Introducción a las tecnologías de objetos distribuidos con Java RMI

SISTEMAS DISTRIBUIDOS

FSD Práctica Invocación Remota: JavaRMI. Estudio Previo. Información

Invocación de métodos remotos en Java: JAVA - RMI

PROGRAMACION DISTRIBUIDA

Universidad ORT - Arquitectura de Software. Requisitos

Manual del Protocolo XML-RPC de Mensajería Negocios

Curso de Java POO: Programación orientada a objetos

SISTEMAS DISTRIBUIDOS Profesor: José Luis Montoya Restrepo

Java RMI. Sistemas distribuidos

Primera Escuela de la Red Temática SVO. Madrid, Noviembre, 2006 JAVA BÁSICO. Raúl Gutiérrez Sánchez LAEFF - INTA raul@laeff.inta.

Remote Method Invocation (RMI) Basado en: Fundamentals of RMI. Short Course. JGuru.

I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein Javier Navarro

Código Fuente. Creamos en C:\ una carpeta para ubicar el código fuente del servidor. En mi caso, he creado una carpeta denominada rmi4

Práctica 5: Common Object Request Broker Architecture CORBA

Programación Orientada a Objetos con Java

Programación en Java. Programación en OO

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

TutorJava recomienda...

Introducción a las Redes de Computadoras. Obligatorio

Servicios web con SOAP y Eclipse

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Práctica sobre compartición de instancias remotas.

Para poder instalar el producto, tendremos que obtener el instalador apropiado para nuestro entorno hardware y software.

Uso de excepciones en Java

Desarrollo de Servicios Web con JBuilder

Práctica 5: Callbacks RMI.

Tema 1. Introducción a JAVA

Pontificia Universidad Católica de Chile Escuela de Ingeniería Departamento de Ciencia de la Computación. IIC1102 Introducción a la Programación

Figura 7-1 Enlace para instalar el servidor web Apache Jakarta Tomcat

Configuración servidor Tomcat

Java Básico. Empaquetamiento y despliegue de aplicaciones. Copyright

Sockets en Java. La Creatividad proviene de un conflicto de ideas. Uso de Sockets

TUTORIAL DESARROLLO DE APLICACIONES PARA EVOLUTION CON MS ACCESS

Modo básico de funcionamiento del módulo Velneo vmodapache V7

Web Services en Java. Taller de Programación. Instituto de Computación Facultad de Ingeniería Universidad de la República

Edición de Ofertas Excel Manual de Usuario

Acronis License Server. Guía del usuario

Patrones para persistencia (I) Ingeniería del Software II

Pruebas de unidad con JUnit

Applets y Aplicaciones

Parsear HTML con htmlparser para Android Guillem Pérez

EXCEPCIONES EN JAVA. Las sentencias que tratan las excepciones son try y catch. La sintaxis es:

Características generales del lenguaje Java. María a Consuelo Franky

Introducción a la Programación Orientada a Objetos

Introducción al lenguaje Java

Java en 2 horas. Rodrigo Santamaría

Lab 01: Programación de Sockets en TCP

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I Facultad de Ingeniería, UBA. Junio Cátedra: Pablo Cosso

Ejercicio 4. EJB Sesión - Sistema SGA. Java EE. Ejercicio 4. EJB Sesión Sistema SGA. Curso de Java EE

Introducción a Java LSUB. 15 de enero de 2015 GSYC

MANUAL COPIAS DE SEGURIDAD

El lenguaje de programación Java

Java Inicial (20 horas)

GUI A D E I NSTALA CIO N D E AX IS

RMI. Aplicaciones Distribuidas

Sistemas de Información

3. Qué necesitamos para usar Wordpress?

DOCENTES FORMADORES UGEL 03 PRIMARIA

Entre los más conocidos editores con interfaz de desarrollo tenemos:

Programación Orientada a Objetos. Java: Excepciones

Tema 7. Construcción de Applets en Java

Transcripción:

Una introducción a Java RMI César Llamas Bello Estas transparencias no hubieran sido posible sin el tutorial de José M. Vidal Swearingen Engineering Center, University of South Carolina, Columbia Introducción Una JVM Objeto cliente RMI (middleware) referencia remota referencias locales Otra JVM Objeto servidor Proxy (stub) RED TCP skeleton Java RMI (Remote Method Invocation) es una extensión de Java que permite la programación de objetos distribuidos. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 2

Introducción RMI proporciona invocación de métodos dinámica Un cliente puede invocar un servidor sin conocer qué métodos contiene el servidor La referencia remota permite determinar la naturaleza del objeto Si es local o remoto Si es remota, si se arranca automáticamente o necesita ser inicializado 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 3 Introducción Las referencias a objetos remotos son independientes de plataforma Pero hay que usar Java en ambos extremos Los objetos remotos se recolectan en el GC por conteo de referencias El programa rmiregistry proporciona acceso a los objetos remotos. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 4

Una aplicación que dice Hello desde lejos La aplicación que dice Hello se compone de los siguientes elementos: HelloApplet: un applet Java que invoca un método remoto que implementa la interfaz... Hello: que se declara como remota, y según la cual... HelloImpl: crea un objeto sobre el que se puede invocar el método sayhello( ) El applet puede lanzarse desde una página web o el appletviewer. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 5 Una aplicación que dice Hello desde lejos Lo primero que hay que hacer es definir la interfaz Hello. A continuación se implementa esta interfaz. En este caso mediante HelloImpl. También hay que tener un programa que use el objeto remoto, como HelloApplet. Se compila la aplicación Se despliega (deployment) (fase compleja) Y se ejecuta. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 6

Diagrama de clases de la aplicación completa 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 7 Hello.java package examples.hello; import java.rmi.remote; import java.rmi.remoteexception; public interface Hello extends Remote { String sayhello() throws RemoteException; } Todos los métodos deben lanzar RemoteException puesto que la llamada puede fallar debido a la red Debe ser public El objeto remoto debe ser del tipo de la interfaz, no el tipo de la implementación (HelloImpl) 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 8

Hello.java (comentario) Los argumentos y valores de retorno pueden ser de cualquier tipo. Pero si un argumento o valor de retorno es un objeto debe implementar java.io.serializable Los objetos locales se pasan por copia (call-byvalue). Los objetos remotos se pasan por referencia (en realidad, una referencia a un stub). Muy interesante porque permite obtener referencias a otros objetos remotos a partir del primero. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 9 HelloImpl.java package examples.hello; import java.rmi.naming; import java.rmi.remoteexception; import java.rmi.rmisecuritymanager; import java.rmi.server.unicastremoteobject; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl() throws RemoteException { super(); } public String sayhello() { return "Hello World!"; } public static void main(string args[]) { } } } // Crea e instala un gestor de seguridad if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { HelloImpl obj = new HelloImpl(); // Enlaza este objeto instancia bajo el nombre "HelloServer" Naming.rebind("HelloServer", obj); System.out.println("HelloServer bound in registry"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getmessage()); e.printstacktrace(); 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 10

HelloImpl.java (desglose) package examples.hello; import java.rmi.naming; import java.rmi.remoteexception; import java.rmi.rmisecuritymanager; import java.rmi.*; import java.rmi.server.unicastremoteobject; public class HelloImpl extends UnicastRemoteObject implements Hello { public HelloImpl( ) throws RemoteException { super( ); } public String sayhello( ) { return "Hello World!"; } public static void main( String args[ ] ) {... } } 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 11 HelloImpl.java (comentario) Esta clase sirve para dos cosas: Implementa el objeto remoto. Sirve para lanzar el objeto, es decir es el servidor del objeto (en main). Estas dos funciones pueden separarse. La implementación deberá implementar todos los métodos de la interfaz o sería una clase abstracta. Podría haberse hecho como una clase activable (activatable) de modo que se lanzaría el objeto cuando se requiriera desde la aplicación remota. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 12

HelloImpl.java (comentario) Extiende UnicastRemoteObject de modo que utiliza el transporte por defecto de RMI El transporte por defecto es TCP/IP. Además permite que el objeto perdure. El constructor es el mismo que para una clase no remota. El constructor debe lanzar RemoteException, al igual que la clase base. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 13 HelloImpl.java (desglose) public static void main(string args[]) { // Crea e instala un gestor de seguridad if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { HelloImpl obj = new HelloImpl(); // Enlaza el objeto bajo el nombre "HelloServer" Naming.rebind("HelloServer", obj); System.out.println("HelloServer enlazado en el registro"); } catch (Exception e) { System.out.println("HelloImpl err: " + e.getmessage()); e.printstacktrace(); } 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 14

HelloImpl.java (comentario) Los objetos remotos deber ser exportados. Hace que el objeto escuche en un puerto anónimo los mensajes del stub (resguardo). La exportación es automática si se extiende: RemoteObject o Activatable. En caso contrario deberá invocarse: UnicastRemoteObject.exportObject o Activatable.exportObject. Se pueden implementar otros métodos pero solo serán invocables desde la JVM que corre el servicio. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 15 HelloImpl Seguridad y Registro Debe crearse e instalarse un gestor de seguridad SecurityManager. Si el cliente es una aplicación (y no un applet) podría requerir otro. El gestor de seguridad (SecurityManager) garantiza la política de acceso a los recursos. Cuando el servidor arranca (main) crea una o más instancias del objeto remoto. Puesto que se exporta automáticamente el objeto, queda ya listo para recibir mensajes. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 16

HelloImpl Seguridad y Registro Procedemos a registrar el objeto remoto con Naming.rebind("//host/objectname", obj) Ojo, porquérebind()? La clase implementa UnicastRemoteObject, y ya se exporta y registra nada más crearlo. El registro permite al invocador ubicar el objeto por nombre. Si se omite el host, se supone que es localhost. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 17 HelloImpl Seguridad y Registro En la exportación la referencia al objeto se substituye por la referencia al stub. Si no no habría forma de que se enlazara el stub con el objeto real (obj). Por razones de seguridad, una aplicación solo puede enlazar y desenlazarse con el registro que corre en la máquina local. Se pueden hacer búsquedas (lookups) sobre cualquier host. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 18

HelloApplet.java package examples.hello; import java.applet.applet; import java.awt.graphics; import java.rmi.naming; import java.rmi.remoteexception; public class HelloApplet extends Applet { String message = "blank"; // "obj" es el identificador que usaremos para referirnos al objeto // remoto que implementa la interfaz "Hello Hello obj = null; public void init() { try { obj = (Hello)Naming.lookup("//" + getcodebase().gethost() + "/HelloServer"); message = obj.sayhello(); } catch (Exception e) { System.out.println("HelloApplet exception: " + e.getmessage()); e.printstacktrace(); }} public void paint(graphics g) { g.drawstring(message, 25, 50); }} 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 19 HelloApplet.java (comentario) La función lookup hace dos cosas: 1. Construye una instancia del stub del registro para poder acceder al registro ( que también es remoto!). 2. Usa este stub para invocar al método lookup del registro. Al invocar al método sayhello() ocurre: 1. Se envía una invocación remota al servidor vía stub. 2. RMI serializa la cadena "Hello world" y la envía. 3. RMI la des-serializa en el cliente y retorna una cadena con este contenido. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 20

hello.html <HTML> <head> <title>hello World</title> </head> <body> <center> <h1>hello World</h1> </center> The message from the HelloServer is: <p> <applet codebase="." code="examples.hello.helloapplet" width=500 height=120> </applet> </body> </HTML> El codebase es el directorio desde donde el applet descargará los archivos.class. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 21 Protocolos involucrados en la aplicación cliente rmi rmi registry rmi servidor http http Servidor web http Servidor web 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 22

Pasos involucrados en esta aplicación applet 3. Se pide la referencia al objeto remoto registry 4. Se da la referencia 6. Se invoca el método remoto 5. Se carga el stub (.class) servidor 1. Se registra el objeto 2. Se carga el applet y la interfaz en la JVM del navegador Servidor web 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 23 Pasos involucrados en esta aplicación El objeto servidor y el servidor web corren en la misma máquina Aunque pudiera no ser así El valor de codebase (URL) representa el lugar de donde se puede descargar código Apunta al lugar del stub Y de la interfaz remota, en este caso 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 24

Pasos involucrados en cualquier aplicación applet 6. Se invoca un método remoto pasando un subtipo desconocido al objeto remoto como parámetro del método remoto servidor java.rmi.server.codebase= http://wwwserver/mydirectorio/ 7. El objeto remoto descarga la definición de la clase subtipo del codebase especificado por el cliente Servidor web 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 25 Pasos involucrados en cualquier aplicación Cuando se pasa un objeto remoto como argumento: Si es un tipo primitivo, nada. Si es un objeto cuya clase está en el CLASSPATH del objeto remoto se carga de allí. Si no está en el CLASSPATH, o bien: Es una implementación de la interfaz declarada como parámetro del método, o Es una subclase de la clase declarada como parámetro del método En cualquier caso se carga del codebase. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 26

Despliegue 1. Compile los fuentes: javac -d. *.java 2. Use rmic para generar los archivos.class del stub y skeleton, a partir de la implementación y la interfaz: rmic -d. examples.hello.helloimpl 3. Mueva hello.html a un servidor web (junto a los archivos.class) o use el appletviewer. 4. Arranque el registro rmi en el servidor: rmiregistry & 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 27 Despliegue 1. Arranque el servidor. Especifique el codebase y la política de la clase stub para poder cargarla dinámicamente en el registro java - Djava.rmi.server.codebase=http://myhost/~my usrname/myclasses/ - Djava.security.policy=$HOME/mysrc/policy examples.hello.helloimpl 2. Ejecute el applet (desde un navegador o desde el appletviewer) 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 28

Usando métodos de factoría en RMI 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 29 Métodos de factoría En el patrón Factoría (o fábrica), una clase, que habitualmente es un Singleton se usa para crear instacias de otra clase(s). Suele usarse para crear subclases de cierta clase, o diferentes implementaciones de cierta interfaz (como la clase URL en Java). En RMI una clase factoría podría servir de gancho (hook) para obtener nuevas referencias a objetos remotos nuevos. Evitando el sobrecoste de programación. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 30

Proceso de creación de objetos mediante factoría cliente 2. Pide referencia a FactoríaImpl 3. Envía referencia a FactoríaImpl registry 6. Invoca un método 5. Devuelve una referencia a Producto1 servidor 4. Invoca un método de factoría en FactoríaImpl FactoríaImpl 1. Registro Producto1 Producto2 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 31 Objetos remotos activables Antes de Java 2, sólo se podía acceder UnicastRemoteObject desde un programa servidor que creara instancias del objeto y corriera todo el rato. Con Java 2 tenemos Activatable y el daemon rmid. Una clase activable solo debe registrarse frente al rmid. Esto nos permite ahorrar memoria y ganar prestaciones al no tener que activar objetos remotos que no se usen en este momento. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 32

ActivatableImplementation.java package examples.activation; import java.rmi.*; import java.rmi.activation.*; public class ActivatableImplementation extends Activatable implements examples.activation.myremoteinterface { // Constructor para activar y exportar; y es // invocado por ActivationInstantiator.newInstance // durante la activación para construir el objeto. // public ActivatableImplementation(ActivationID id, MarshalledObject data) throws RemoteException { // Registra el objeto frente al sistema de activación // luego lo exporta sobre un puerto anónimo // super(id, 0); } // Implementa el metodo declarado en MyRemoteInterface // public Object callmeremotely( ) throws RemoteException { return "Success"; } } 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 33 Detalles de la implementación Implementa (por supuesto) la interfaz remota. Precisa de un constructor con dos argumentos para ser usado por activation. El programa de servicio (Setup.java) deberá ser ligeramente más complejo, al acarrear tareas de registro frente al daemon. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 34

Setup.java package examples.activation; import java.util.properties; import java.rmi.*; public class Setup { public static void main(string[] args) throws Exception { System.setSecurityManager(new RMISecurityManager()); Properties props = new Properties(); props.put("java.security.policy, "/home/rmi_tutorial/activation/policy"); ActivationGroupDesc.CommandEnvironment ace = null; ActivationGroupDesc examplegroup = new ActivationGroupDesc(props,ace); ActivationGroupID agi = ActivationGroup.getSystem().registerGroup(exampleGroup); String location = "file:/home/rmi_tutorial/activation/"; MarshalledObject data = null; ActivationDesc desc = new ActivationDesc (agi, "examples.activation.activatableimplementation", location, data); MyRemoteInterface mri = (MyRemoteInterface) Activatable.register(desc); System.out.println("Got the stub for the ActivatableImplementation"); Naming.rebind("ActivatableImplementation", mri); System.out.println("Exported ActivatableImplementation"); System.exit(0); } } 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 35 Setup.java package examples.activation; import java.rmi.*; import java.rmi.activation.*; import java.util.properties; public class Setup { // Esta clase registra información sobre la clase // ActivatableImplementation con rmid y rmiregistry // public static void main(string[] args) throws Exception { Aquí se ha separado la implementación del main que lanza el servidor. Crea toda la información precisa para activar la clase sin crear instancias Ojo con los paquetes que hay que importar 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 36

Setup.java System.setSecurityManager(new RMISecurityManager()); // A causa del modelo de seguridad de la 1.2, habrá que // especificar una política de seguridad para la máquina // virtual del ActivationGroup. El primer argumento del // método put de Properties, heredado de Hashtable es la // clave y el segundo es el valor. // Properties props = new Properties(); props.put("java.security.policy", "/home/rmi_tutorial/activation/policy"); Properties permite manejar un espacio parecido al registro de Windows. Hay que conseguir el archivo de política y echar un vistazo. También hay que depositarlo en un lugar accesible a la máquina virtual. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 37 Setup.java ActivationGroupDesc.CommandEnvironment ace = null; ActivationGroupDesc examplegroup = new ActivationGroupDesc(props, ace); // Una vez creado el ActivationGroupDesc, regístrese frente al // sistema de activación para obtener su ID ActivationGroupID agi = ActivationGroup.getSystem().registerGroup(exampleGroup); // El String location especifica un URL desde donde vendrá la // definición de la clase cuando se pida (active) el objeto. // No olvidemos la barra del final del URL o no se encontrarán // las clases. String location = "file:/home/rmi_tutorial/activation/"; El URL de location puede utilizarse vía http. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 38

Setup.java // Crea el resto de los parámetros que se pasarán al // constructor de ActivationDesc MarshalledObject data = null; // El argumento de ubicación para el constructor de // ActivationDesc se utilizará para identificar esta // clase de forma única, en relación al URL de ubicación // indicado en location ActivationDesc desc = new ActivationDesc (agi, examples.activation.activatableimplementation", location,data); ActivationDesc dará toda la información que precisa rmid para crear una nueva instancia de la clase de implementación Marshall se utiliza para referirse al empaquetado de datos. El valor de data debe apuntar a un objeto serializado, si no es un dato elemental. Se concatenará ubicación con location para construir el nombre que irá al rmiregistry. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 39 Setup.java // Registro frente al rmid // MyRemoteInterface mri = (MyRemoteInterface) Activatable.register(desc); System.out.println( Obtuve el stub para ActivatableImplementation"); // Enlaza el stub al nombre en el registro en el // puerto 1099 // Naming.rebind("ActivatableImplementation", mri); System.out.println("Exported ActivatableImplementation"); System.exit(0); } } 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 40

Despliegue: máquinas implicadas dogbert.sc.edu registry wally.sc.edu rmid cliente dilbert.sc.edu Servidor web 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 41 Compilación y despliegue del servidor 1. Compilación: javac -d. *.java 2. Compilación de stubs y skeletons: rmic -d. examples.activation.activatableimplementation 3. Arranque del registro. Cerciórese de que CLASSPATH no contiene las clases que se quieran descargar en el cliente rmiregistry & 4. Lanzamiento del daemon de activación rmid -J -Djava.security.policy=rmid.policy & 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 42

Compilación y despliegue del servidor 5. Ejecución del programa setup. El codebase es el URL donde mora el stub, que habitualmente se obtiene vía http. java - Djava.security.policy=/home/rmi_tutorial/activat ion/policy - Djava.rmi.server.codebase=http://dilbert.usc.edu /rmi_tutorial/activation/ examples.activation.setup 6. Ejecución del cliente java - Djava.security.policy=/home/rmi_tutorial/activat ion/policy examples.activation.client vector 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 43 Conversión de UnicastRemoteObject a Activatable Si hay servidores UnicastRemoteObject y queremos que sean Activatable habrá que cambiar: Incluir los import apropiados. Extender la clase Activatable. Cambiar el constructor sin argumentos, por Un constructor con dos argumentos Y crear un programa de inicio como el ya visto. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 44

Clases Activatables para nuestras factorías Para hacer que MiClase sea activatable solo tenemos que implementar una clase que extienda Remote y tener en cuenta un nuevo método. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 45 Factoría de Sockets a gusto del cliente RMI usa sockets simples Si queremos encriptar y comprimir datos habrá que implementar una factoría de Sockets RMI de cliente. Puede crearse un RMISocketFactory para ser usada con cada objeto remoto, O asociarla solo a ciertos objetos. 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 46

Factoría de sockets de cliente Los pasos son: 1. Implementar clases especiales ServerSocket y Socket (extendiéndolas) que implementen encriptación y/o compresión. 2. Implementar RMIClientFactory que devuelva uno de los sockets de cleinte. Basicamente, redefinir la función createsocket function. Esta clase deberá ser serializable. 3. Implementar un RMIServerSocketFactory, como antes, y que no tiene por que ser serializable 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 47 URLS Guía de uso de RMI http://java.sun.com/j2se/1.4/docs/guide/rmi/getstart.doc.html Carga dinámica de código http://java.sun.com/j2se/1.4/docs/guide/rmi/codebase.html Creación de un objeto activatable y demás http://java.sun.com/j2se/1.4/docs/guide/rmi/activation/activati on.1.doc.html (2 y 3) Factoría de Sockets RMI del cliente http://java.sun.com/j2se/1.4/docs/guide/rmi/socketfactory/inde x.html/ Patrones: Gamma, E., Patrones de Diseño, Addison-Wesley, 2003 10/04/2003 Sistemas Distribuidos (I.T.Informática - UVA (c) César Llamas Bello 2003) 48