RMI = Remote Method Invocation
Una aplicación RMI distribuida consta de dos componentes:
-
RMI Server (Servidor)
-
RMI Client (Cliente)
El RMI server es el que contiene los métodos que son invocados remotamente. El server crea varios objetos y referencia a estos objetos en el registro del RMI.
El registro del RMI es un servicio que corre del lado del RMI server. Los objetos que son creados remotamente por el servidor son registrados por objetos con nombre únicos en este registro.
Entonces el cliente obtiene la referencia de uno o más objetos que han sido creados remotamente del registro del RMI, luego el cliente invoca los métodos de los objetos remotos para acceder a estos servicios.
Una vez el cliente obtiene la referencia del objeto remoto, el método en el objeto remoto es invocado como si fueran locales, en realidad no se puede diferencia si los objetos son accedidos remota o localmente en los objetos del cliente.
Mis Comentarios: En este punto de la lectura, lo único que se me viene a la mente es un webservices, como los de .Net, solo que de manera más complicada, pero hay que recordar que los webservices de .Net quedaron en países desarrollados por decirlo así obsoletos, es por eso que salió WCF, que viene a implementar mucha mas funcionalidad a los webservices de .Net, entonces podría suponer que debido a que en java todo sale antes, utilizando esta manera de acceder a los objetos podríamos tener un mejor control sobre nuestra aplicación mejor o similar (apuesto a que mejor) a la obtenida con WCF en .Net
La Arquitectura del RMI
La arquitectura RMI consiste de tres capas:
-
La capa Stub (Cliente) /Skeleton (Server)
-
La capa de RRL (Remote Reference Layer)
-
La capa de Transport
La capa de Stub/Skeleton
Esta capa es la que escucha los métodos llamados remotamente hechos por el cliente y re direcciona estas llamadas a los servicios del RMI en el servidor, esta capa consiste de un stub y del skeleton.
Para invocar a los métodos de los objetos remotos, el request (pedido) en el lado del cliente empieza en el stub.
El stub es proxy del cliente que representa el objeto remoto.
Este es referenciado por el programa como si fuera cualquier otro método local que está corriendo.
El stub comunica el método al objeto remoto a través del skeleton que es implementado en el servidor.
El skeleton es el proxy del lado del servidor que continua la comunicación con el stub:
-
Lee los parámetros para el método llamado.
-
Hace una llamada al servicio remoto.
-
Acepta el valor que retorna
-
Escribe el valor retornado de regreso al stub.
La capa RRL(Remote Reference layer)
La capa RRL es la que interpreta y maneja las referencias hechas por el cliente al objeto remoto en el servidor. Esta capa está presente en el lado del cliente, así como en la del servidor.
La RRL en el lado del cliente recibe un request para los métodos del stub que son transferidos encriptados como una cadena de datos del RRL hacia el lado del servidor. Los datos son transferidos a través de la red. La capa RRL del lado del servidor desencripta los parámetros que son enviados remotamente a través del skeleton, esto lo hace para que estén en el formato para que pueda entenderlo el skeleton.
Mientras retorna el valor del skeleton, la data es de nuevo encriptado y comunicada hacia el cliente a través de la capa RRD del lado del servidor.
La capa Transport (Transporte)
La capa de transport es un enlace entre el RRL de el lado del servidor hacia el RRL de lado del cliente. La capa de transport es responsable de crear una nueva conexión y manejar las conexiones existentes.
También es responsable de manejar los objetos remotos que residen en el espacio de la capa de transport.
Los siguientes pasos explican como el cliente es conectado hacia el servidor:
-
Una vez recibido el request del RRL del lado del cliente, la capa de transport establece un socket de conexión al servidor a través del RRL del lado del servidor.
-
Entonces, la capa transport pasa la conexión establecida hacia el RRL del lado del cliente y añade u referencia remota a la conexión en esta tabla.



Hay unas cosas por aclarar, RMI y Web Services son dos cosas distintas, el analogo en .Net seria .Net Remoting ya que estas tecnologias van de la mano con la plataforma usada. WCF por otro lado es la tecnologia que saco Microsoft con el fin de seguir un estandar de los servicios web
Tenes razon, gracias por dar tu opinion.
Aclaro tambien que rmi solo funciona para una red(No puedo acceder a un servcio desde otra red con rmi) a diferencia de los web services que funcionan en internet.
Una consulta, cuando yo expongo un servicio a traves de RMI, si no me equivoco, por defecto le asigna el puerto 1099 o puedo asignarle el que yo quiera. Si quiero en el mismo host exponer otro servicio, tengo que usar otro puerto?
O el puerto 1099 es donde escucha el registro de RMI?
Pregunto porque tengo diferentes servicios de una misma aplicacion que quiero que se acceda por RMI y tengo que permitir el acceso a todos.
O deberia hacer un servicio despachador unico , que se exponga por RMI en un puerto xxx, que reciba las peticiones y las derive al servicio que corresponda?
En primer lugar, no te equivocas, ese es el puerto default.
Si quieres usar otro host, no tienes que usar otro puerto, puede únicamente crear otro servicio con el mismo puerto.
En segundo, aunque ese es el puerto default puedes cambiarlo.
Aquí te dejo un ejemplo de como tendrías que hacer si solo utilizar un puerto.
Creo que tendrías que configurarlo así en el servidor:
Servidor:
FileRemote f = new FileRemoteImpl(“FServer”);
Naming.rebind(“rmi://198.168.0.52/FServer”, f);
Cliente:
String str = “rmi://AQUI_HOST_O_IP/FServer”;
FileRemote f = (FileRemote)Naming.lookup(str);
//Y de ahí sigues
Cualquier duda ya sabes.
No viene al tema pero… alguna ayuda sobre el uso de webservices y soap con xmly jsp, aunque lo tengo que hacer en delphi poruqe mi profesor dice que en .net y java hay mucha info igual no las encuentro
Bueno, la pagina oficial es http://java.sun.com/webservices/
Un tutorial en espanol, para crear un webservice en java y accederlo desde .net
http://www.elguille.info/colabora/puntoNET/bcapuano_Crear_WebService_en_Java_e_invocarlo_desde_Net.htm
otra en espanol muy util.
http://www.programacion.com/java/tutorial/servic_web/