Está en la página 1de 7

CORBA desde Java

Diego Sevilla Ruiz


Sistemas Distribuidos

Indice
1. Introducci
on

2. Primeros pasos
2.1. Fichero IDL . .
2.2. Cliente . . . . .
2.3. Implementaci
on
2.4. El servidor . .

1
1
2
3
5

. .
. .
del
. .

. . . . .
. . . . .
servant
. . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

3. Ejecuci
on

1.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

Introducci
on

Este documento explica los primeros pasos para usar CORBA desde Java. Primero se
describe un ejemplo sencillo y luego se ofrece un cliente Java para el servidor visto en
C++. Con cualquier JDK se pueden realizar los ejemplos propuestos.

2.

Primeros pasos

Para comprender el funcionamiento de CORBA desde Java, introduciremos un ejemplo


sencillo de una aplicaci
on que define un IDL, un cliente y un servidor.

2.1.

Fichero IDL

El fichero IDL, Calculadora.idl es el siguiente:


1

module prueba
{
interface Calculadora
{
double add ( in double x , in double y ) ;
double substract ( in double x , in double y ) ;
double multiply ( in double x , in double y ) ;

double divide ( in double x , in double y ) ;


void storeMemory ( in double x ) ;
double readMemory () ;

};

11

};

Las funciones son las normales de una calculadora, como se puede ver.
Para generar los stubs y skeletons, hay que ejecutar el compilador de IDL. Lo ejecutamos con la opci
on ((-fall)), para que genere tanto los stubs como los skeletons:
$ idlj -fall Calculadora.idl
Esto genera los ficheros de stub y skeleton dentro del subdirectorio ((prueba)):
$ ls prueba -C1
CalculadoraHelper.java
CalculadoraHolder.java
Calculadora.java
CalculadoraOperations.java
CalculadoraPOA.java
_CalculadoraStub.java

2.2.

Cliente

A continuaci
on se muestra el cliente (Cliente.java): Es un programa que es capaz
de utilizar el objeto Calculadora:
package prueba ;
2

import prueba .*;


import org . omg . CORBA .*;
import java . io .*;

10

12

14

public class Cliente


{
public static void main ( String args [])
{
try {
// Iniciar el ORB
org . omg . CORBA . ORB orb = org . omg . CORBA . ORB . init ( args , null ) ;

16

18

20

// Leer el IOR del fichero


File IORFile = new File ( " IOR " ) ;
FileReader reader = new FileReader ( IORFile ) ;
BufferedReader buf = new BufferedReader ( reader ) ;
String IOR = buf . readLine () ;

22

24

// Convertir el IOR en un objeto


org . omg . CORBA . Object o = orb . string_to_object ( IOR ) ;

Calculadora calc = CalculadoraHelper . narrow ( o ) ;


26

// Usar la calculadora
System . out . println ( calc . add (2.0 ,3.0) ) ;

28

} catch ( Exception e ) {
e . printStackTrace () ;
}

30

32

}
}

34

El cliente realiza las siguientes labores:


Lnea 3: Incluye el paquete con el stub para el tipo de objeto Calculadora.
Lnea 15: Se inicia el ORB. Normalmente, el ORB se implementa como una funcion
de librera. Esta llamada realiza todas las funciones de inicializacion para el ORB.
Lnea 24: Se utiliza la operacion del ORB string to object para convertir el
IOR dado en la lnea de comando como primer parametro en una referencia a un
objeto CORBA. Todos los objetos CORBA heredan de la interfaz CORBA::Object
(org.omg.CORBA.Object).
Lnea 25: El metodo narrow de la clase CalculadoraHelper (generado automaticamente) se utiliza para especializar la referencia obtenida a un objeto del tipo
especfico. En este caso Calculadora. La funcion devolvera en calc la referencia
especializada a un objeto de tipo Calculadora, o ((null)) si la conversion no se
puede realizar
Lnea 28: Se realiza la llamada propiamente dicha. La abstraccion proporcionada
por CORBA permite hacer una llamada al objeto remoto como si fuera un objeto
local. El resultado se imprime por la pantalla.

2.3.

Implementaci
on del servant

Para implementar un objeto CORBA, esto es, para ofrecer sus servicios al mundo, se
tienen que implementar dos cosas:
El servant que contiene la implementacion de los metodos del interfaz que se ofrece
al exterior,
y un servidor, que quedar
a esperando conexiones en un puerto IP.
El servant es simplemente un objeto del lenguaje de programacion (en este caso Java)
que implementa la funcionalidad de los metodos del objeto CORBA. Este servant es
llamado por el skeleton cuando un cliente llama a un metodo del objeto CORBA implementado por ese servant. El c
odigo del servant es el que se muestra a continuacion. Se
ha implementado las funciones de la calculadora en el fichero CalculadoraImpl.java:

package prueba ;
2

class CalculadoraImpl extends CalculadoraPOA


{
private double memory_ ;

public CalculadoraImpl ()
{
memory_ = 0;
}

10

public double add ( double x , double y )


{
return x + y ;
}

12

14

16

public double substract ( double x , double y )


{
return x - y ;
}

18

20

public double multiply ( double x , double y )


{
return x * y ;
}

22

24

26

public double divide ( double x , double y )


{
double result = 0;

28

30

try {
result = x / y ;
} catch ( Exception e )
{
}

32

34

36

return result ;
38

40

public void storeMemory ( double x )


{
memory_ = x ;
}

42

44

public double readMemory ()


{
return memory_ ;
}

46

48

De destacar en este fichero es:


El servant se implementa en una clase CalculadoraImpl. Todas las clases servant

heredan de la clase ((<interfaz>POA)).


El interfaz de ese objeto, salvo algunos metodos adicionales que se explican en la
teora de la asignatura, sigue el definido en el IDL.

2.4.

El servidor

En cualquier aplicaci
on CORBA debe existir un servidor que quede esperando las
peticiones sobre los objetos CORBA implementados por el (servants). El servidor es un
programa Java normal que dejar
a activado un servant para el objeto CORBA.
1

package prueba ;

import org . omg . CORBA .*;


import org . omg . PortableServer .*;

public class Servidor


{
public static void main ( String [] args )
{
try {

11

13

15

// Iniciar el ORB
org . omg . CORBA . ORB orb = org . omg . CORBA . ORB . init ( args , null ) ;
// Objeto auxiliar
org . omg . CORBA . Object o ;

17

19

21

23

// Encontrar el POA ra
z
POA rootPOA ;
o = orb . r e s o l v e _ i n i t i a l _ r e f e r e n c e s ( " RootPOA " ) ;
rootPOA = POAHelper . narrow ( o ) ;
// Activar el POA
rootPOA . the_POAManager () . activate () ;

25

// Crear el objeto implmentaci


on
27

29

31

prueba . CalculadoraImpl calcImpl =


new prueba . CalculadoraImpl () ;
// Registrarlo en el POA
o = rootPOA . servant_to_reference ( calcImpl ) ;

33

35

37

39

41

prueba . Calculadora calc =


prueba . CalculadoraHelper . narrow ( o ) ;
// Producir la direcci
o n del objeto
String ior = orb . object_to_string ( calc ) ;
System . out . println ( ior ) ;
// Esperar llamadas
orb . run () ;

43

} catch ( Exception e )
{
e . printStackTrace () ;
}

45

47

}
}

49

El servidor contiene casi toda la carga de la dificultad de la programacion con CORBA.


Las tareas que implementa el servidor son las siguientes:
Lnea 13: El ORB se inicia como en el cliente.
Lneas 1924: Se obtiene el POA raz. El objeto servidor se tiene que registrar en
un adaptador de objetos (OA). En CORBA, el POA es el adaptador de objetos,
que se puede configurar como una jerarqua. En este caso, registraremos el objeto
en el POA raz (RootPOA). Para la mayora de los usos, este adaptador de objetos
es suficiente. Se obtiene el POA Manager. Este manager controla a un conjunto
de adaptadores de objetos, permitiendoles funcionar, o bien encolar las peticiones
o rechazarlas. Finalmente, se activa el POAManager.
Lnea 29: Se crea un objeto servant CalculadoraImpl.
Lnea 32: Se utiliza el metodo servant to reference del POA para obtener una
referencia CORBA a partir de un servant.
Lnea 35: La referencia se convierte a una referencia de un interfaz Calculadora.
Este paso no es necesario, se muestra por completitud.
Lnea 38: La referencia se convierte en una cadena de caracteres con la funcion del
ORB object to string.
Lneas 4352: La referencia en formato cadena de caracteres se imprime por pantalla.
Lnea 42: El ORB se pone a funcionar (esperar peticiones). con la funcion run del
ORB. El servidor queda as esperando las peticiones de los clientes.

3.

Ejecuci
on

Una tpica ejecuci


on del programa podra ser la siguiente:
$ java prueba.Servidor | tee IOR
IOR:000...
$ cat IOR
IOR:000...

$ java prueba.Cliente
5.0

También podría gustarte