Middleware
Java 2 Enterprise Edition
REMOTE METHOD INVOCATION
(RMI)
Remote Method Invocation
Objetivo
Desarrollar Aplicaciones Java
Distribuidas usando la misma sintaxis y
semantica usada en aplicaciones no
distribuidas
Introducido en JDK 1.1
RMI – Local vs Remote
Definicion
Implementacion
Creacion
Acceso
Referencias
Objeto Local
Objeto Remoto
Definido por una clase
Java
Definido por una interface
que debe extender la
interface Remote
Implementado por la
clase Java
Comportamiento es provisto
por una clase Java que
implementa Remote
Operador new
Creado en el Server via new
El cliente no puedo hacer
new
Via object reference
Via object reference que
apunta a la implementacion
del proxy stub
Apuntan a un area de
memoria en la maquina
local
Una referencia remota es un
puntero a stub proxy
RMI – Local vs Remote
Objeto Local
Objeto Remoto
Referencias
Activas
Un objeto con una
referencia se considera
“alive”
Referencias remotas son
sensibles a caidas en la red
Finalizacion
Objeto implementa
metodo
Implementa
Unreferenced()
finalize()
Garbage
Collection
Excepciones
Cuando no quedan
referencias al objeto, es
candidato para el GC
El GC Distribuido trabaja en
conjunto con el GC Local, se
analizan referencias locales
y remotas
Runtime y Exceptions
RMI fuerza al programador
para que resuelva cualquier
posible RemoteException
Compilador obliga a
manejar las Excepciones
Arquitectura RMI
Crear un modelo de objetos distribuidos que se
integre naturalmente con el lenguaje Java y con el
modelo de objetos locales
Concepto de Interfaces
Definicion del Comportamiento
interface
Implementacion del Comportamiento
class
Arquitectura RMI
RMI soporta dos clases que implementan la misma
interfaz
Service Proxy
Client
Service Implementacion
Server
Arquitectura RMI
Layers
Stubs & Skeletons
• Intercepta invocaciones que el cliente realiza sobre la variable
de referencia a la interface y redirecciona la llamada al Servicio
Remoto RMI
Remote Reference Layer
• Se encarga de establecer la conexion entre cliente y server
• Remote Object Activation (Java 2)
Transport Layer
• Conexiones TCP - Seguridad
Arquitectura RMI
Stubs & Skeletons - Proxy Pattern
Un objeto en un contexto es representado por otro (el
proxy) en un contexto separado.
El proxy sabe como forwardear los llamados a metodos.
stub
skeleton
Arquitectura RMI
Remote Reference Layer
Provee un objeto RemoteRef que representa el link al
objeto que implementa el servicio remoto
Los stubs usan el metodo invoke() sobre RemoteRef para
forwardear la llamada a un metodo.
Objeto RemoteRef conoce la semantica de invocacion de
servicios remotos.
Transport Layer
Establece conexion TCP/IP entre cliente y server
Java Remote Method Protocol (JRMP)
RMI – Naming
Servicios de Directorio
RMI Registry
Java Naming and Directory Interface (JNDI)
RMI Registry
RMI provee un servicio muy simple llamado rmiregistry
Corre en cada maquina que hostea objetos servidores
Port 1099
RMI – Naming
Host
1.
2.
3.
4.
Programa crea un servicio remoto creando primero el
objeto local que implementa el servicio
Exporta el objeto a RMI
RMI crea un servicio que espera conexiones
Registra el objeto en rmiregistry bajo un nombre
Cliente
1.
Accede al RMI Registry a traves de una clase estatica
Naming
Naming provee un metodo lookup() que se utiliza para
hacer queries al registry. Se pasa la URL del servicio
usando la forma:
rmi://<hostname>:<service_port>/<service_name>
RMI – Implementacion
1.
Escribir y compilar el codigo Java para las interfaces
2.
Escribir y compilar el codigo para las clases de
implementacion
3.
Generar Archivos Stub y Skeleton para las clases de
implementacion
4.
Escribir codigo Java para el programa que
implemente el servicio remoto
5.
Desarrollar aplicacion cliente RMI
6.
Instalar y ejecutar el Sistema RMI
RMI – Implementacion
Interface
public interface Calculator extends java.rmi.Remote {
public long add(long a, long b) throws
java.rmi.RemoteException;
public long sub(long a, long b) throws
java.rmi.RemoteException;
public long mul(long a, long b) throws
java.rmi.RemoteException;
public long div(long a, long b) throws
java.rmi.RemoteException;
}
RMI – Implementacion
Implementacion
public class CalculatorImpl extends java.rmi.server.UnicastRemoteObject
implements Calculator
{ // Implementaciones deben tener un constructor explicito para poder
declarar la excepcion RemoteException
public CalculatorImpl() throws java.rmi.RemoteException
{
super();
}
public long add(long a, long b) throws java.rmi.RemoteException
{
return a + b;
}
public long sub(long a, long b) throws java.rmi.RemoteException
{
return a - b;
}
public long mul(long a, long b) throws java.rmi.RemoteException
{
return a * b;
}
public long div(long a, long b) throws java.rmi.RemoteException
{
}
return a / b;
}
RMI – Implementacion
Stubs & Skeletons
Calculator_Stub.class
# rmic CalculatorImpl
Calculator_Skel.class
RMI – Implementacion
Host Server
import java.rmi.Naming;
public class CalculatorServer {
public CalculatorServer() {
try { Calculator c = new CalculatorImpl();
Naming.rebind("rmi://localhost:1099/CalculatorService",
c);
} catch (Exception e) { System.out.println("Trouble: " +
e);}
}
public static void main(String args[]) {
new CalculatorServer();
}
}
RMI – Implementacion
Cliente
Implementar clase CalculatorClient
Calculator c = (Calculator) Naming.lookup(
"rmi://remotehost/CalculatorService");
Ejecutar el Sistema
rmiregistry
java CalculatorServer
java CalculatorClient
Descargar

Remote Method Invocation