Download JAVA RMI (REMOTE METHOD INVOCATION)

Document related concepts
no text concepts found
Transcript
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 aplicación distribuida Java se
comunican
24/10/2005
2
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.
24/10/2005
3
Java
Java RMI
zConstrucción de una aplicación distribuida
paso a paso
{1. Escribir el código 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 código del cliente y del servidor
{3. Iniciar el registro RMI y el servidor
24/10/2005
4
Java
Java RMI
zEjemplo: HelloWorld! con Servidor
Remoto
{Definición 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 métodos remotos tienen que tener la posibilidad de lanzar
la excepción RemoteException
import java.rmi.RemoteException;
public interface Hello extends Remote{
String sayHello() throws RemoteException;
}
24/10/2005
5
Java
Java RMI- objeto remoto
z Implementación 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
... Continuación ->
{Implementación 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 código
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
8
Java
Java RMI - cliente
z 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();
}
}
24/10/2005
9
Java
Java RMI –Compilación
zCompilar 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:
grant {
permission java.security.AllPermission;
24/10/2005
};
10
Java
Java RMI - Ejecución
z Iniciar el registro de Java (si no se inicia desde
código)
{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 Especificación 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
{ Implementación de una interfaz remota
z Extendiendo de java.rmi.server.UnicastRemoteObject Æ Creación de un objeto
remoto que se ejecuta continuamente
z Extendiendo 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ón
z Paso de objetos remotos
z Paso de objetos locales
z Transmisión de datos
{ Registro y Localización 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 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:
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
Implementación de una interfaz remota
z Las 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 UnicastRemoteObject
{ La 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
24/10/2005
15
Java
Java RMI
Paso de Parámetros en RMI
z Un 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.Serializable
z Las clases de los parámetros o valor de retorno que no están
localmente se descargan de forma dinámica durante la ejecución
z Paso de parámetros no remotos
{ Estos parámetros se pasan como valor
{ Si es un parámetro 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 parámetros remotos
{ Objeto remoto exportado: se envía la referencia del stub del objeto
{ Objeto remoto no exportado: se envía la referencia al objeto remoto
z Clase Annotation
{ El 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
24/10/2005
16
Java
Java RMI
Registro y Localización de Objetos Remotos
{Se realiza utilizando la clase java.rmi.Naming
{Los 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
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
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 URLs
registradas.
18
Java
Java RMI
RMI Stubs y Skeletons
z Stub: 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 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 conexión con la JVM remota que contiene el objeto remoto
Escribe (serializa) y transmite los parámetros a la JVM remota
Espera los resultados de la invocación 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 serialización y comunicación a través 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 implementación del
objeto remoto
{ Los pasos que realiza son:
z Lee (deserializa) los parámetros del método remoto
z Invoca el método en la implementación del objeto remoto
z Escribe (serializa) y transmite el resultado
z En la versión Java 2 se ha introducido un protocolo stub
adicional 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
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 explícitamente el registro desde la línea de
comando con el comando rmiregistry.
z 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.
z 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.
24/10/2005
21
Java
Java RMI
Interfaz java.rmi.Registry
z Proporciona métodos 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 métodos
z getRegistry(): 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.
z Estos métodos estarán sobrecargados para obtener/crear el registro
proporcionando de forma opcional el nombre de la máquina y el puerto
24/10/2005
22