JAVA RMI (REMOTE METHOD INVOCATION)



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

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

1. Visión general de RMI

Modelo de Objetos Distribuidos

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

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

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

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

RMI [Remote Method Invocation]

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

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

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

Una introducción a Java RMI

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

Tema 3. Objetos distribuidos

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

PROGRAMACION DISTRIBUIDA MobileTracker: Ejemplo de implementación con 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

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

Remote Method Invocation (RMI) de Java

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

RMI Remote Method Invocation

CAPITULO 3 ARQUITECTURA DE COMPONENTES GIS EN INTERNET

PROGRAMACION DISTRIBUIDA

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

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

SISTEMAS DISTRIBUIDOS

VII.1: RMI: Remote Method Invocation

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

Java RMI. Sistemas distribuidos

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

SISTEMAS DISTRIBUIDOS

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

Sistemas de Información

TEMA 7: Paso de Mensajes con RMI

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

Java RMI 2ª PARTE. Factory Pattern para RMI

SISTEMAS DISTRIBUIDOS Profesor: José Luis Montoya Restrepo

Práctica sobre compartición de instancias remotas.

Práctica 5: Common Object Request Broker Architecture CORBA

TutorJava recomienda...

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

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.

Manual del Protocolo XML-RPC de Mensajería Negocios

Curso de Java POO: Programación orientada a objetos

Programación Orientada a Objetos. Java: Excepciones

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

El servicio de echo en Java-RMI

Java en 2 horas. Rodrigo Santamaría

CORBA desde Java. Diego Sevilla Ruiz Sistemas Distribuidos. 1. Introducción

Universidad de Cantabria

RMI. Aplicaciones Distribuidas

Java Inicial (20 horas)

Práctica 5: Callbacks RMI.

Universidad ORT - Arquitectura de Software. Requisitos

Definición de clases: Herencia, polimorfismo, ligadura dinámica

Tema 1. Introducción a JAVA

Programación Orientada a Objetos. Java: Excepciones

PROGRAMACIÓN CLIENTE-SERVIDOR MEDIANTE SOCKETS EN JAVA

Programación Orientada a Objetos con Java

Object Oriented Middleware: Java RMI

Programación Orientada a Objetos en Java

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

Servicios web con SOAP y Eclipse

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

Servicios Web. Andrés Pastorini. TRIA Tecnólogo Informático

Java en 3 horas. Ampliación de Sistemas Operativos. Rodrigo Santamaría

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Programación orientada a objetos

Generador de Proxy remoto JavaScript.

8. Sentencia return y métodos

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

Pruebas de unidad con JUnit

Desarrollo de Servicios Web con JBuilder

Uso de excepciones en Java

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

Introducción a la programación orientada a objetos

APELLIDOS:... NOMBRE:... GRUPO:... NÚMERO DE EXPEDIENTE:...

Programación Orientada a Objetos en Java

Herramientas Concurrentes en JAVA

Programación en Java. Programación en OO

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

UNIVERSIDAD POLITÉCNICA DE PACHUCA SOCKETS EN JAVA

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Transcripción:

JAVA RMI (REMOTE METHOD INVOCATION)

RMI RMI (Remote Method Invocation) Mecanismo RPC de Mecanismo mediante el cual los procesos cliente y servidor en una aplicación distribuida se comunican

Una aplicación distribuida en java necesita: 1. Localizar los objetos remotos: Mediante la facilidad rmiregistry de o pasando los objetos remotos como parámetros o valores de retorno en llamadas a métodos remotos 2. Comunicarse con objetos remotos: RMI maneja todos los detalles de la comunicación. Para el programador la comunicación remota es igual a una invocación a un método local estándar 3. Descarga de las clases de los objetos pasados como parámetros o valor de retorno: RMI proporciona los mecanismos necesarios para cargar el código de los objetos tanto remotos como locales pasados cómo parámetros o valor de retorno, así como transmitir sus datos.

RMI Construcción de una aplicación distribuida paso a paso 1. Escribir el código del servidor RMI y del cliente 1.1. Definir las funciones de la clase remota como una interfaz remota 1.2. Implementar la clase remota y el servidor 1.3. Escribir un programa cliente que use el servicio remoto 2. Compilar el código del cliente y del servidor 3. Iniciar el registro RMI y el servidor

RMI Ejemplo: HelloWorld! con Servidor Remoto Definición de la interfaz remota (fichero Hello.java) package examples.hello; //Todas las interfaces remotas deben implementar la interfaz Remote import java.rmi.remote; //Todos los métodos remotos tienen que tener la posibilidad de lanzar la excepción RemoteException import java.rmi.remoteexception; public interface Hello extends Remote{ String sayhello() throws RemoteException; }

RMI- objeto remoto Implementación del Objeto Remoto y del Servidor (fichero 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() throws RemoteException{ return "Hello World!"; }... Continua en ->

RMI- servidor... Continuación -> Implementación del Objeto Remoto y del Servidor public static void main(string args[]) { // Create and install a security manager if (System.getSecurityManager() == null) System.setSecurityManager(new RMISecurityManager()); try { } } //createregistry(1099); Hello obj = new HelloImpl(); // Bind this object instance to the name "HelloServer Naming.rebind("///HelloServer", obj); } catch (Exception e) {}

RMI Inicio del Registro RMI desde código private privatestatic staticvoid voidcreateregistry(int createregistry(inthostport){ try{ try{ LocateRegistry.createRegistry(hostport); }catch(remoteexception e){ e){ try{ try{ LocateRegistry.getRegistry(hostport); }catch(remoteexception err){ err){ System.out.println("Error......"" + err.getmessage()); err.getmessage()); err.printstacktrace(); }} }} try{ try{ System.out.println("Activating RmiRegistry..."); java.lang.thread.sleep(2000); }catch(java.lang.interruptedexception err1){ err1){ System.out.println("Error... "" + err1.getmessage()); err1.getmessage()); err1.printstacktrace(); }} }}

RMI - cliente Implementación del programa Cliente (fichero HelloClient.java) package examples.hello; import java.applet.applet; import java.awt.graphics; import java.rmi.naming; import java.rmi.remoteexception; public class HelloClient { String message = "blank"; // "obj" is the identifier that we'll use to refer to the remote object that implements the "Hello" interface Hello obj = null; public HelloClient() { try { obj = (Hello)Naming.lookup("//1HelloServer"); message = obj.sayhello(); System.out.println( Message +message); } catch (Exception e) {} } public static void main(string args[]) { HelloClient client = new HelloClient(); }

RMI Compilación Compilar y Desarrollar la aplicación distribuida Compilar de los ficheros fuente del cliente y el servidor. (Usando el compilador javac de ) javac -d. *.java Generar los ficheros stub - skeleton. (Usando el compilador rmic de ) rmic -d.-classpath. examples.hello.helloimpl Crear el fichero java.policy. Es un fichero que especifica la política de seguridad: grant { }; permission java.security.allpermission;

RMI - Ejecución Iniciar el registro de (si no se inicia desde código) rmiregistry Iniciar el servidor RMI start java - Djava.security.policy=java.policy - classpath. examples.hello.helloimpl Iniciar el cliente RMI java -Djava.security.policy=java.policy - classpath. examples.hello.helloclient

RMI Especificación del sistema RMI de Clases e Interfaces del sistema RMI Interfaz java.rmi.remote Clases java.rmi.remoteexception, java.rmi.server.remoteobject, java.rmi.server.remoteserver, java.rmi.server.unicastremoteobject y java.rmi.activation.activatable Implementación de una interfaz remota Extendiendo de java.rmi.server.unicastremoteobject Creación de un objeto remoto que se ejecuta continuamente Extendiendo de java.rmi.activation.activatable Creación de un objeto que se instancia sólo cuando es necesario Paso de parámetros en RMI Serialización Paso de objetos remotos Paso de objetos locales Transmisión de datos Registro y Localización de objetos remotos Clase Naming RMI Stubs (Proxy) y Skeletons (Esqueleto) Registro de Interfaz Registry y clase LocateRegistry

RMI Clases e Interfaces del sistema RMI

RMI Clases e Interfaces del sistema RMI Una interfaz remota debe extender la interfaz java.rmi.remote Pero puede además extender otra interfaz que no sea remota pero cuyos métodos estén declarados como métodos remotos, como se muestra en el siguiente ejemplo: La interfaz Beta public interface Alpha { public final String okay = "constants are okay too"; public Object foo(object obj) throws java.rmi.remoteexception; public void bar() throws java.io.ioexception; public int baz() throws java.lang.exception; } public interface Beta extends Alpha, java.rmi.remote { public void ping() throws java.rmi.remoteexception; }

RMI Implementación de una interfaz remota Las reglas de implementación de una interfaz remota son: La clase usualmente extiende UnicastRemoteObject, y por tanto hereda el comportamiento remoto proporcionado por las clases RemoteObject y RemoteServer. Si se quiere que el objeto remoto se cree sólo cuando sea necesario se extenderá de Activatable en lugar de UnicastRemoteObject La clase puede implementar cualquier número de interfaces remotas. La clase puede extender la implementación de otra clase remota. La clase puede definir métodos que no aparezcan en la interfaz remota, pero estos métodos sólo pueden ser usados localmente y no remotamente.!!importante!! Si es necesario, una clase que implemente una interfaz remota puede extender de alguna otra clase que no sea java.rmi.server.unicastremoteobject. En este caso, la implementación de esta clase debe asumir la responsabilidad de exportar el objeto (tarea realizada por el constructor de la clase UnicastRemoteObject) y de implementar (si es necesario) la semántica remota correcta de los métodos hashcode, equals, y tostring heredados de la clase java.lang.object, tareas realizadas en las clases RemoteObject y RemoteServer

RMI Paso de Parámetros en RMI Un parámetro de una llamada remota o un valor de retorno puede ser cualquier tipo primitivo u objeto que sea serializable, es decir, que implemente la interfaz java.io.serializable Las clases de los parámetros o valor de retorno que no están localmente se descargan de forma dinámica durante la ejecución Paso de parámetros no remotos Estos parámetros se pasan como valor Si es un parámetro se hace una copia del objeto antes de mandarlo al servidor Si es un valor de retorno se crea un nueva instancia del objeto Paso de parámetros remotos Objeto remoto exportado: se envía la referencia del stub del objeto Objeto remoto no exportado: se envía la referencia al objeto remoto Clase Annotation El descriptor de la clase de un objeto se asocia con los parámetros o valor de retorno enviados en la invocación remota para poder descargar el código de la clase de forma dinámica durante la ejecución en caso de que no se encuentren de forma local

RMI Registro y Localización de Objetos Remotos Se realiza utilizando la clase java.rmi.naming Los objetos remotos se registran asociándoles una cadena formateada como una URL //host:port/name Host: Nombre de la máquina donde se registra el objeto. Por defecto la máquina local Port: Puerto donde el registro estará esperando. Por defecto, 1099 que es el puerto usado por el registro (rmiregistry) de Name: Nombre que se le asigna al objeto remoto

RMI Clase Naming package java.rmi; public final class Naming { public static Remote lookup(string url) throws NotBoundException, java.net.malformedurlexception, RemoteException; } public static void bind(string url, Remote obj) throws AlreadyBoundException, java.net.malformedurlexception, RemoteException; public static void rebind(string url, Remote obj) throws RemoteException, java.net.malformedurlexception; public static void unbind(string url) throws RemoteException, NotBoundException, java.net.malformedurlexception; public static String[] list(string url) throws RemoteException, java.net.malformedurlexception; Método bind: Este método asociada el nombre especificado como primer parámetro al objeto remoto indicado como segundo parámetro. Se lanza la excepción AlreadyBoundException si el nombre ya está usado para referenciar algún objeto remoto. Método rebind: Este método siempre relaciona el nombre al objeto remoto incluso si el nombre ya está asociado a otro objeto remoto. La asociación anterior se pierde. Método unbind: Este método elimina la asociación entre el nombre y el objeto remoto. Se lanza la excepción NotBoundException si no existe esa asociación. Método lookup: Este método devuelve el objeto remoto asociado con el nombre indicado como parámetro. Se lanza la excepción NotBoundException si ese nombre no está asociado a ningún objeto remoto. Método list: Este método devueve un array de objetos String que contiene las URLs registradas.

RMI RMI Stubs y Skeletons Stub: Actúa como una representación local en el cliente del objeto remoto. Cuando el objeto remoto se exporta (en el constructor del objeto remoto) se crea una instancia del stub en el cliente. El objeto que realiza una llamada remota invoca el método en el stub local El stub es el responsable de hacer llegar la llamada al objeto remoto Implementa exactamente el mismo conjunto de interfaces remotas que el objeto remoto Los pasos que realiza son: Inicia una conexión con la JVM remota que contiene el objeto remoto Escribe (serializa) y transmite los parámetros a la JVM remota Espera los resultados de la invocación remota Lee (deserializa) el valor de retorno o las excepciones devueltas Devuelve el valor al objeto que inició la llamada Oculta el proceso de serialización y comunicación a través de la red

RMI Skeleton: En la JVM remota, cada objeto remoto tiene su correspondiente esqueleto. Es responsable de enviar la llamada a la implementación del objeto remoto Los pasos que realiza son: Lee (deserializa) los parámetros del método remoto Invoca el método en la implementación del objeto remoto Escribe (serializa) y transmite el resultado En la versión 2 se ha introducido un protocolo stub adicional que elimina la necesidad de esqueletos en entornos en los que sólo se utilice 2. En su lugar, se usa un código genérico que lleva a cabo las tareas realizadas por el esqueleto en JDK 1.1

RMI Registro de Interfaz Registry y clase LocateRegistry Interfaz Registry y clase LocateRegistry proporcionan un servicio que permita registrar y recuperar objetos mediante su nombre. No es necesario iniciar explícitamente el registro desde la línea de comando con el comando rmiregistry. Registro: Objeto remoto que establece una relación entre nombres y objetos remotos. Cualquier proceso servidor puede soportar su propio registro o puede usarse un solo registro para cada máquina. Los métodos de la clase LocateRegistry se usan para obtener un registro que opere en una máquina particular o una máquina y un puerto. Los métodos de la clase java.rmi.naming vista anteriormente hacen llamadas a un objeto remoto que implementa la interfaz Registry usando el método LocateRegistry.getRegistry.

RMI Interfaz java.rmi.registry Proporciona métodos para: Registrar un objeto remoto Eliminar el registro de un objeto remoto Buscar la referencia asociada a un nombre de objeto Listar los objetos registrados en un registro determinado Clase java.rmi.locateregistry Define dos tipos de métodos getregistry(): Para obtener un registro ya existente en la máquina. En caso de que no exista éste método no devolverá ningún error. createregistry(): Para crear un registro en la máquina. Estos métodos estarán sobrecargados para obtener/crear el registro proporcionando de forma opcional el nombre de la máquina y el puerto