Invocación Remota de Métodos (RMI)

En un escenario del mundo real donde se desarrollara un servicio como el del motor de c�lculo, un desarrollador querr�a crear un fichero JAR que contenga los interfaces Compute y Task para que los implementan las clases servidor y para que los utilicen los programas clientes.

Luego, un desarrollador (quiz�s el mismo que creo el fichero JAR con los interfaces) escribir�a una implementaci�n del interface Compute y desarrollar�a ese servicio en una m�quina disponible para los clientes.

Los desarrolladores de los programas clientes pueden utilizar los interfaces Compute y Task (contenidos en el fichero JAR) e independientemente desarrollar una tarea y un programa cliente que utilice un servicio Compute.

En esta p�gina, aprenderemos c�mo crear un fichero JAR, las clases del servidor, y las clases del cliente. Veremos como la clase Pi ser� descargada al servidor durante la ejecuci�n. Tambi�n veremos como el stub remoto ComputeEngine ser� descargado desde el servidor hasta el cliente durante la ejecuci�n.

El ejemplo separa los interfaces, la implementaci�n de los objetos remotos y el c�digo del cliente en tres paquetes diferentes.

  • compute (Los interfaces Compute y Task)
  • engine (Implementaci�n de la clase, el interface y el stub de ComputeEngine)
  • client (la implementaci�n del cliente ComputePi y de la tarea Pi)

Primero construiremos el fichero JAR para proporcionar los interfaces del servidor y del cliente a los desarrolladores.

.�Construir un Fichero JAR con las Clases de Interfaces

Primero necesitamos compilar los ficheros fuente de los interfaces del paquete compute que construir un fichero JAR que contenga los ficheros class. Supongamos que el usuario waldo ha escrito estos interfaces particulares y ha situado los ficheros fuente en c:\home\waldo\src\compute (en UNIX ser�a, /home/waldo/src/compute). Con estos paths podemos utilizar los siguientes comandos para compilar los intefaces y crear el fichero JAR.

Detalles espec�ficos de la Plataforma: Construir un Fichero JAR

Windows.

cd c:\home\waldo\src
javac compute\Compute.java 
javac compute\Task.java
jar cvf compute.jar compute\*.class

UNIX.

cd /home/waldo/src
javac compute/Compute.java 
javac compute/Task.java
jar cvf compute.jar compute/*.class

El comando jar muestra la siguiente salida (debido a la opci�n -v).

added manifest
adding: compute/Compute.class (in=281) (out=196) 
    	(deflated 30%)
adding: compute/Task.class (in=200) (out=164) 
    	(deflated 18%)

Ahora podemos distribuir el fichero compute.jar a los desarrolladores de las aplicaciones del cliente y del servidor para que puedan hacer uso de los interfaces.

En general, cuando cosntruimos las clases del servidor o del cliente con los compiladores javac y rmic, necesitaremos especificar donde deber�an residir los ficheros de clase resultantes para que sean accesibles a la red. En este ejemplo, esta localizaci�n es, para Unix, /home/user/public_html/classes porque algunos servidores web permiten el acceso a public_html mediante una URL HTTP construida como http://host/~user/. Si nuestro servidor web no soporta esta convenci�n, podr�amos utilizar un fichero URL en su lugar. El fichero de URL toma la forma file:/home/user/public_html/classes/ en UNIX, o file:/c:\home\user\public_html\classes/ en Windows. Tambi�n se puede seleccionar otro tipo de URL apropiado.

La accesibilidad en la red de los ficheros de clases permite al sistema RMI descargar c�digo cuando sea necesario. En vez de definir su propio protocolo para descargar c�digo, RMI utiliza un protocolo URL soportado por Java (por ejemplo, HTTP) para descargar el c�digo. Observa que un servidor web completo y poderoso no necesita realizar esta descarga de fichero class. De hecho, un sencillo servidor HTTP proporciona toda la funcionalidad necesaria para hacer que las clases est�n disponibles para su descarga en RMI mediante HTTP, puedes encontrar uno en.

ftp://java.sun.com/pub/jdk1.1/rmi/class-server.zip

.�Construir las Clases del Servidor

El paquete engine s�lo contiene la implementaci�n de la clase del lado del servidor, ComputeEngine, la implementaci�n del objeto remoto del interface Compute. Como ComputeEngine es una implementaci�n de un interface remoto, necesitamos generar un stub para el objeto remoto para que los clientes puedan contactar con �l.

Digamos que, ana, la desarrolladora de la clase ComputeEngine, ha situado ComputeEngine.java en el directorio c:\home\ana\src\engine, y ha colocado el fichero class para que lo usen los clientes en un subdirectorio de su directorio public_html, c:\home\ana\public_html\classes (en UNIX podr�a ser /home/ana/public_html/classes, accesible mendiante alg�n servidor web como http://host/~ana/classes/).

Asumamos que el fichero compute.jar esta localizado en el directorio c:\home\ana\public_html\classes. Para compilar la clase ComputeEngine, nuestro path de clases debe incluir el fichero compute.jar y el propio directorio fuente.

Una nota sobre el path de clases:

Normalmente, recomendamos seleccionar el path de clases en la linea de comandos utilizando la opci�n -classpath. Sin embargo, por varias razones, este ejemplo utiliza la variable de entorno CLASSPATH (porque tanto javac como rmic necesitan un path de clases y la opci�n -classpath se trata de forma diferente en el JDK 1.1 y el JDK 1.2). Recomendamos que no selecciones el CLASSPATH en un fichero de login o de arranque y que los desactives despu�s de haber terminado con este ejemplo.

Para m�s informaci�n sobre CLASSPATH puedes visitar http://java.sun.com/products/jdk/1.2/docs/install.html

Aqu� podemos ver c�mo seleccionar la variable de entorno CLASSPATH.

Detalles Espec�ficos de la Plataforma: Selecionar el CLASSPATH

Windows.

set CLASSPATH=c:\home\ana\src;c:\home\ana\public_html\classes\compute.jar

Unix:

setenv CLASSPATH /home/ana/src:/home/ana/public_html/classes/compute.jar

Ahora compilamos el fichero fuente ComputeEngine.java y generamos un stub para la clase ComputeEngine y coloca el stub accesible a la red. Para crear el stub (y opcionalmente los ficheros esqueleto) ejecutamos el compilador rmic sobre los nombres totalmente cualificados de las clases de implementaci�n de los objetos remotos que deber�an encontrarse en el path de clases. El comando rmic toma uno o m�s nombres de clase como entrada y produce, como salida, ficheros de clases con la forma ClassName_Stub.class (y opcionalmente ClassName_Skel.class). El fichero esqueleto no ser� generado si llamamos a rmic con la opci�n -v1.2. Esta opci�n s�lo deber�a utilizarse si todos nuestros clientes van a utilizar el JDK 1.2 o posterior.

Detalles Espec�ficos de la Plataforma: Compilar el Motor de C�lculo y sus Stubs

Windows.

cd c:\home\ana\src
javac engine\ComputeEngine.java
rmic -d . engine.ComputeEngine
mkdir c:\home\ana\public_html\classes\engine
cp engine\ComputeEngine_*.class
    c:\home\ana\public_html\classes\engine

Unix.

cd /home/ana/src
javac engine/ComputeEngine.java
rmic -d . engine.ComputeEngine
mkdir /home/ana/public_html/classes/engine
cp engine/ComputeEngine_*.class
    /home/ana/public_html/classes/engine

La opci�n -d le dice al compilador rmic que situe los ficheros de clases generados, ComputeEngine_Stub y ComputeEngine_Skel, en el directorio c:\home\ana\src\engine. Tambi�n necesitamos poner estos ficheros accesibles en la red, por eso debemos copiarlos en el �rea public_html\classes.

Como el stub de ComputeEngine implementa el interface Compute, que referencia al interface Task, tambi�n necesitamos poner estas clases disponibles en la red. Por eso, el paso final es desempaquetar el fichero compute.jar en el directorio c:\home\ann\public_html\classes para hacer que los interfaces Compute y Task est�n disponibles para su descarga.

Detalles Espec�ficos de la Plataforma: Desempaquetar el Fichero JAR

Windows.

cd c:\home\ana\public_html\classes
jar xvf compute.jar

Unix.

cd /home/ana/public_html/classes
jar xvf compute.jar

El comando jar muestra esta salida.

created: META-INF/
extracted: META-INF/MANIFEST.MF
extracted: compute/Compute.class
extracted: compute/Task.class

.�Construir las clases del Cliente

Asumamos que el usuario jones ha creado el c�digo del cliente en el directorio c:\home\jones\src\client y colocar� la clase Pi (para que sea descargada por el motor de c�lculo) en el directorio accesible a la red c:\home\jones\public_html\classes (tambi�n disponible mediante algunos servidores como http://host/~jones/classes/). Las dos clases del lado del cliente est�n contenidas en los ficheros Pi.java y ComputePi.java en el subdirectorio client.

Para construir el c�digo del cliente, necesitamos el fichero compute.jar que contiene los interfaces Compute y Task que utiliza el cliente. Digamos que el fichero compute.jar est� situado en c:\home\jones\public_html\classes. Las clases del cliente se pueden construir as�.

Detalles Espec�ficos de la Plataforma: Compilar el Cliente

Windows:

set CLASSPATH=c:\home\jones\src;c:\home\jones\public_html\classes\compute.jar
cd c:\home\jones\src
javac client\ComputePi.java
javac -d c:\home\jones\public_html\classes client\Pi.java

UNIX.

setenv CLASSPATH /home/jones/src:/home/jones/public_html/classes/compute.jar
cd /home/jones/src
javac client/ComputePi.java
javac -d /home/jones/public_html/classes client/Pi.java

S�lo necesitamos situar la clase Pi en el directorio public_html\classes\client (el directorio client lo crea el javac si no existe). Esto es as� por esta clase es la �nica que necesita ser desacargada por la m�quina virtual del motor de c�lculo.

Ahora podemos ejecutar el servidor y luego el cliente.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO