Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

30
14/06/22 Prácticas Programación Concurrente 1 Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java Manuel I. Capel Tuñón Ramón A. Carrasco González

description

Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java. Manuel I. Capel Tuñón Ramón A. Carrasco González. Sistemas de Objetos Distribuidos/Protocolos. - PowerPoint PPT Presentation

Transcript of Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

Page 1: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 1

Prácticas de Programación Concurrente:

Objetos DistribuidosAPI RMI de Java

Manuel I. Capel Tuñón

Ramón A. Carrasco González

Page 2: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 2

Sistemas de Objetos Distribuidos/Protocolos

El paradigma de objetos distribuidos ha sido ampliamente adoptado en el desarrollo de aplicaciones distribuidas, para las que existen muchos mecanismos de programación basados en este paradigma. Entre los más conocidos, cabe destacar:

~ Java Remote Method Invocation (RMI),

~ Sistemas basados en Common Object Request Broker Architecture (CORBA),

~ Distributed Component Object Model (DCOM),

~ Simple Object Access Protocol (SOAP).

Page 3: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 3

La Arquitectura de RMI de Java

resguardocapa de gestión de

referencias remotas

capa de transporte

esqueleto

capa de transporte

camino de datos lógicocamino de datos físico

Soporta la interfaz conel programa de aplicación.

Traduce el resguardo/esqueleto indepen- diente de plataforma.Oculta la capa de transporte dependiente de plataforma, llevando a término las referencias remotas.

Levanta, mantiene y cierra lasconexiones e implementa elprotocolo de transporte.

objetocliente

objetoservidor

Servicio de Directorio

capa de gestión dereferencias remotas

Page 4: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 4

Invocación de Método Remoto

• RMI es una implementación orientada a objetos definida sólo para programas Java.

• Utilizando RMI, un servidor de objeto exporta un objeto remoto y lo registra en un servicio de directorio. Se ofrecen métodos remotos, que pueden ser invocados desde programas cliente.

• Sintácticamente:– Se declara un objeto remoto que implementa una

interfaz remota, una extensión de la clase Remote de Java .

– Programación de interfaz remota en un objeto del servidor.

– Los objetos-cliente pueden acceder mediante la invocación de los métodos remotos asociados, utilizando una sintaxis de llamada de método remoto para realizar invocaciones.

Page 5: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 5

Registro de Objetos • La API RMI permite utilizar varios servicios de

directorio [1] para registrar objetos distribuidos.

• Utilizaremos un servicio de directorio simple, denominado RMI registry, rmiregistry, que viene con el Java Software Development Kit (SDK)[2]. rmiregistry es un servicio cuyo servidor, cuando está activo, se ejecuta en la máquina host del objeto servidor, por defecto en el puerto TCP 1099.

[1] Uno de estos servicios es el Java Naming and Directory Interface (JNDI), que es más general que el RMI registry, en el sentido de que puede ser utilizado por aplicaciones que no usan la API de RMI.

[2] Java SDK es lo que descargamos en nuestra máquina para poder usar las bibliotecas de clases de Java, así como sus herramientas, como el compilador javac.

Page 6: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 6

La interacción entre resguardo y esqueleto

Diagrama de eventos temporizado con la interacción entre el resguardo (stub) y el esqueleto (skeleton):

skeleton

“Marshalling” de parámetros;enviar Petición

“Unmarshalling” de parámetrosInvocar método

RemoteMethod

ejecutar códigoy devolver unvalor

Recibir valor de retorno“marshalling” de respuestaenviar respuesta

“Unmarshalling de respuesta;Devolver valor

tiempo

(basado en http://java.sun.com.marketing /collateral/ javarim.html)

stub

Page 7: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 7

La API de RMI Java

• La Interfaz Remota

• El software del lado del Servidor– La Implementación de la Interfaz Remota– Generación de resguardos y esqueletos– El Objeto Servidor

• El software del lado del Cliente

Page 8: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 8

Una muestra de interfaz remota

// archivo: UnaInterfaz.java

//para ser programado en una clase servidora de Java RMI.

import java.rmi.*

public interface UnaInterfaz extends Remote {

// signatura del primer método remoto

public String algunMetodo1( )

throws java.rmi.RemoteException;

// signatura del segundo método remoto

public int algunMetodo2( float ) throws java.rmi.RemoteException;

// Aquí seguiría la signatura del resto de los métodos

} // fin de la interfaz

Page 9: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 9

Una muestra de interfaz remota -2

• La excepción java.rmi.Remote ha de ser listada en la cláusula throws de las signaturas de los métodos.

• Esta excepción se levantará cuando, durante el procesamiento de una llamada remota, se produzca algún error y es obligatorio que sea capturada en el método del programa que hace la llamada.

• Se producen excepciones durante operaciones de IPC debido a las siguientes causas: fallos de acceso y conexión, así como a errores propios derivados de un mal uso del protocolo RMI.

Page 10: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 10

El Software del lado del Servidor

Un objeto servidor es un objeto que proporciona los métodos y la interfaz a un objeto distribuido y su responsabilidades se resumen como sigue:

– implementar cada uno de los métodos especificados en la interfaz remota,

– registrar el objeto que contiene la implementación de los métodos en un servicio de directorio.

Se recomienda que las dos acciones anteriores se programen en clases diferentes.

Page 11: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 11

Diagrama UML para la clase UnInterfazImpl

UnicastRemoteObjectUnaInterfaz

UnaInterfazImpl

Diagrama UML de UnaInterfazImpl

unMetodo1unMetodo2

unMetodo2unMetodo1

...

...

Implements

Extends

Page 12: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 12

La Implementación de la Interfaz Remota

Debe de programarse una clase que implementa la interfaz remota. Sintaxis similar a la de cualquier otra clase que implemente una interfaz local.import java.rmi.*;import java.rmi.server.*;/**Esta clase implementa la interfaz remota UnaInterfaz*/public class UnaInterfazImpl extends UnicastRemoteObject implements UnaInterfaz { public UnaInterfazImpl() throws RemoteException { super( ); } public String unMetodo1( ) throws RemoteException { // el código ha de ser suministrado } public int unMetodo2( ) throws RemoteException { // el código ha de ser suministrado} // end class

Page 13: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 13

Generación de Resguardo y

Esqueleto En RMI, el resguardo (del objeto cliente) y el esqueleto (del objeto servidor) son generados a partir de la implementación de la interfaz remota utilizando una herramienta que proporciona Java SDK: el compilador rmic de RMI. rmic <nombre de la clase de implementación de

la interfaz remota> Por ejemplo:

rmic UnaInterfazImplComo resultado de la compilación, se generarán dos archivos, cada uno de ellos vendrá prefijado con el nombre de la clase de implementación e indica el tipo de proxy que es:

UnaInterfazImpl_skel.classUnaInterfazImpl_stub.class.

Page 14: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 14

El Archivo resguardo del objeto

• El archivo resguardo del objeto, así como el archivo de la interfaz remota (no su implementación), deben ser compartidos con cada objeto cliente– se necesitan estos archivos para que el programa cliente compile.

• La copia de cada uno de estos archivos puede ser suministrada al objeto cliente a mano por el propio programador. Pero, además, el RMI de Java tiene la característica denominada “stub downloading” que permite al cliente obtener dinámicamente el archivo resguardo.

Page 15: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 15

Registro RMI

• El objeto servidor exporta un objeto registrándolo mediante un nombre simbólico en el servidor conocido como RMI registry.

// Crear un object conforme a la InterfazUnaInterfazImpl obj = new UnaInterfazImpl(“Servidor1”);

// Registrar el objeto

Naming.rebind(“Servidor1”, obj);• Se necesita otro servidor, llamado RMI Registry, ejecutándose en el

host de la parte del servidor para exportar el objeto remoto.• Se puede utilizar el servidor RMIRegistry en el puerto 1099, por defecto.• Puede ser invocado dinámicamente en la clase del servidor: import java.rmi.registry.LocateRegistry;

… LocateRegistry.createRegistry ( 1099 ); …

Page 16: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 16

El Objeto Servidor - 2 La clase objeto servidor es una clase cuyo código instancia y exporta un objeto de la clase que implementa la interfaz remota. import java.rmi.*; ……

public class UnServidor {

/**• Crea nueva instancia de Servidor rmi*/public UnServidor() {

try {// Se indica a rmiregistry el path donde está la interfaz remotaSystem.setProperty("java.rmi.server.codebase","file:/path donde esta la interfaz remota (sin espacios…) p.e file:/c:/pc/prac3/interfazRemota/");

// Se publica el objeto remotoUnaInterfazImpl objExportado = new unaInterfazImpl();Naming.rebind("//host:port/unaInterfazImpl p.e //localhost/unaInterfazImpl", objExportado);

} catch (Exception e) {e.printStackTrace();}

/** * @param args * the command line arguments */public static void main(String[] args) {

new UnServidor();}

}

Page 17: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 17

Registro RMI -2

• De manera alternativa, un registro RMI podría ser activado a mano con la utilidad rmiregistry, que viene en el Java Software Development Kit (SDK):

rmiregistry <numero de puerto>donde el número de puerto corresponde a un puerto TCP. Se asume por defecto el puerto 1099, si no se especifica otro puerto.

• El registro se ejecutará todo el tiempo hasta que se pare (vía CTRL-C, por ejemplo).

• Más adelante se explicará como hacerlo en Eclipse

Page 18: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 18

El Objeto Servidor - 4

• Cuando se ejecuta un objeto servidor, el objeto distribuido que se exporta ocasiona que el proceso servidor comience a escuchar y a esperar a que los clientes se conecten y pidan servicio del objeto.

• Un objeto servidor RMI es un servidor concurrente: cada petición de un objeto cliente es servida utilizando un hilo diferente del servidor. Todas las llamadas de un mismo cliente se ejecutarán concurrentemente, salvo que incluyan instrucciones de sincronización.

Page 19: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 19

El Software del lado del Cliente

• La parte del cliente se programa como cualquier otra clase de Java,

• con sintaxis específica de RMI, que significa:

– localizar el registro RMI en el host del servidor y

– consultar la referencia remota del objeto servidor; la referencia puede ser entonces transmitida a la clase de la interfaz remota y los métodos remotos se llaman como métodos locales.

Page 20: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 20

Consultando el objeto remoto

El método lookup de la clase Naming es utilizado para recuperar la referencia del objeto, si existe y fue almacenada previamente en el registro por el objeto servidor.

String registroURL= "rmi://localhost:"+NumPuerto+"/servidor";

UnaInterfaz h = (UnaInterfaz)Naming.lookup(registroURL);

Page 21: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 21

Invocando el Método Remoto

• La referencia a la interfaz remota puede ser usada ahora para invocar cualquiera de sus métodos:

String mensaje = h.unMetodo1(); System.out.println(mensaje);• La sintaxis usada para la invocación de los

métodos remotos es la misma que para invocar a los locales.

• Es un error común el transmitir el objeto recuperado del registro RMI a la clase de la implementación de la interfaz o a la clase del objeto servidor. Lo correcto es transmitirlo como interfaz remota.

Page 22: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 22

El Software del lado del Cliente -2

import java.rmi.*;Import UnaInterfaz;….public class UnCliente {

public static void main(String args[]) {

try { String registroURL = "//host:port/unaInterfazImpl p.e //localhost/unaInterfazImpl";

UnaInterfaz h =(UnaInterfaz)Naming.lookup(registroURL); // invocar ahora los(s) metodo(s)remoto(s) String mensaje = h.unMetodo1(); System.out.println(mensaje);

// El Método2 puede ser llamado igualmente…

} // fin try catch (Exception e) { e.printStackTrace();; } } //fin main

// Definición de los ortos métodos de la clase, si hubieran.}//fin clase 

Page 23: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 23

Arquitectura de la API de RMI

• RMI de Java es un buen representante de los sistemas de objetos distribuidos. La arquitectura de la API de Remote Method Invocation incluye tres capas abstractas, tanto en el lado del cliente, como en el del servidor.– El software para una aplicación RMI

incluye una interfaz remota, software del lado del servidor y software del lado del cliente.

Page 24: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 24

Ubicación de los ficheros para una

aplicación RMI

UnCliente.class

Host del Objeto Cliente Host del Objeto Servidor

Directorio del objeto servidor

UnaInterfaz.class

UnaInterfaz.class

UnaInterfazImpl.class

UnServidor.class

UnaInterfazImpl_ Skel.classUnaInterfazImpl_ Stub.class

Directorio del objeto cliente

Page 25: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 25

Revisión general para implementar una aplicación RMI

en eclipse• Definición de la interfaz remota– Usar un proyecto independiente– Definir como jre la jdk contenida en lsi/pc/is/jdk…public interface UnaInterfaz extends Remote {…

• Implementación del objeto interfaz – Usar un proyecto independiente– Añadir el proyecto que contiene la interfaz remota– Definir como jre la jdk contenida en lsi/pc/is/jdk…public class UnaInterfazImpl extends UnicastRemoteObject implements UnaInterfaz {…

• Implementación del servidor remoto– Usar un proyecto independiente– Añadir los proyectos que contiene la interfaz remota y el objeto remoto– Definir como jre la jdk contenida en lsi/pc/is/jdk…public class UnServidor {…

Naming.rebind("//localhost/unaInterfazImpl", objExportado);

• Uso del servidor desde el cliente– Añadir al proyecto del prg cliente el proyecto que contiene la interfaz remota– Definir como jre la jdk contenida en lsi/pc/is/jdk…UnaInterfaz h =(UnaInterfaz)Naming.lookup(“//localhost/unaInterfazImpl”); h.unMetodo1();

Page 26: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 26

Revisión general para implementar una aplicación RMI

en eclipsePara definir como jre la jdk contenida en lsi/pc/is/jdk…

Page 27: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 27

Revisión general para implementar una aplicación RMI

en eclipseAñadir el proyecto que contiene la interfaz remota (p.e.

cuando se crea el proyecto)

Page 28: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 28

Revisión general para implementar una aplicación RMI

en eclipse

– Desde las últimas versiones de jdk no es necesario usar el compilador rmic de RMI para generar la clases skel y stub

– Por tanto, desde eclipse no tenemos que hacer nada especial con estas clases para su compilación

Page 29: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 29

Revisión general para ejecutar una aplicación RMI en eclipse

1. Activar un registro RMI • Windows -> Preferences• Puede ser activado a mano (Start)• El registro se ejecutará todo el tiempo hasta que se

pare (Stop)

Page 30: Prácticas de Programación Concurrente: Objetos Distribuidos API RMI de Java

19/04/23 Prácticas Programación Concurrente 30

Revisión general para ejecutar una aplicación RMI en Eclipse

2. Ejecutar el servidor• Especificar en el método System.setProperty el path

de la interfaz remota (sin espacios, caracteres especiales,etc)

• El servidor continuará ejecutándose hasta que no paremos el registro de RMI

3. Ejecutar el cliente• Normalmente, siempre y cuando esté ya arrancado el

servidor