Download Java RMI - Programación Distribuida y Tiempo Real

Document related concepts
no text concepts found
Transcript
Programación Distribuida y Tiempo Real
RMI
1. RMI: Remote Method Invocation
1.1. RMI: programación con objetos/Java para sistemas distribuidos, extensión
del modelo de programación de Java para/en sistemas distribuidos
1.2. Es propio de Java (Sun-Oracle, RPC…)
1.3. Idea general de un sistema/arquitectura de objetos distribuidos
1.4. Cliente/Servidor (¡!)
1.5. Es muy similar en varios aspectos a RPC
1.6. Iniciaremos con lo mismo que hicimos con RPC
1.6.1. Todo en una JVM (no distribuido)
1.6.2. Un objeto sobre el que invocaremos un método en otra JVM
Programación Distribuida y Tiempo Real – Notas de Clase
2. Una clase “normal”
/*
* NoRemoteClass.java
*
Just one method: sendThisBack
*
*/
/* This class implements the interface with remote methods */
public class NoRemoteClass
{
protected NoRemoteClass()
{
super();
}
/* Remote method implementation */
public byte[] sendThisBack(byte[] data)
{
System.out.println("Data back to client");
return data;
}
}
Que es utilizada desde o es parte de una aplicación…
/*
* StartAndInvoke.java
*
a) Creates a NoRemoteClass object
*
b) Invokes the only one method
*/
public class StartAndInvoke
{
public static void main(String[] args)
{
NoRemoteClass noRemoteObj = new NoRemoteClass();
int bufferlength
byte[] buffer
= 100;
= new byte[bufferlength];
noRemoteObj.sendThisBack(buffer);
System.out.println("Done");
}
}
Programación Distribuida y Tiempo Real – Notas de Clase
2.1. RMI: Esquema general:
Comp. con servidor
Comp. con cliente
registry
3
Aplic. con obj. que invoca
remoto
2
Aplic. con obj. remoto
1
Interf. remoto
4
Objeto remoto
Llam. remoto
2.2. Interfaces, Clases, Exceptions, …
2.3. Ejemplo
2.3.1. IfaceRemoteClass: def. de los métodos a llamar de forma remota
2.3.2. RemoteClass: implementación de la clase con los remotos
2.3.3. StartRemoteObject: creación y registro del objeto invocable
2.3.4. AskRemote: búsqueda e invocación del objeto con métodos remotos
3. Abrir una terminal, a partir de aquí se considera que se está en $HOME, el signo
“>” identifica la línea de comandos de la terminal
4. El contenido de todos los .java se puede extraer directamente de esta guía
Programación Distribuida y Tiempo Real – Notas de Clase
5. Para que una clase tenga definidos métodos a ser invocados de manera remota
5.1. Se utiliza interface (solamente define, no implementa) ¿Por qué?
5.2. Se utiliza lo provisto por Java para RMI, Java RMI
5.3. La interface en IfaceRemoteClass.java define un sólo “método remoto”:
/*
* IfaceRemoteClass.java
* Interface defining only one method which can be invoked remotely
*
*/
/* Needed for defining remote method/s */
import java.rmi.Remote;
import java.rmi.RemoteException;
/* This interface will need an implementing class */
public interface IfaceRemoteClass extends Remote
{
/* It will be possible to invoke this method from an application in other JVM */
public byte[] sendThisBack(byte[] data) throws RemoteException;
}
5.3.1. Es una interface de Java: no tiene código ejecutable, solamente
declaraciones. Como lo indican los comentarios:
5.3.2. Los “import” son necesarios para definir métodos remotos
5.3.3. La “interface” necesitará una clase que la implemente
5.3.4. El método sendThisBack se podrá invocar de manera remota: desde
otra aplicación que se ejecuta en otra máquina virtual
5.4. Como “reglas generales” de cada interface con métodos remotos:
5.4.1. Debe extender Remote: extends Remote
5.4.2. Todos los métodos deben tener throws RemoteException
Programación Distribuida y Tiempo Real – Notas de Clase
5.5. Implementación de la interface:
/*
* RemoteClass.java
*
Just implements the RemoteMethod interface as an extension to
*
UnicastRemoteObject
*
*/
/* Needed for implementing remote method/s */
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
/* This class implements the interface with remote methods */
public class RemoteClass extends UnicastRemoteObject implements IfaceRemoteClass
{
protected RemoteClass() throws RemoteException
{
super();
}
/* Remote method implementation */
public byte[] sendThisBack(byte[] data) throws RemoteException
{
System.out.println("Data back to client");
return data;
}
}
5.5.1. Como en el caso anterior, hay un conjunto de declaraciones necesarias,
en este caso para una implementación con métodos remotos
5.5.2. Lo único que es propio de la implementación es el código del método:
{
System.out.println("Data back to client");
return data;
}
Muestra un mensaje en pantalla y retorna lo recibido como parámetro
Programación Distribuida y Tiempo Real – Notas de Clase
6. Hasta ahora no hay un objeto sobre el cual invocar un método, se necesita
6.1. Una aplicación que tenga la creación de un objeto de esta clase
6.2. Indicar (registrar) el objeto explícitamente como objeto remoto
La clase StartRemoteObject hace exactamente estas dos cosas:
/*
* StartRemoteObject.java
* Starts the remote object. More specifically:
*
1) Creates the object which has the remote methods to be invoked
*
2) Registers the object so that it becomes avaliable
*/
import java.rmi.registry.Registry;
import java.rmi.Naming;
/* REGISTRY_PORT
/* rebind
*/
*/
public class StartRemoteObject
{
public static void main (String args[])
{
try{
/* Create ("start") the object which has the remote method */
RemoteClass robject = new RemoteClass();
/* Register the object using Naming.rebind(...) */
String rname = "//localhost:" + Registry.REGISTRY_PORT + "/remote";
Naming.rebind(rname, robject);
} catch (Exception e) {
System.out.println("Hey, an error occurred at Naming.rebind");
e.printStackTrace();
System.out.println(e.getMessage());
}
}
}
La creación del objeto es estándar:
RemoteClass robject = new RemoteClass();
Registrar un objeto en realidad es asociar el objeto a una URL:
String rname = "//localhost:" + Registry.REGISTRY_PORT
Naming.rebind(rname, robject);
+ "/remote";
rname es un String que debería tener el formato de URL:
//host:port/dir
Y el número de puerto es provisto (estándar) por Registry
7. Con la interface y las dos clases de Java anteriores se tiene el “lado del servidor”
Programación Distribuida y Tiempo Real – Notas de Clase
8. Para el “lado del cliente”, se necesita una aplicación que:
8.1. Obtenga una referencia al objeto sobre el cual hacer RMI
8.2. Efectivamente haga la invocación
La clase AskRemote hace exactamente estas dos cosas:
/*
* AskRemote.java
*
a) Looks up for the remote object
*
b) "Makes" the RMI
*/
import java.rmi.Naming;
import java.rmi.registry.Registry;
/* lookup
/* REGISTRY_PORT
*/
*/
public class AskRemote
{
public static void main(String[] args)
{
/* Look for hostname and msg length in the command line */
if (args.length != 1)
{
System.out.println("1 argument needed: (remote) hostname");
System.exit(1);
}
try {
String rname = "//" + args[0] + ":" + Registry.REGISTRY_PORT + "/remote";
IfaceRemoteClass remote = (IfaceRemoteClass) Naming.lookup(rname);
int bufferlength
byte[] buffer
= 100;
= new byte[bufferlength];
remote.sendThisBack(buffer);
System.out.println("Done");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Más específicamente: la obtención de la referencia se efectiviza con
RemoteMethod remote = (RemoteMethod) Naming.lookup(rname);
(notar el uso del String-URL, no creación de obj.). Y luego, la llamada remota es
remote.sendThisBack(buffer);
9. Para compilar todo
> javac *.java
Programación Distribuida y Tiempo Real – Notas de Clase
10. Para ejecutar el servidor
> rmiregistry &
> java StartRemoteObject
10.1. rmiregistry es el proceso que efectivamente realiza el registro, es decir:
10.1.1. El que contiene la referencia a partir de que en el servidor se ejecuta
Naming.rebind(rname, robject);
10.1.2. El que “responde” al requerimiento de búsqueda de la referencia al
objeto cuando se ejecuta en el cliente
Naming.lookup(rname);
11. Para ejecutar el cliente (en otra terminal)
> java AskRemote localhost
12. Preguntas inmediatas
12.1. ¿Qué tiene que ser necesariamente conocido en cada lado?
12.2. ¿Podrían haber clases que se desconozcan?
13. Otras preguntas: Transparencia
13.1. ¿Qué pasa con los parámetros?
14. Otras preguntas: Concurrencia
14.1. ¿Pueden existir invocaciones concurrentes?
14.2. ¿Pueden existir dos métodos concurrentes?
14.3. ¿Se puede controlar la concurrencia?
15. Otras preguntas: clases involucradas
15.1. Descarga dinámica de clases
15.2. Sin llegar a reflection o creación dinámica de clases
Programación Distribuida y Tiempo Real – Notas de Clase