jueves, marzo 16, 2006

RMI - Compilación y ejecución

El código que he utilizado para mis pruebas con RMI es el que está en el tutorial de Java de Sun en la sección correspondiente al Trail: RMI.

El primer punto a tener en cuenta es que no conviene utilizar rutas con espacios en blanco. Si estamos trabajando con una ruta como por ejemplo "D:\Documents and settings\e88815a\My documents\Proyectos\PruebasRMI", es mejor que copiemos todo a "D:\Proyectos\PruebasRMI".

Empezamos cambiándonos al directorio en el que está el proyecto.
cd D:\Proyectos\PruebasRMI\src

Compilamos las clases del interfaz y
generamos un jar con las clases compiladas.
javac compute\Compute.java
javac compute\Task.java
jar cvf compute.jar compute\*.class

Compilamos la implementación del servidor.
set CLASSPATH=D:\Proyectos\PruebasRMI\src;D:\Proyectos\PruebasRMI\src\compute.jar
javac engine\ComputeEngine.java


Generamos el stub correspondiente a la clase creada (el rmic solo crea el stup no el skeleton).
rmic -d . engine.computeEngine

Compilamos el cliente.
javac client\ComputePi.java
javac client\Pi.java

Ejecutamos desde una nueva ventana en la que no esté definido el CLASSPATH el registro de RMI.
cd c:\jdk1.5.0_03\bin\
rmiregistry


Necesitamos tener el fichero java.policy con la información que se define en el tutorial en la ruta de las aplicaciones que vamos a ejecutar (
D:\Proyectos\PruebasRMI\src).

Desde otra ventana ejecutamos el servidor que hemos creado.
java -Djava.rmi.server.codebase=file:/D:\Proyectos\PruebasRMI\src/ -Djava.rmi.server.hostname=localhost -Djava.security.policy=java.policy engine.ComputeEngine

Nos tiene que mostrar el mensaje:
ComputeEngine bound

Y desde una última ventana ejecutamos el cliente.
set CLASSPATH=D:\Proyectos\PruebasRMI\src;D:\Proyectos\PruebasRMI\compute.jar
java -Djava.rmi.server.codebase=file:/D:\Proyectos\PruebasRMI\src/ -Djava.security.policy=java.policy client.ComputePi localhost 20


Cuya salida será el valor de PI.
3.14159265358979323846

Si sale el valor de PI es que ha funcionado y desde el cliente se ha invocado el método de RMI correspondiente obteniendo el resultado adecuado.