Introducción

RMI es un mecanismo mediante el cual los objetos cliente y servidor en una aplicación distribuida Java se comunican.

La aplicación distribuida en Java necesita:

1) Localizar los objetos remotos: Mediante la facilidad rmiregistry de Java 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 descargar el código de los objetos tanto remotos como locales pasados cómo parámetros o valor de retorno, así como transmitir sus datos.

Sistema RMI

La Arquitectura de JAVA RMI

La definición de un comportamiento y su implementación son conceptos separados. En RMI, el código que define el comportamiento y el código que lo implementa están y se ejecutan en diferentes JVMs. La definición de un servicio remoto se hace usando una interfaz de JAVA. La implementación se codifica en una clase (Servidor).

Sistema RMI

RMI soporta 2 clases que implementan la misma interfaz. La primera implementa el servicio y se ejecuta en el servidor. La segunda actúa como un proxy para el servicio remoto y se ejecuta en el cliente.

Niveles Arquitecturales de RMI

Nivel de referencia remota (Remote Reference Layer): Está al tanto de cómo interpretar y administrar las referencias que realizan los clientes a objetos remotos.

El Nivel de Transporte: Se basa en conexiones TCP/IP entre máquinas en una red. Ofrece conectividad básica, así como algunas estrategias para atravesar cortafuegos.

Nivel de Referencia Remota

Los niveles de referencia remota definen y soportan la semántica de la invocación de una conexión RMI. Este nivel ofrece un objeto RemoteRef que representa el enlace al objeto que alberga la implementación del servicio remoto.

Los stubs usan el método invoke() para dirigir (to forward) la llamada. El objeto RemoteRef entiende la semántica de invocación para servicios remotos.

Nivel de los Stubs y Skeletons

Un skeleton es una clase auxiliar generada por RMI. Un skeleton entiende cómo comunicarse con el stub a través del enlace RMI.

El skeleton mantiene una conversación con el stub; lee los parámetros de la llamada, efectúa la invocación al servicio remoto (to the remote service implementation object), acepta el valor de retorno y lo retorna al stub. En la implementación de RMI de Java 2 SDK la clase skeleton está obsoleta debido al protocolo new wire.

Nivel de Transporte

El nivel de transporte realiza la conexión entre JVMs. Todas las conexiones son stream-based y usan TCP

Aún si dos JVMs se están ejecutando en la misma computadora, ellas se conectan a través del protocolo TCP/IP.

Por encima de TCP/IP, RMI usa un wire level protocol llamado Java Remote Method Protocol (JRMP).

JRMP es un protocolo propietario, stream-based que está especificado para dos versiones. La primera se liberó con JDK 1.1 y requiere del uso de clases Skeleton en el servidor. La segunda versión se liberó con Java 2 SDK. Se ha optimizado para mejorar el desempeño por lo que no requiere de las clases skeletons.