Está en la página 1de 8

CORBA desde Java

Diego Sevilla Ruiz


Sistemas Distribuidos

Indice
1. Introduccion
1
2. Primeros pasos
2.1. Fichero IDL . .
2.2. Cliente . . . . .
2.3. Implementacion
2.4. El servidor . .

. .
. .
del
. .

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

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

3. Ejecucion

1.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

1
1
2
3
5
6

Introduccion

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 aplicacion que define un IDL, un cliente y un servidor.

2.1.

Fichero IDL

El fichero IDL, Calculadora.idl es el siguiente:


1

module prueba
{
interf ac e Calcul ador a
{
doubl e add ( in doubl e x , in doubl e y) ;
doubl e sub strac t ( in double x , in double y ) ;
doubl e multiply ( in doubl e x , in doubl e y) ;

doubl e divide ( in doubl e x , in doubl e y) ;


void storeMemor y ( in double x ) ;
doubl e 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 opcion -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 continuacion se muestra el cliente (Cliente.java): Es un programa que es capaz


de utilizar el objeto Calculadora:
package pru eb a ;
2

impor t prueba .*;


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

10

12

14

publi c class Client e


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

16

18

20

// Leer el IOR del fi cher o


File IORFile = new File ( " IOR " );
Fi leReade r reade r = new Fil eRea de r ( IORFile ) ;
B uff ere dRea de r buf = new B uff e re d Re ad e r ( rea der ) ;
String IOR = buf . rea dLine () ;

22

24

// Converti r el IOR en un objeto


org . omg . CORBA . Object o = orb . st rin g_ to _o b j ec t ( IOR );

C al cul ador a calc = C al c ul ad o raH el pe r . narro w (o ) ;


26

// Usar la cal cul ador a


Syst em . out . p rintln ( calc . add (2.0 ,3.0) );

28

} catch ( E xceptio n e ) {
e . p ri nt S t ac kTra c e () ;
}

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 funci
on 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 autom
ati- camente) 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.

Implementacion 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 quedara 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 imple- mentado por ese servant. El codigo del servant es el que se muestra a
continuacion. Se ha implementado las funciones de la calculadora en el fichero
CalculadoraImpl.java:

package pru eb a ;
2

clas s C al cul adoraI m p l extend s C alculadora PO A


{
privat e double memory _ ;

public Ca lc u la d or a Imp l ()
{
memory _ = 0;

10

public doubl e add ( doubl e x , double y )


{
return x + y ;
}

12

14

16

18

public doubl e su bstra c t ( double x , doubl e y )


{
return x - y ;

20

public doubl e m ul ti pl y ( double x , doubl e y )


{
return x * y ;
}

22

24

26

public doubl e divide ( doubl e x , double y )


{
doubl e result = 0;

28

try {

30

result = x / y ;
} catch ( E xceptio n e )
{
}

32

34

return resul t ;

36

38

public void s toreMemor y ( double x )


{
memory_ = x ;
}

40

42

44

public doubl e readM em or y ()


{
return memo ry _ ;

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 aplicacion 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 dejara activado un servant para el objeto CORBA.
1

package pru eb a ;
import org . omg . CORBA .*;
impor t org . omg . Po rta b le S e rv e r .*;

public cl ass Servido r


{
public stati c void mai n ( St ring [] args )
{
try {

11

13

15

// Inicia r el ORB
org . omg . CORBA . ORB orb = org . omg . CORBA . ORB . init ( args , null );
// Objeto auxil i a r
org . omg . CORBA . Object o ;

17

19

21

23

// Encontra r el POA raz


POA rootPO A ;
o = orb . re so lv e _in it ia l_ re fe ren c e s ( " RootPOA " ) ;
rootPO A = P OAHelpe r . narrow ( o) ;
// Activa r el POA
ro otPOA . th e _P OAM an ag e r () . a ct iva te () ;

25

// Crear el objeto i mplm en taci on


27

29

31

prueba . C al cul adoraI m p l calcI mp l =


new prue ba . Ca l cu la do ra Imp l () ;
// Regi strarl o en el POA
o = rootPOA . s e rv an t_ to _ re fe ren c e ( cal cImp l ) ;

33

35

37

39

41

prueba . Calcul ador a calc =


prueba . Ca l cu la do ra He lp e r . narrow ( o) ;
// Produci r la di recci on del objeto
String ior = orb . ob je c t_ to _ st ri n g ( calc ) ;
Syst em . out . p rintln ( ior );
// Esperar ll am ada s
orb . run () ;

43

} catch ( E xceptio n e )
{
e . p ri nt S t ac kTra c e () ;

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
pan- talla.
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.

Ejecucion
Una tpica ejecucion 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