CORBA desde Java Diego Sevilla Ruiz Sistemas Distribuidos, 5 o
´Indice 1. Introdu Introducci cci´ ´ on on
1
2. Primeros pasos
1
2.1. 2.2. 2.3. 2.4.
Fichero IDL . . Cliente . . . . . Implemen Implementaci´ taci´ on El servidor . .
. . . . . . . . . . . . . . del servant . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1 2 3 5
3. Ejecuc Ejecuci´ i´ on on
6
4. Revisi Revisi´ on o ´n
7
1.
Intr Introdu oducc cci´ i´ on 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.
Prim Primer eros os paso pasoss
Para comprender el funcionamiento de CORBA desde Java, introduciremos un ejemplo sencillo de una aplicaci´on on que define un IDL, un cliente y un servidor.
2.1. 2.1.
Fich Ficher ero o IDL IDL
El fichero IDL, Calculadora.idl es el siguiente: 1
3
5
module prueba { interface Calculadora { double add( i n d o ub ub l e x , i n d o ub ub l e y ) ;
1
double s u b s t r a c t (i n d o ub l e x , i n d o ub l e y) ; double m u l t i p l y (i n d o ub l e x , i n d o ub l e y ); double d i v i d e (i n d o ub l e x , i n d o ub l e y ) ; void s t o r e M e m o r y (i n d o ub l e x ) ; double r e a d M e m o r y ( ) ;
7
9
};
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
4
import prueba.*; import o r g . o m g . C O R B A . * ; import java.io.*;
6
8
10
12
14
p u b l ic c l a ss Cliente { p u bl i c s t at i c v o id m a i n ( S t r i ng a r g s [ ] ) { tr y { / / I ni ci ar e l O RB o r g . o m g . C O R BA . O R B o r b = o r g . o m g . C O R BA . O R B . i n i t ( a r gs ,null ) ;
16
18
20
/ / L ee r e l I OR d el f ic he ro F i le I O RF i le = ne w File( " I O R ") ; F i l eR e ad e r r e ad e r = ne w F i l e R e a d e r ( I O R F i l e ) ; B u f fe r e dR e a de r b uf = ne w B u f f e r e d R e a d e r ( r e a d e r ) ; S t ri n g I OR = b uf . r e a dL i ne ( ) ;
22
2
/ / C on ve rt ir e l I OR e n u n o bj et o o r g . o m g . C O R BA . O b j e c t o = o r b . s t r i n g _ t o _o b j e c t ( I O R ) ; C a l c u l a do r a c a l c = C a l c u l a d o ra H e l p e r . n a r r o w ( o ) ;
24
26
/ / U s ar l a c a l cu l a do r a System.out.println(calc.add(2.0,3.0));
28
} catch ( E x ce pt io n e ) { e.printStackTrace(); }
30
32
} }
34
El cliente realiza las siguientes labores: L´ınea 3: Incluye el paquete con el stub para el tipo de objeto Calculadora . L´ınea 15: Se inicia el ORB. Normalmente, el ORB se implementa como una funci´on de librer´ıa. Esta llamada realiza todas las funciones de inicializaci´on para el ORB. L´ınea 24: Se utiliza la operaci´ o n del ORB string to object para convertir el IOR dado en la l´ınea de comando como primer par´ametro en una referencia a un objeto CORBA. Todos los objetos CORBA heredan de la interfaz CORBA::Object (org.omg.CORBA.Object ). L´ınea 25: El m´etodo narrow de la clase CalculadoraHelper (generado autom´ aticamente) se utiliza para especializar la referencia obtenida a un objeto del tipo espec´ıfico. En este caso Calculadora . La funci´on devolver´a en calc la referencia especializada a un objeto de tipo Calculadora , o null si la conversi´o n no se puede realizar ( (
) )
L´ınea 28: Se realiza la llamada propiamente dicha. La abstracci´on 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 implementaci´on de los m´etodos 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 programaci´on (en este caso Java) que implementa la funcionalidad de los m´ etodos del objeto CORBA. Este servant es llamado por el skeleton cuando un cliente llama a un m´etodo del objeto CORBA implementado por ese servant . El c´odigo del servant es el que se muestra a continuaci´on. Se ha implementado las funciones de la calculadora en el fichero CalculadoraImpl.java :
3
package prueba; 2
4
class CalculadoraImpl extends CalculadoraPOA { p r i v a te d o u b le memory_;
6
public C a l c u l a d o r a I m p l ( ) { m e mo r y_ = 0 ; }
8
10
p u b l ic d o u b le add( double x , double y) { return x + y ; }
12
14
16
p u b l ic d o u b le s u b s t r a c t (double x , double y) { return x - y ; }
18
20
p u b l ic d o u b le m u lt i pl y ( double x , double y) { return x * y ; }
22
24
26
p u b l ic d o u b le d i vi d e ( double x , double y ) { double r es ul t = 0 ;
28
30
tr y { r es ul t = x / y ; } catch ( E x c ep t io n e ) { }
32
34
36
return result; }
38
p u b l ic v o i d s t o r e M e mo r y ( double x ) { m em or y_ = x ; }
40
42
44
p u b l ic d o u b le r e a d M e m or y ( ) { return memory_; }
46
48
}
De destacar en este fichero es: El servant se implementa en una clase CalculadoraImpl . Todas las clases servant
4
heredan de la clase
.
POA))
( (
El interfaz de ese ob jeto, salvo algunos m´etodos adicionales que se explican en la teor´ıa 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
3
package prueba; import o r g . o m g . C O R B A . * ; import o r g . o m g . P o r t a b l e S e r v e r . * ;
5
7
9
p u b l ic c l a ss Servidor { p u bl i c s t at i c v o id m a i n ( S t r i ng [ ] a r g s ) { tr y {
11
13
15
/ / I ni ci ar e l O RB o r g . o m g . C O R BA . O R B o r b = o r g . o m g . C O R BA . O R B . i n i t ( a r gs ,null ) ; / / O b je t o a u xi l ia r o r g . o m g . C O R BA . O b j e c t o ;
17
19
21
23
/ / E nc on tr ar e l P OA r a´ ız P OA r o ot P OA ; o = o rb . r e s o l v e_ i n it i a l _r e f e re n c es (" R o o t P O A ") ; r o o t P OA = P O A H e l pe r . n a r r o w ( o ) ; / / A ct iv ar e l P OA rootPOA.the_POAManager().activate();
25
/ / C r ea r e l o b je t o i m p lm e n ta c i ´ o n 27
29
31
p r u e ba . C a l c u l a d o r a I m p l c a l c I mp l = ne w p r u e b a . C a l c u l a d o r a I m p l ( ) ; / / R eg i st ra r lo e n e l P OA o = r o o t P OA . s e r v a n t _ t o _ r e f e r e n c e ( c a l c I m pl ) ;
33
35
37
39
41
p r ue b a . C a lc u la d o ra c a lc = prueba.CalculadoraHelper.narrow(o); / / P r od u ci r l a d i r ec c i´ o n d el o bj et o S t ri n g i or = o rb . o b j e ct _ t o_ s t ri n g ( c a lc ) ; System.out.println(ior); / / E s pe r ar l l am a da s orb.run();
5
43
} catch ( E x c ep t io n e ) { e.printStackTrace(); }
45
47
} }
49
El servidor contiene casi toda la carga de la dificultad de la programaci´on con CORBA. Las tareas que implementa el servidor son las siguientes: L´ınea 13: El ORB se inicia como en el cliente. L´ıneas 19–24: Se obtiene el POA ra´ız. 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 jerarqu´ıa. En este caso, registraremos el objeto en el POA ra´ız (RootPOA ). Para la mayor´ıa de los usos, este adaptador de ob jetos es suficiente. Se obtiene el POA Manager . Este manager controla a un conjunto de adaptadores de objetos, permiti´endoles funcionar, o bien encolar las peticiones o rechazarlas. Finalmente, se activa el POAManager . L´ınea 29: Se crea un objeto servant CalculadoraImpl . L´ınea 32: Se utiliza el m´etodo servant to reference del POA para obtener una referencia CORBA a partir de un servant . L´ınea 35: La referencia se convierte a una referencia de un interfaz Calculadora . Este paso no es necesario, se muestra por completitud. L´ınea 38: La referencia se convierte en una cadena de caracteres con la funci´on del ORB object to string. L´ıneas 43–52: La referencia en formato cadena de caracteres se imprime por pantalla. L´ınea 42: El ORB se pone a funcionar (esperar peticiones). con la funci´on run del ORB. El servidor queda as´ı esperando las peticiones de los clientes.
3.
Ejecuci´ on
Una t´ıpica ejecuci´on del programa podr´ıa ser la siguiente: $ java prueba.Servidor | tee IOR IOR:000... $ cat IOR IOR:000...
6
$ java prueba.Cliente 5.0
4.
Revisi´ on
$Id: corba-java.tex 1591 2006-12-12 09:58:08Z dsevilla $
7