Práctica 4. Objetos remotos. Java RMI

SCS, 2010/11


Índice General

Ejercicio 1: Compilación y uso de objetos remotos en Java RMI

Se mostrará el un ejemplo simple de creación de objetos remotos en Java RMI.

Se usará el código de ejemplo que implementa una ''calculadora remota'' comentado en los apuntes de la asignatura.

Descarga: rmi1.tar.gz rmi1.zip

El código de partida incluye:

Compilación

  1. Descomprimir el paquete.
    $ tar xzvf rmi1.tar.gz
    $ cd rmi1
    

  2. Compilar el interfaz remoto
    $ javac Calculadora.java
    

  3. Compilar la implementación y el cliente

    Nota: es necesario copiar el fichero .class del interfaz al directorio cliente

    $ cp Calculadora.class cliente
    $ cd cliente
    $ javac EjemploCliente.java
    

  4. Compilar el servidor

    Nota: es necesario copiar el fichero .class del interfaz al directorio servidor

    $ cd ..
    $ cp Calculadora.class 
    $ cd  servidor
    $ javac CalculadaraImpl.java
    $ javac EjemploServidor.java
    

Ejecución

Desde tres terminales distintos

  1. Lanzar el servicio de nombres rmiregistry
    $ rmiregistry &
    
    Queda a la espera en el puerto 1099

  2. Lanzar el servidor (queda a la espera)
    $ cd servidor
    $ java -Djava.rmi.server.codebase=file:///home/alumno/<...>/rmi1/servidor/  EjemploServidor     
      [también puede usarse EjemploServidor2]
    
    Se debe especificar la propiedad de la JVM java.rmi.server.codebase para que el rmiregistry y los clientes sepan de donde descargar los bytecodes (ficheros .class) del stub

    En este caso se indica un directorio local (file://....)

  3. Ejecutar el cliente
    $ cd cliente
    $ java EjemploCliente
    

Comentarios

Si el cliente hubiera sido compilado y ejecutado en una versión de Java (compilador + máquina virtual) anterior a la 1.5, hubiera sido necesario generar la clase DiccionarioImpl_Stub con el compilador rmic

Se puede ejecutar rmic para comprobar cómo sería el código de ese stub

$ cd servidor
$ rmic -keep CalculadoraImpl
La opción -keep fuerza que se genere el fichero .java

Ejercicio 2: Uso de ''factorias'' de objetos remotos

En ocasiones no es necesario (ni razonable) que todo objeto remoto de una aplicación esté registrado junto con su nombre en el servidor remiregistry. Normalmente esto es así en aplicaciones donde se maneje gran número de objetos (objetos Cliente y Artículo de un sistema empresarial, objeto CuentaCorriente en un sistema bancario)

En esos casos es habitual aplicar el patrón de diseño Factoria

En este ejercicio se verá una versión simplificada del patrón Factoria que gestiona la creación de objetos remotos para acceso a diccionarios, similares a los usados en la práctica 2.

Se manejarán 2 interfaces remotos distintos, junto con una clase de implementación para cada uno de ellos.

Se parte de un código de ejemplo con una implementación de los diccionarios remotos y una implementación parcial del gestor de diccionarios.

Descarga: rmi2.tar.gz rmi2.zip

Pasos a seguir

  1. Descomprimir el paquete.
    $ tar xzvf rmi2.tar.gz
    $ cd rpc2
    

  2. Contenido

Tareas a realizar

Se pide implementar los métodos factoria de GestorDiccionariosImpl del fichero servidor/GestorDiccionarios.java (ver el código para más detalles)

Pasos para compilación (una vez implementado):

  1. Compilar interfaces (ya está hecho)
    $ javac DiccionarioRemoto.java   
    $ javac GestorDiccionarios.java
    

  2. Compilar implementaciones y compilar el servidor
    $ cp DiccionarioRemoto.class servidor
    $ cp GestorDiccionarios.class servidor
    $ cd servidor
    $ javac DiccionarioRemotoImpl.java 
    $ javac GestorDiccionariosImpl.java
    $ javac Servidor.java
    

  3. Compilar el cliente
    $ cp DiccionarioRemoto.class cliente
    $ cp GestorDiccionarios.class servidor
    $ cd cliente
    $ javac Cliente.java
    

Pasos para ejecución (una vez compilado) [usar 3 terminales]: Desde tres terminales distintos

  1. Lanzar el servicio de nombres rmiregistry [si no estaba lanzado]
    $ rmiregistry &
    
    Queda a la espera en el puerto 1099

  2. Lanzar el servidor (queda a la espera)
    $ cd servidor
    $ java -Djava.rmi.server.codebase=file:///home/alumno/<...>/rmi2/servidor/  Servidor
    
  3. Ejecutar el cliente (indicando el uso del fichero de políticas de seguridad nueva.policy)
    $ cd cliente
    $ java -Djava.security.policy=nueva.policy Cliente localhost
    

Documentación a entregar



ribadas 2011-01-11