RMI
RMI (Java Remote Method Invocation)
es un mecanismo ofrecido por Java para invocar un mtodo
de manera remota.
Forma parte del entorno estndar de ejecucin de Java y
proporciona un mecanismo simple para la comunicacin de
servidores en aplicaciones distribuidas basadas
exclusivamente en Java.
Si se requiere comunicacin entre otras tecnologas debe
utilizarse CORBA o SOAP en lugar de RMI.
RMI - Ing. Orlando Pihue Montoya
RMI
RMI se caracteriza por la facilidad de su uso en la
programacin por estar especficamente diseado
para Java; proporciona paso de objetos por
referencia (no permitido por SOAP),
recoleccin de basura distribuida (Garbage
Collector distribuido) y paso de tipos arbitrarios
(funcionalidad no provista por CORBA).
RMI - Ing. Orlando Pihue Montoya
RMI
A travs de RMI, un programa Java puede exportar un
objeto, con lo que dicho objeto estar accesible a travs
de la red y el programa permanece a la espera de
peticiones en un puerto TCP. A partir de ese momento, un
cliente puede conectarse e invocar los mtodos
proporcionados por el objeto.
RMI - Ing. Orlando Pihue Montoya
Invocacin RMI
La invocacin se compone de los siguientes pasos:
Encapsulado de los parmetros (utilizando la funcionalidad
de serializacin de Java).
Invocacin del mtodo (del cliente sobre el servidor). El
invocador se queda esperando una respuesta.
Al terminar la ejecucin, el servidor serializa el valor de
retorno (si lo hay) y lo enva al cliente.
El cdigo cliente recibe la respuesta y contina como si la
invocacin hubiera sido local.
RMI - Ing. Orlando Pihue Montoya
Un servidor RMI consiste en definir un objeto remoto que va a
ser utilizado por los clientes. Para crear un objeto remoto, se
define una interfaz
La interfaz debe ser pblica.
Debe heredar de la interfaz [Link], para indicar que
puede llamarse desde cualquier mquina virtual Java.
Cada mtodo remoto debe lanzar la excepcin
[Link] en su clusula throws, adems de las
excepciones que pueda manejar.
RMI - Ing. Orlando Pihue Montoya
Ejemplo
public interface MiInterfazRemota extends [Link]
{
public void miMetodo1() throws [Link];
public int miMetodo2() throws [Link];
}
Implementar la interfaz remota
public class MiClaseRemota extends [Link] implements MiInterfazRemota {
public MiClaseRemota() throws [Link]
{ // Cdigo del constructor }
public void miMetodo1() throws [Link] {
// Aqu ponemos el cdigo que queramos
[Link]("Estoy en miMetodo1()");
}
public int miMetodo2() throws [Link] {
return 5; // Aqu ponemos el cdigo que queramos
}
public void otroMetodo() {
// Si definimos otro mtodo, ste no podra llamarse // remotamente al no ser de la interfaz remota
}
public static void main(String[] args) {
try {
MiInterfazRemota mir = new MiClaseRemota();
[Link]("//" + [Link]().getHostAddress() + ":" + args[0] +
"/PruebaRMI", mir);
} catch (Exception e) {
}
}
}
RMI - Ing. Orlando Pihue Montoya
set CLASSPATH=%CLASSPATH%;.\[Link];.
javac [Link]
rmic -d . MiClaseRemota
En el caso de Windows, se debe ejecutar:
start rmiregistry 1234
Y en el caso de Linux:
rmiregistry &
Por ltimo, se lanza el servidor:
java -[Link]=[Link] MiClaseRemota 1234
RMI - Ing. Orlando Pihue Montoya
Crear un cliente RMI
public class MiClienteRMI {
private MiClienteRMI(){};
public static void main(String[] args) {
try {
MiInterfazRemota mir =
(MiInterfazRemota)[Link]("//" + args[0] + ":" +
args[1] + "/PruebaRMI");
// Imprimimos miMetodo1() tantas veces como devuelva miMetodo2()
for (int i=1;i<=mir.miMetodo2();i++)
mir.miMetodo1();
} catch (Exception e)
{
[Link]();
}
}
}
Una vez que ya tenemos definido el cliente, para compilarlo
hacemos:
set CLASSPATH=%CLASSPATH%;.\[Link];.
javac [Link]
Luego, para ejecutar el cliente hacemos:
java MiClienteRMI [Link] 1234
RMI - Ing. Orlando Pihue Montoya
Resultado
RMI - Ing. Orlando Pihue Montoya