22
JAVA RMI (REMOTE METHOD INVOCATION)

JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

Embed Size (px)

Citation preview

Page 1: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

JAVA RMI(REMOTE METHOD

INVOCATION)

Page 2: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

2

Java RMI

RMI (Remote Method Invocation) Mecanismo RPC de JavaMecanismo mediante el cual los procesos cliente y servidor en una aplicación distribuida Java se comunican

Java

Page 3: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

3

Una 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 cargar el código de los objetos tanto remotos como locales pasados cómo parámetros o valor de retorno, así como transmitir sus datos.

Page 4: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

4

Java RMI

Construcción de una aplicación distribuida paso a paso

1. Escribir el código del servidor RMI y del cliente

1.1. Definir las funciones de la clase remota como una interfaz remota1.2. Implementar la clase remota y el servidor1.3. Escribir un programa cliente que use el servicio remoto

2. Compilar el código del cliente y del servidor3. Iniciar el registro RMI y el servidor

Java

Page 5: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

5

Java RMI

Ejemplo: HelloWorld! con Servidor Remoto

Definición de la interfaz remota (fichero Hello.java)package examples.hello;//Todas las interfaces remotas deben implementar la interfaz Remoteimport java.rmi.Remote;//Todos los métodos remotos tienen que tener la posibilidad de lanzar

la excepción RemoteExceptionimport java.rmi.RemoteException;

public interface Hello extends Remote{String sayHello() throws RemoteException;

}

Java

Page 6: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

6

Java RMI- objeto remoto

Implementación del Objeto Remoto y del Servidor (fichero HelloImpl.java)

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!";}

Java

... Continua en ->

Page 7: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

7

Java RMI- servidor

Implementación del Objeto Remoto y del Servidor

public static void main(String args[]) {// Create and install a security managerif (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) {}}

}

... Continuación ->

Page 8: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

8

Java RMI Inicio del Registro RMI desde código

private static void createRegistry(int hostport){try{

LocateRegistry.createRegistry(hostport);}catch(RemoteException e){

try{LocateRegistry.getRegistry(hostport);

}catch(RemoteException err){System.out.println("Error ... " + err.getMessage());err.printStackTrace();

}}try{

System.out.println("Activating Java RmiRegistry.............");java.lang.Thread.sleep(2000);

}catch(java.lang.InterruptedException err1){System.out.println("Error... " + err1.getMessage());err1.printStackTrace();

}}

private static void createRegistry(int hostport){try{

LocateRegistry.createRegistry(hostport);}catch(RemoteException e){

try{LocateRegistry.getRegistry(hostport);

}catch(RemoteException err){System.out.println("Error ... " + err.getMessage());err.printStackTrace();

}}try{

System.out.println("Activating Java RmiRegistry.............");java.lang.Thread.sleep(2000);

}catch(java.lang.InterruptedException err1){System.out.println("Error... " + err1.getMessage());err1.printStackTrace();

}}

Page 9: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

9

Java RMI - cliente

Implementación 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();

}}

Java

Page 10: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

10

Java RMI –Compilación

Compilar y Desarrollar la aplicación 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 política de seguridad:

Java

grant {permission java.security.AllPermission;

};

Page 11: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

11

Java RMI - Ejecución

Iniciar el registro de Java (si no se inicia desde código)

rmiregistryIniciar el servidor RMI

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

Iniciar el cliente RMIjava -Djava.security.policy=java.policy -classpath . examples.hello.HelloClient

Java

Page 12: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

12

Java RMI

Especificación del sistema RMI de JavaClases e Interfaces del sistema RMI

Interfaz java.rmi.RemoteClases java.rmi.RemoteException, java.rmi.server.RemoteObject, java.rmi.server.RemoteServer, java.rmi.server.UnicastRemoteObject y java.rmi.activation.Activatable

Implementación de una interfaz remotaExtendiendo de java.rmi.server.UnicastRemoteObject Creación de un objeto remoto que se ejecuta continuamenteExtendiendo de java.rmi.activation.Activatable Creación de un objeto que se instancia sólo cuando es necesario

Paso de parámetros en RMI – SerializaciónPaso de objetos remotosPaso de objetos localesTransmisión de datos

Registro y Localización de objetos remotos – Clase NamingRMI Stubs (Proxy) y Skeletons (Esqueleto)Registro de Java – Interfaz Registry y clase LocateRegistry

Java

Page 13: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

13

Java RMI

Clases e Interfaces del sistema RMI

Java

Page 14: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

14

Java RMI

Clases e Interfaces del sistema RMIUna interfaz remota debe extender la interfaz java.rmi.RemotePero puede además extender otra interfaz que no sea remota pero cuyos métodos estén declarados como métodos remotos, como se muestra en el siguiente ejemplo:

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;

}

public interface Beta extends Alpha, java.rmi.Remote {public void ping() throws java.rmi.RemoteException;

}

Java

Page 15: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

15

Java RMI

Implementación de una interfaz remotaLas reglas de implementación 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 sólo cuando sea necesario se extenderá de Activatable en lugar de UnicastRemoteObjectLa clase puede implementar cualquier número de interfaces remotas.La clase puede extender la implementación de otra clase remota.La clase puede definir métodos que no aparezcan en la interfaz remota, pero estos métodos sólo 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 implementación 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 semántica remota correcta de los métodos hashCode, equals, y toString heredados de la clase java.lang.Object, tareas realizadas en las clases RemoteObject y RemoteServer

Java

Page 16: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

16

Java RMI

Paso de Parámetros en RMIUn parámetro 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.SerializableLas clases de los parámetros o valor de retorno que no están localmente se descargan de forma dinámica durante la ejecuciónPaso de parámetros no remotos

Estos parámetros se pasan como valorSi es un parámetro se hace una copia del objeto antes de mandarlo al servidorSi es un valor de retorno se crea un nueva instancia del objeto

Paso de parámetros remotosObjeto remoto exportado: se envía la referencia del stub del objetoObjeto remoto no exportado: se envía la referencia al objeto remoto

Clase AnnotationEl descriptor de la clase de un objeto se asocia con los parámetros o valor de retorno enviados en la invocación remota para poder descargar el código de la clase de forma dinámica durante la ejecución en caso de que no se encuentren de forma local

Java

Page 17: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

17

Java RMI

Registro y Localización de Objetos RemotosSe realiza utilizando la clase java.rmi.NamingLos objetos remotos se registran asociándoles una cadena formateada como una URL

//host:port/name• Host: Nombre de la máquina donde se registra el objeto.

Por defecto la máquina 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

Java

Page 18: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

18

Java RMI

Clase Namingpackage 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;

}

Java

Método bind: Este método asociada el nombre especificado como primer parámetro al objeto remoto indicado como segundo parámetro. Se lanza la excepción AlreadyBoundException si el nombre ya está usado para referenciar algún objeto remoto.

Método rebind: Este método siempre relaciona el nombre al objeto remoto incluso si el nombre ya está asociado a otro objeto remoto. La asociación anterior se pierde.

Método unbind: Este método elimina la asociación entre el nombre y el objeto remoto. Se lanza la excepción NotBoundException si no existe esa asociación.

Método lookup: Este método devuelve el objeto remoto asociado con el nombre indicado como parámetro. Se lanza la excepción NotBoundException si ese nombre no estáasociado a ningún objeto remoto.

Método list: Este método devueve un array de objetos String que contiene las URLsregistradas.

Page 19: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

19

Java RMI

RMI Stubs y SkeletonsStub: Actúa como una representación 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 método en el stub localEl stub es el responsable de hacer llegar la llamada al objeto remotoImplementa exactamente el mismo conjunto de interfaces remotas que el objeto remotoLos pasos que realiza son:

Inicia una conexión con la JVM remota que contiene el objeto remotoEscribe (serializa) y transmite los parámetros a la JVM remotaEspera los resultados de la invocación remotaLee (deserializa) el valor de retorno o las excepciones devueltasDevuelve el valor al objeto que inició la llamada

Oculta el proceso de serialización y comunicación a través de la red

Java

Page 20: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

20

Java RMI

Skeleton: En la JVM remota, cada objeto remoto tiene su correspondiente esqueleto.

Es responsable de enviar la llamada a la implementación del objeto remotoLos pasos que realiza son:

Lee (deserializa) los parámetros del método remotoInvoca el método en la implementación del objeto remotoEscribe (serializa) y transmite el resultado

En la versión Java 2 se ha introducido un protocolo stubadicional que elimina la necesidad de esqueletos en entornos en los que sólo se utilice Java 2. En su lugar, se usa un código genérico que lleva a cabo las tareas realizadas por el esqueleto en JDK 1.1

Java

Page 21: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

21

Java RMI

Registro de Java – Interfaz Registry y clase LocateRegistryInterfaz Registry y clase LocateRegistry proporcionan un servicio que permita registrar y recuperar objetos mediante su nombre.No es necesario iniciar explícitamente el registro desde la línea de comando con el comando rmiregistry. Registro: Objeto remoto que establece una relación entre nombres y objetos remotos. Cualquier proceso servidor puede soportar su propio registro o puede usarse un solo registro para cada máquina.Los métodos de la clase LocateRegistry se usan para obtener un registro que opere en una máquina particular o una máquina y un puerto. Los métodos de la clase java.rmi.Naming vista anteriormente hacen llamadas a un objeto remoto que implementa la interfaz Registry usando el método LocateRegistry.getRegistry.

Java

Page 22: JAVA RMI (REMOTE METHOD INVOCATION) - lcc.uma.eslcc.uma.es/~pinilla/JavaRMI.pdf · 24/10/2005 2 Java RMI zRMI (Remote Method Invocation) {Mecanismo RPC de Java {Mecanismo mediante

24/10/2005

22

Java RMI

Interfaz java.rmi.RegistryProporciona métodos para:

Registrar un objeto remotoEliminar el registro de un objeto remotoBuscar la referencia asociada a un nombre de objetoListar los objetos registrados en un registro determinado

Clase java.rmi.LocateRegistryDefine dos tipos de métodosgetRegistry(): Para obtener un registro ya existente en la máquina. En caso de que no exista éste método no devolverá ningún error.

createRegistry(): Para crear un registro en la máquina. Estos métodos estarán sobrecargados para obtener/crear el registro proporcionando de forma opcional el nombre de la máquina y el puerto

Java