Sistemas de
Información
Tecnologías de objetos distribuidos: RMI
Agradecimientos: Marisol García Valls, Jesús Villamor Lugo, Simon Pickin de IT/UCIIIM
[email protected]
RMI (Remote Method Invocation)
Concepto ¿Qué es?
RMI (Remote Method Invocation). Procedimiento de
invocación a métodos remotos
Permite a un objeto que se está ejecutando en una MV
invocar métodos de otro que esté en una MV distinta
API de java que facilita la creación de aplicaciones de
objetos distribuidos proporcionando:
Mecanismos de localización,
Facilidades de comunicación
Una semántica para permitir la invocación de métodos remotos
[email protected]
2
RMI (Remote Method Invocation)
Objetivos ¿Para qué sirve?
Permitir invocación de métodos de un objeto por objetos que residen
en diferentes máquinas virtuales (en particular, a través de la red)
permitir invocación de métodos remotos por Applets
Integrar el modelo de objetos distribuidos al lenguaje Java de modo
natural, preservando en lo posible la semántica de objetos en Java
distinción entre objetos locales y remotos
diferentes semánticas en las referencias a objetos remotos:
no persistentes (vivas), persistentes, de activación lenta
Preservar la seguridad de tipos (type safety) dada por el ambiente
de ejecución Java
Mantener la seguridad del ambiente dada por los Security
Managers, en particular, en presencia de carga dinámica de clases
Facilitar el desarrollo de aplicaciones distribuidas
[email protected]
3
RMI (Remote Method Invocation)
Hitos Especificaciones
RMI en JDK-1.1
Introducción de las bibliotecas java.rmi.*
Comunicación por Java Remote Method Protocol (JRMP)
RMI en J2SE SDK 1.2
Referencias de objeto persistentes y objetos activables
No hace falta generar skeletons (reflection + skeletons genéricos)
RMI en J2SE SDK 1.3
Opción de comunicación por IIOP (Internet Inter-ORB Protocol de CORBA)
Uso de un fichero de política de seguridad obligatorio con la activación
RMI en J2SE SDK 1.4
Mejoras en la serialization (secuenciación)
RMI en J2SE SDK 1.5 = J2SE SDK 5.0
Introducción de un tipo de invocación dinámica
hace uso de reflection + stubs genéricos
este mecanismo obvia la compilación con rmic
[email protected]
4
RMI (Remote Method Invocation)
¿Cómo funciona?
El servidor
Crea objetos remotos
Hace accesibles refs a objetos remotos
Espera a que los clientes invoquen a estos
objetos remotos o a sus métodos
El cliente
Obtiene una referencia de uno o más objetos
remotos en el servidor
Invoca a sus métodos
[email protected]
5
RMI (Remote Method Invocation)
¿Cómo funciona?
RMI proporciona al cliente y servidor
Mecanismos de localización (obtención de refs)
Registrar objetos remotos con rmiregistry
Pasar y devolver referencias a objetos remotos
Mecanismos de comunicación
Transparentes para el programador
Semántica similar a una llamada estándar a método
Mecanismos de carga dinámica de clases
Para objetos que se pasan entre C y S bien por
parámetro o como tipo de retorno
[email protected]
6
RMI (Remote Method Invocation)
¿Cómo funciona?
CountRMIClient
CountRMIServer
RMI Stub
Cliente
RMI
sobre
TCP/IP
RMI Skeleton
Servidor
Bus software
[email protected]
7
RMI (Remote Method Invocation)
¿Cómo funciona?: Arquitectura
Niveles
OSI
7
Cliente
Servidor
6
5
4
3
Stubs
Skeletons
Remote Reference Layer
Nivel de Transporte (TCP)
Nivel de Red (IP)
1 y 2
Interfaz Hardware
El Sistema RMI mismo está
formado por 3 niveles
El nivel de los Stubsy Skeletons
La Remote ReferenceLayer
El nivel de Transporte
hoy por hoy basado en TCP
El cliente y el servidor desarrollan
sus aplicaciones en paralelo
El cliente invoca objetos remotos
a través de los stubs
La Red
Los skeletonspermiten hacer
accesibles los objetos servidores
al cliente
[email protected]
8
RMI: ¿Cómo funciona?
Stubs y Skeletons
Objeto
Cliente
Interfaz
remota
Stub
Objeto
Remoto
Interfaz
remota
Skeleton
Red
[email protected]
9
RMI: ¿Cómo funciona?
Interfaces remotas y objetos remotos
Una interfaz remota declara un conjunto de operaciones que
podrán invocarse desde otras JVM.
debe extender java.rmi.Remote
sus métodos deben declarar que lanzan java.rmi.RemoteException
Para que los métodos de una interfaz remota estén disponibles
para ser invocadas desde otras JVM ha de implementar la interfaz
Un objeto remoto es un objeto que implementa una interfaz remota
Un cliente en otra JVM interactúa con un objeto remoto vía una de
sus interfaces remotas, nunca directamente
Habitualmente, la clase de un objeto remoto extiende
java.rmi.server.UnicastRemoteObject
pero puede llamar a su método exportObject() directamente
[email protected]
10
RMI: ¿Cómo funciona?
Los stubs
Un stub de RMI es un proxy
es decir, un representante local de un objeto remoto
Contiene la referencia al objeto remoto
Permite la invocación de sus métodos como si fuera un objeto
local.
En concreto:
recibe las peticiones del llamante
realiza el marshalling (empaquetado de los parámetros),
envía la petición al objeto llamado
en el caso de que haya respuesta:
realiza el unmarshalling
devuelve el valor al llamante
[email protected]
11
RMI: ¿Cómo se usa?
Proceso de Desarrollo
Extender java.rmi.Remote
Implementar interfaz, extendiendo
java.rmi.UnicastRemoteObject
(o llamando a exportObject())
Compilar impl. (.java) con javac
Compilar impl. (.class) con rmic
Arrancar el rmiregistry
Arrancar los objetos del servidor
Registrar los objetos remotos
(llamando a métodos del paquete
java.rmi.Naming para asociar un
nombre con el objeto remoto)
Escribir el código cliente
(llamando a métodos del paquete
java.rmi.Naming para localizar el
objeto remoto)
Compilar el código cliente
Arrancar el cliente
12
1
2
definir una
interfaz remota
implementar
la interfaz
(.java)
3
(.class)
4
javac
rmic
clase
servidora
clase
esqueleto
clase
stub
usa
5
arrancar el
registro RMI
6
arrancar los
objetos servidores
clase
cliente
1.
2.
3.
4.
5.
6.
7.
8.
7
registrar los
objetos remotos
9.
10.
Cliente
Servidor
8
implementar
el cliente
(.java)
9
javac
10
arrancar
el cliente
RMI Ejemplo 1
Paso 1: Definir interfaz remota
Importar paquetes adecuados
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface NombreInt extends Remote{}
public Tipo NombreMet() throws RemoteException;
Lanzar remoteException en todos los métodos
Extender la clase Remote
Ejemplo tomado de:
http://www.programacion.com/java/tutorial/rmi/
[email protected]
13
RMI Ejemplo 1
Paso 1: Definir un interfaz remoto
package compute;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Compute extends Remote {
Object executeTask(Task t) throws RemoteException;
}
[email protected]
14
RMI Ejemplo 1
Paso 1: Definir otros interfaces
Detectar objetos que puedan viajar por tratarse de:
Parámetros de métodos remotos
Tipos de retorno de métodos remotos
Deben extender el interfaz serializable
[email protected]
15
RMI Ejemplo 1
Paso 1: Definir otros interfaces
package compute;
import java.io.Serializable;
public interface Task extends Serializable {
Object execute();
}
[email protected]
16
RMI Ejemplo 1
Paso 2: Implementar interfaz remota
Extender la clase UnicastRemoteObject
Implementar el interfaz remoto definido en el
paso 1
Crear main que realice las siguientes tareas
Crear controlador de seguridad
Crear objeto de la clase remota
Registrar objeto de la case remota
[email protected]
17
RMI Ejemplo 1
Paso 2: Implementar interfaz remoto
package engine;
import java.rmi.*; import java.rmi.server.*; import compute.*;
public class ComputeEngine extends UnicastRemoteObject implements Compute {
public ComputeEngine() throws RemoteException { super();}
public Object executeTask(Task t) { return t.execute(); }
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
} String name = "//localhost/Compute";
try {
Compute engine = new ComputeEngine();
Naming.rebind(name, engine);
System.out.println("ComputeEngine bound");
} catch (Exception e) {
System.err.println("ComputeEngine exception: " + e.getMessage());
e.printStackTrace();
[email protected]
18
}
}
}
RMI Ejemplo 1
Paso 2: Implementar interfaz remoto
package engine;
import java.rmi.*; import java.rmi.server.*; import compute.*;
public class ComputeEngine extends UnicastRemoteObject implements Compute{
public ComputeEngine() throws RemoteException { super();}
public Object executeTask(Task t) { return t.execute(); }
public static void main(String[] args) {
if (System.getSecurityManager() == null) {
public class ComputeEngine extends UnicastRemoteObject
implements Compute{
System.setSecurityManager(new RMISecurityManager());
} String name = "//localhost/Compute";
try {
}
}
}
Compute engine = new ComputeEngine();
Naming.rebind(name, engine);
System.out.println("ComputeEngine bound");
} catch (Exception e) {
System.err.println("ComputeEngine exception: " + e.getMessage());
e.printStackTrace();
[email protected]
19
RMI Ejemplo 1
Paso 2: Impl
Comentarios de: Tecnologías Web: RMI (0)
No hay comentarios