Download SeminarioRMI

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Prácticas de Programación
Concurrente:
Objetos Distribuidos
API RMI de Java
Manuel I. Capel Tuñón
Ramón A. Carrasco González
24/05/2017
Prácticas Programación Concurrente
1
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).
24/05/2017
Prácticas Programación Concurrente
2
La Arquitectura de RMI de Java
Servicio de Directorio
objeto
servidor
objeto
cliente
Soporta la interfaz con
el programa de aplicación.
Traduce el resguardo/esqueleto independiente de plataforma.
Oculta la capa de transporte dependiente
de plataforma, llevando a término las
referencias remotas.
esqueleto
capa de gestión de
referencias remotas
resguardo
capa de gestión de
referencias remotas
capa de transporte
capa de transporte
Levanta, mantiene y cierra las
conexiones e implementa el
protocolo de transporte.
camino de datos lógico
camino de datos físico
24/05/2017
Prácticas Programación Concurrente
3
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.
24/05/2017
Prácticas Programación Concurrente
4
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.
24/05/2017
Prácticas Programación Concurrente
5
La interacción entre resguardo y
esqueleto
Diagrama de eventos temporizado con la interacción
entre el resguardo (stub) y el esqueleto (skeleton):
stub
skeleton
tiempo
Remote
Method
“Marshalling” de parámetros;
enviar Petición
“Unmarshalling”de parámetros
Invocar método
Recibir valor de retorno
“marshalling” de respuesta
enviar respuesta
ejecutar código
y devolver un
valor
(basado en http://
“Unmarshalling de respuesta;
java.sun.com.marketing /collateral/ javarim.html)
Devolver valor
24/05/2017
Prácticas Programación Concurrente
6
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
24/05/2017
Prácticas Programación Concurrente
7
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
24/05/2017
Prácticas Programación Concurrente
8
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.
24/05/2017
Prácticas Programación Concurrente
9
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.
24/05/2017
Prácticas Programación Concurrente
10
Diagrama UML para la clase
UnInterfazImpl
UnaInterfaz
unMetodo1
unMetodo2
UnicastRemoteObject
...
UnaInterfazImpl
unMetodo1
unMetodo2
Implements
Extends
...
Diagrama UML de UnaInterfazImpl
24/05/2017
Prácticas Programación Concurrente
11
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
24/05/2017
Prácticas Programación Concurrente
12
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 UnaInterfazImpl
Como 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.class
UnaInterfazImpl_stub.class.
24/05/2017
Prácticas Programación Concurrente
13
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.
24/05/2017
Prácticas Programación Concurrente
14
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 Interfaz
UnaInterfazImpl 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 );
…
24/05/2017
Prácticas Programación Concurrente
15
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 remota
System.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 remoto
UnaInterfazImpl 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();
}
}
24/05/2017
Prácticas Programación Concurrente
16
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
24/05/2017
Prácticas Programación Concurrente
17
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.
24/05/2017
Prácticas Programación Concurrente
18
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.
24/05/2017
Prácticas Programación Concurrente
19
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);
24/05/2017
Prácticas Programación Concurrente
20
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.
24/05/2017
Prácticas Programación Concurrente
21
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
24/05/2017
Prácticas Programación Concurrente
22
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.
24/05/2017
Prácticas Programación Concurrente
23
Ubicación de los ficheros para una
aplicación RMI
Host del Objeto Cliente
Host del Objeto Servidor
Directorio del objeto servidor
Directorio del objeto cliente
UnaInterfaz.class
UnCliente.class
UnaInterfazImpl
_
Stub.class
24/05/2017
UnaInterfaz.class
UnServidor.class
UnaInterfazImpl.class
UnaInterfazImpl
_
Skel.class
Prácticas Programación Concurrente
24
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();
24/05/2017
Prácticas Programación Concurrente
25
Revisión general para implementar
una aplicación RMI en eclipse
Para definir como jre la jdk contenida en lsi/pc/is/jdk…
24/05/2017
Prácticas Programación Concurrente
26
Revisión general para implementar
una aplicación RMI en eclipse
Añadir el proyecto que contiene la interfaz remota (p.e.
cuando se crea el proyecto)
24/05/2017
Prácticas Programación Concurrente
27
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
24/05/2017
Prácticas Programación Concurrente
28
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)
24/05/2017
Prácticas Programación Concurrente
29
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
24/05/2017
Prácticas Programación Concurrente
30