Title: Java RMI
1Java RMI
- Sistemas distribuidos
- María de los Santos Pérez Hernández
- mperez_at_fi.upm.es
2Entornos orientados a objetos
- Tendencia actual hacia sistemas compuestos por un
conjunto de objetos que interactúan entre sí. - Un programa solicita servicios invocando los
métodos que ofrece un objeto. - La invocación de métodos se ve como un paso de
mensajes.
3Entornos orientados a objetos
op1
DATOS
op2
Implementación de métodos (op1, op2, ..., opN)
opN
4Entornos orientados a objetos
- Comunicación entre objetos Mensajes.
- Encapsulación.
- Identidad del objeto (Identificación).
- Herencia.
- Acciones.
- Clases.
- Instancias.
- Interfaces vs implementaciones.
- Herencia múltiple.
- Enlace dinámico.
- Recolección de basura.
5Enlace dinámico
- Shape aShape
- ShapeList aList
- int n aList -gtnumberElements()
- for (int i1 iltn i)
- aShape aList -gt nthELement()
- cout ltlt Perimeter ltlt aShape-gtperimeter() ltlt
\n -
-
6Modelo de objetos
7Modelo de objetos en sistemas distribuidos
8Modelo de objetos en sistemas distribuidos
- Sistemas distribuidos.
- Aplicaciones inherentemente distribuidas.
- Se caracterizan por su complejidad.
- Sistemas orientados a objetos.
- Más cercanos al lenguaje natural.
- Facilitan el diseño y la programación.
9Modelo de objetos en sistemas distribuidos
- ANSA (1989-1991) fue el primer proyecto que
intentó desarrollar una tecnología para modelizar
sistemas distribuidos complejos - Utilizaba un diseño orientado a objetos
- Estándares
- RMI invocación de métodos remotos de Java
- CORBA expande DCE con servicios orientados a
objetos - DCOM versión CORBA de Microsoft
10Modelo de objetos en sistemas distribuidos
- ROID Remote Object IDentifier.
- Java RMI ObjID.
- Localización de objetos.
- Servicio de nombres.
- Control de concurrencia.
- Transacciones.
- Protección de objetos.
- Recolección de basura de objetos remotos.
11Invocación de métodos remotos (RMI)
- Comunicación cliente/servidor gt RPC.
- Sistemas distribuidos basados en objetos gt RMI
(Remote method invocation). - RMI Acción de invocar un método de un interfaz
remoto en un objeto remoto. - RMI ofrece
- Mecanismos para crear servidores y objetos cuyos
métodos se puedan invocar remotamente. - Mecanismos que permiten a los clientes localizar
los objetos remotos.
12Invocación de métodos remotos en Java
- Java RMI
- El soporte para RMI en Java está basado en las
interfaces y clases definidas en los paquetes
java.rmi y java.rmi.server - Características de Java RMI
- No requiere un IDL (Interface Definition
Language). - La transferencia de objetos de tipos de datos
complejos se lleva a cabo mediante mecanismos de
serialización. - Es necesario tratar mayor número de excepciones
que en el caso de invocación de métodos locales.
13Invocación de métodos remotos en Java
- Localización de objetos remotos
- Servidor de nombres java.rmi.Naming
- Ejemplo
-
- BankAccount acct new BankAccountImpl()
- String url rmi//java.Sun.COM/account
- // enlazamos una url a un objeto remoto
- java.rmi.Naming.bind(url, acct)
- ....
- // búsqueda de la cuenta
- acct (BankAccount) java.rmi.Naming.lookup(url)
14Arquitectura de Java RMI
15Arquitectura de Java RMI
- Nivel de transporte se encarga de las
comunicaciones y de establecer las conexiones
necesarias - Nivel de gestión de referencias remotas trata
los aspectos relacionados con el comportamiento
esperado de las referencias remotas (mecanismos
de recuperación, etc.) - Nivel de resguardo/esqueleto (proxy/skeleton) que
se encarga del aplanamiento (serialización) de
los parámetros - proxy resguardo local. Cuando un cliente realiza
una invocación remota, en realidad hace una
invocación de un método del resguardo local. - Esqueleto (skeleton) recibe las peticiones de
los clientes, realiza la invocación del método y
devuelve los resultados.
16Cómo escribir aplicaciones con Java RMI?
17Ejemplo
18Modelización de la interfaz remota (Sumador)
- public interface Sumador extends java.rmi.Remote
-
- public int sumar(int a, int b)
- throws java.rmi.RemoteException
19Clase que implementa la interfaz (SumadorImpl)
- import java.rmi.
- import java.rmi.server.UnicastRemoteObject
- public class SumadorImpl extends
UnicastRemoteObject implements Sumador - public SumadorImpl(String name) throws
RemoteException - super()
- try
- System.out.println("Rebind Object " name)
- Naming.rebind(name, this)
- catch (Exception e)
- System.out.println("Exception "
e.getMessage()) - e.printStackTrace()
-
-
- public int sumar (int a, int b) throws
RemoteException - return a b
-
-
20Código del servidor (SumadorServer)
- import java.rmi.
- import java.rmi.server.
- public class SumadorServer
- public static void main (String args)
- try
- SumadorImpl misuma new
- SumadorImpl("MiSumador")
- catch(Exception e)
- System.err.println("System exception" e)
-
-
21Registro del servicio
-
- Antes de arrancar el cliente y el servidor, se
debe arrancar el programa rmiregistry en el
servidor para el servicio de nombres. El puerto
que utiliza el rmiregistry por defecto es el
1099. - rmiregistry port_number
- El método rebind es utilizado normalmente en
lugar del método bind, porque garantiza que si un
objeto rémoto se registró previamente con dicho
nombre, el nuevo objeto reemplazará al antiguo.
22Código en el cliente (SumadorClient)
- import java.rmi.registry.
- import java.rmi.server.
- public class SumadorClient
- public static void main(String args)
- int res 0
- try
- System.out.println("Buscando Objeto ")
- Sumador misuma (Sumador)Naming.lookup("rmi
//" args0 "/" "MiSumador") - res misuma.sumar(5, 2)
- System.out.println("5 2 " res)
-
- catch(Exception e)
- System.err.println(" System exception")
- System.exit(0)
-
23Búsqueda
- Cualquier programa que quiera instanciar un
objeto remoto debe realizar una búsqueda de la
siguiente forma - Sumador misuma (Sumador)Naming.lookup("
rmi//" args0 "/" "MiSumador") - El método lookup devuelve una referencia remota a
un objeto que implementa la interfaz remota. - El método lookup interactúa con rmiregistry.
24Pasos
- Java RMI
- Enlace a un nombre bind(), rebind()
- Encontrar un objeto y obtener su referencia
lookup() - refObj.nombre_met()
25Cuadro general
Cliente
Servidor
op1 op2 opN
Stub
Skeleton
Red
26Cómo se ejecuta?
- Compilación
- javac Sumador.java
- javac SumadorImpl.java
- javac SumadorClient.java
- javac SumadorServer.java
- Generación de los esqueletos
- rmic SumadorImpl
- Ejecución del programa de registro de RMI
- rmiregistry
- Ejecución del servidor
- java SumadorServer
- Ejecución del cliente
- java SumadorCliente lthost-del-servidorgt
27Java RMI vs CORBA
- Java RMI es más sencillo
- Trata sólo con objetos Java.
- Java RMI permite pasar por valor cualquier objeto
que se pueda serializar. - CORBA es más flexible
- Proporciona soporte RMI de objetos implementados
en diversos lenguajes y clientes escritos también
en distintos lenguajes. - CORBA añade bastante complejidad.
28Referencias bibliográficas
- Distributed Systems. Concepts and Design. 2º
edición - G. Coulouris, J. Dollimore, T. Kindberg.
- Addison-Wesley, 1994
- http//www.dcs.qmw.ac.uk/research/distrib/book.htm
l - Información on-line de Sun (Remote Method
Invocation Specification) - http//java.sun.com/products/jdk/1.1/docs/guide/rm
i/spec/rmiTOC.doc.html - Distributed Operating Systems
- A. S. Tanenbaum
- Prentice-Hall, 1995