Вы находитесь на странице: 1из 22

JAVA RMI

(REMOTE METHOD
INVOCATION)

Java
Java RMI

z RMI (Remote Method Invocation)


{ Mecanismo RPC de Java
{ Mecanismo mediante el cual los procesos cliente y
servidor en una aplicacin distribuida Java se
comunican

24/10/2005

Una aplicacin distribuida en java necesita:

1. Localizar los objetos remotos: Mediante la facilidad


rmiregistry de Java o pasando los objetos remotos como
parmetros o valores de retorno en llamadas a mtodos
remotos
2. Comunicarse con objetos remotos: RMI maneja todos
los detalles de la comunicacin. Para el programador la
comunicacin remota es igual a una invocacin a un
mtodo local estndar
3. Descarga de las clases de los objetos pasados como
parmetros o valor de retorno: RMI proporciona los
mecanismos necesarios para cargar el cdigo de los
objetos tanto remotos como locales pasados cmo
parmetros o valor de retorno, as como transmitir sus
datos.
24/10/2005

Java
Java RMI

zConstruccin de una aplicacin distribuida


paso a paso
{1. Escribir el cdigo del servidor RMI y del
cliente
z1.1. Definir las funciones de la clase remota como
una interfaz remota
z1.2. Implementar la clase remota y el servidor
z1.3. Escribir un programa cliente que use el servicio
remoto

{2. Compilar el cdigo del cliente y del servidor


{3. Iniciar el registro RMI y el servidor
24/10/2005

Java
Java RMI

zEjemplo: HelloWorld! con Servidor


Remoto
{Definicin de la interfaz remota (fichero Hello.java)
package examples.hello;
//Todas las interfaces remotas deben implementar la interfaz Remote
import java.rmi.Remote;
//Todos los mtodos remotos tienen que tener la posibilidad de lanzar
la excepcin RemoteException
import java.rmi.RemoteException;
public interface Hello extends Remote{
String sayHello() throws RemoteException;
}

24/10/2005

Java
Java RMI- objeto remoto
z Implementacin del Objeto Remoto y del Servidor
(fichero HelloImpl.java)

24/10/2005

package examples.hello;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject
implements Hello {
public HelloImpl() throws RemoteException {
super();
}
public String sayHello() throws RemoteException{
return "Hello World!";
... Continua en ->
}
6

Java RMI- servidor


... Continuacin ->

{Implementacin del Objeto Remoto y del


Servidor
public static void main(String args[]) {
// Create and install a security manager
if (System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
try {
//createRegistry(1099);
Hello obj = new HelloImpl();
// Bind this object instance to the name "HelloServer
Naming.rebind("///HelloServer", obj);
} catch (Exception e) {}
}
24/10/2005

}
7

Java RMI Inicio del Registro RMI desde cdigo

private
privatestatic
staticvoid
voidcreateRegistry(int
createRegistry(inthostport){
hostport){
try{
try{
LocateRegistry.createRegistry(hostport);
LocateRegistry.createRegistry(hostport);
}catch(RemoteException
}catch(RemoteExceptione){
e){
try{
try{
LocateRegistry.getRegistry(hostport);
LocateRegistry.getRegistry(hostport);
}catch(RemoteException
}catch(RemoteExceptionerr){
err){
System.out.println("Error
System.out.println("Error......""++err.getMessage());
err.getMessage());
err.printStackTrace();
err.printStackTrace();
}}
}}
try{
try{
System.out.println("Activating
System.out.println("ActivatingJava
JavaRmiRegistry.............");
RmiRegistry.............");
java.lang.Thread.sleep(2000);
java.lang.Thread.sleep(2000);
}catch(java.lang.InterruptedException
}catch(java.lang.InterruptedExceptionerr1){
err1){
System.out.println("Error...
"
+
err1.getMessage());
System.out.println("Error... " + err1.getMessage());
err1.printStackTrace();
err1.printStackTrace();
}}
}}
24/10/2005

Java
Java RMI - cliente
z Implementacin del programa Cliente (fichero HelloClient.java)

package examples.hello;
import java.applet.Applet;
import java.awt.Graphics;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class HelloClient {
String message = "blank";
// "obj" is the identifier that we'll use to refer to the remote object that implements the "Hello" interface
Hello obj = null;
public HelloClient() {
try {
obj = (Hello)Naming.lookup("//1HelloServer");
message = obj.sayHello();
System.out.println(Message +message);
} catch (Exception e) {}

public static void main(String args[]) {


HelloClient client = new HelloClient();
}
}

24/10/2005

Java
Java RMI Compilacin

zCompilar y Desarrollar la aplicacin


distribuida
{Compilar de los ficheros fuente del cliente y el
servidor. (Usando el compilador javac de Java)
javac

-d . *.java

{Generar los ficheros stub - skeleton. (Usando


el compilador rmic de Java)
rmic

-d .-classpath . examples.hello.HelloImpl

{Crear el fichero java.policy . Es un fichero que


especifica la poltica de seguridad:
grant {
permission java.security.AllPermission;
24/10/2005

};
10

Java

Java RMI - Ejecucin


z Iniciar el registro de Java (si no se inicia desde
cdigo)
{rmiregistry

z Iniciar el servidor RMI


{start java Djava.security.policy=java.policy classpath . examples.hello.HelloImpl

z Iniciar el cliente RMI


{java -Djava.security.policy=java.policy classpath . examples.hello.HelloClient

24/10/2005

11

Java
Java RMI
z Especificacin del sistema RMI de Java
{ Clases e Interfaces del sistema RMI
z Interfaz java.rmi.Remote
z Clases java.rmi.RemoteException, java.rmi.server.RemoteObject,
java.rmi.server.RemoteServer, java.rmi.server.UnicastRemoteObject y
java.rmi.activation.Activatable

{ Implementacin de una interfaz remota


z Extendiendo de java.rmi.server.UnicastRemoteObject Creacin de un objeto
remoto que se ejecuta continuamente
z Extendiendo de java.rmi.activation.Activatable Creacin de un objeto que se
instancia slo cuando es necesario

{ Paso de parmetros en RMI Serializacin


z Paso de objetos remotos
z Paso de objetos locales
z Transmisin de datos

{ Registro y Localizacin de objetos remotos Clase Naming


{ RMI Stubs (Proxy) y Skeletons (Esqueleto)
{ Registro de Java Interfaz Registry y clase LocateRegistry
24/10/2005

12

Java
Java RMI

zClases e Interfaces del sistema RMI

24/10/2005

13

Java
Java RMI
z Clases e Interfaces del sistema RMI
{ Una interfaz remota debe extender la interfaz
java.rmi.Remote
{ Pero puede adems extender otra interfaz que no sea remota
pero cuyos mtodos estn declarados como mtodos
remotos, como se muestra en el siguiente ejemplo:
z La interfaz Beta
public interface Alpha {
public final String okay = "constants are okay too";
public Object foo(Object obj) throws java.rmi.RemoteException;
public void bar() throws java.io.IOException;
public int baz() throws java.lang.Exception;
}

24/10/2005

public interface Beta extends Alpha, java.rmi.Remote {


public void ping() throws java.rmi.RemoteException;
}

14

Java
Java RMI

Implementacin de una interfaz remota


z Las reglas de implementacin de una interfaz remota son:
{ La clase usualmente extiende UnicastRemoteObject, y por tanto
hereda el comportamiento remoto proporcionado por las clases
RemoteObject y RemoteServer.
{ Si se quiere que el objeto remoto se cree slo cuando sea necesario se
extender de Activatable en lugar de UnicastRemoteObject
{ La clase puede implementar cualquier nmero de interfaces remotas.
{ La clase puede extender la implementacin de otra clase remota.
{ La clase puede definir mtodos que no aparezcan en la interfaz remota,
pero estos mtodos slo pueden ser usados localmente y no
remotamente.
{ !!IMPORTANTE!! Si es necesario, una clase que implemente una interfaz remota puede extender de
alguna otra clase que no sea java.rmi.server.UnicastRemoteObject. En este caso, la
implementacin de esta clase debe asumir la responsabilidad de exportar el objeto (tarea realizada por
el constructor de la clase UnicastRemoteObject) y de implementar (si es necesario) la semntica
remota correcta de los mtodos hashCode, equals, y toString heredados de la clase
java.lang.Object, tareas realizadas en las clases RemoteObject y RemoteServer

24/10/2005

15

Java
Java RMI

Paso de Parmetros en RMI


z Un parmetro de una llamada remota o un valor de retorno puede
ser cualquier tipo primitivo u objeto que sea serializable, es decir,
que implemente la interfaz java.io.Serializable
z Las clases de los parmetros o valor de retorno que no estn
localmente se descargan de forma dinmica durante la ejecucin
z Paso de parmetros no remotos
{ Estos parmetros se pasan como valor
{ Si es un parmetro se hace una copia del objeto antes de mandarlo al servidor
{ Si es un valor de retorno se crea un nueva instancia del objeto

z Paso de parmetros remotos


{ Objeto remoto exportado: se enva la referencia del stub del objeto
{ Objeto remoto no exportado: se enva la referencia al objeto remoto

z Clase Annotation
{ El descriptor de la clase de un objeto se asocia con los parmetros o valor de retorno
enviados en la invocacin remota para poder descargar el cdigo de la clase de forma
dinmica durante la ejecucin en caso de que no se encuentren de forma local
24/10/2005

16

Java
Java RMI

Registro y Localizacin de Objetos Remotos


{Se realiza utilizando la clase java.rmi.Naming
{Los objetos remotos se registran asocindoles
una cadena formateada como una URL
//host:port/name
Host: Nombre de la mquina donde se registra el objeto.
Por defecto la mquina local
Port: Puerto donde el registro estar esperando. Por
defecto, 1099 que es el puerto usado por el registro
(rmiregistry) de Java
Name: Nombre que se le asigna al objeto remoto
24/10/2005

17

Java
Java RMI

Clase Naming

package java.rmi;
public final class Naming {
public static Remote lookup(String url)
throws NotBoundException,
java.net.MalformedURLException,
RemoteException;
public static void bind(String url,
Remote obj)
throws AlreadyBoundException,
java.net.MalformedURLException,
RemoteException;
public static void rebind(String url,
Remote obj)
throws RemoteException,
java.net.MalformedURLException;
public static void unbind(String url)
throws RemoteException,
NotBoundException,
java.net.MalformedURLException;
public static String[] list(String url)
throws RemoteException,
java.net.MalformedURLException;

}
24/10/2005

Mtodo bind: Este mtodo asociada el nombre

especificado como primer parmetro al objeto


remoto indicado como segundo parmetro. Se
lanza la excepcin AlreadyBoundException si el
nombre ya est usado para referenciar algn
objeto remoto.

Mtodo rebind: Este mtodo siempre relaciona

el nombre al objeto remoto incluso si el nombre


ya est asociado a otro objeto remoto. La
asociacin anterior se pierde.

Mtodo unbind: Este mtodo elimina la

asociacin entre el nombre y el objeto remoto.


Se lanza la excepcin NotBoundException si no
existe esa asociacin.

Mtodo lookup: Este mtodo devuelve el objeto


remoto asociado con el nombre indicado como
parmetro. Se lanza la excepcin
NotBoundException si ese nombre no est
asociado a ningn objeto remoto.

Mtodo list: Este mtodo devueve un array de


objetos String que contiene las URLs
registradas.

18

Java
Java RMI

RMI Stubs y Skeletons


z Stub: Acta como una representacin local en el cliente del objeto
remoto. Cuando el objeto remoto se exporta (en el constructor del
objeto remoto) se crea una instancia del stub en el cliente.
{ El objeto que realiza una llamada remota invoca el mtodo en el
stub local
{ El stub es el responsable de hacer llegar la llamada al objeto
remoto
{ Implementa exactamente el mismo conjunto de interfaces remotas
que el objeto remoto
{ Los pasos que realiza son:
z
z
z
z
z

Inicia una conexin con la JVM remota que contiene el objeto remoto
Escribe (serializa) y transmite los parmetros a la JVM remota
Espera los resultados de la invocacin remota
Lee (deserializa) el valor de retorno o las excepciones devueltas
Devuelve el valor al objeto que inici la llamada

24/10/2005

{ Oculta el proceso de serializacin y comunicacin a travs de la red

19

Java
Java RMI
z Skeleton: En la JVM remota, cada objeto remoto tiene
su correspondiente esqueleto.
{ Es responsable de enviar la llamada a la implementacin del
objeto remoto
{ Los pasos que realiza son:
z Lee (deserializa) los parmetros del mtodo remoto
z Invoca el mtodo en la implementacin del objeto remoto
z Escribe (serializa) y transmite el resultado

z En la versin Java 2 se ha introducido un protocolo stub


adicional que elimina la necesidad de esqueletos en
entornos en los que slo se utilice Java 2. En su lugar,
se usa un cdigo genrico que lleva a cabo las tareas
realizadas por el esqueleto en JDK 1.1
24/10/2005

20

Java
Java RMI
Registro de Java Interfaz Registry y clase LocateRegistry
z Interfaz Registry y clase LocateRegistry proporcionan un servicio
que permita registrar y recuperar objetos mediante su nombre.
z No es necesario iniciar explcitamente el registro desde la lnea de
comando con el comando rmiregistry.
z Registro: Objeto remoto que establece una relacin entre nombres y
objetos remotos. Cualquier proceso servidor puede soportar su
propio registro o puede usarse un solo registro para cada mquina.
z Los mtodos de la clase LocateRegistry se usan para obtener un
registro que opere en una mquina particular o una mquina y un
puerto. Los mtodos de la clase java.rmi.Naming vista
anteriormente hacen llamadas a un objeto remoto que implementa
la interfaz Registry usando el mtodo LocateRegistry.getRegistry.
24/10/2005

21

Java
Java RMI

Interfaz java.rmi.Registry
z Proporciona mtodos para:
{ Registrar un objeto remoto
{ Eliminar el registro de un objeto remoto
{ Buscar la referencia asociada a un nombre de objeto
{ Listar los objetos registrados en un registro determinado

Clase java.rmi.LocateRegistry
z Define dos tipos de mtodos
z getRegistry(): Para obtener un registro ya existente en la mquina. En caso
de que no exista ste mtodo no devolver ningn error.
{ createRegistry(): Para crear un registro en la mquina.

z Estos mtodos estarn sobrecargados para obtener/crear el registro


proporcionando de forma opcional el nombre de la mquina y el puerto
24/10/2005
22

Вам также может понравиться