Sei sulla pagina 1di 25

Una aplicacin sencilla con CORBA y Java

Sistemas Distribuidos: Programacin con CORBA


Juan Pavn Mestras Dep. Sistemas Informticos y Programacin Universidad Complutense Madrid

Facultad de Informtica, curso 2000-01

Notas del Alumno:

Construccin de una aplicacin CORBA


Especificacin IDL Compilacin IDL Implementacin de la interfaz Implementacin del Servidor
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 2

Implementacin del Cliente

Notas del Alumno:

Toda aplicacin CORBA empieza con la definicin de las interfaces de los objetos que pueden distribuirse. Para ello se utiliza el lenguaje IDL. Esta especificacin establece un contrato entre cliente y servidor: qu servicios (operaciones) ofrece el servidor al cliente. A partir del archivo con la especificacin IDL de las interfaces, se pueden implementar por separado (e incluso en distintos lenguajes de programacin y sobre plataformas diferentes, tanto producto CORBA como sistema operativo y hardware) el cliente y el servidor. Tanto cliente como servidor normalmente usan el mtodo de invocacin esttico, y compilarn el IDL para utilizar stub y skeleton, respectivamente. Al programador del cliente le basta con realizar un programa que obtenga las referencias de los objetos CORBA que necesite, y que invoque las operaciones oportunas. El programador del servidor tiene que escribir la implementacin de la clase del objeto de implementacin y el programa del servidor donde se dar vida a los objetos de implementacin. Veremos a continuacin todos estos pasos.

Descripcin de la aplicacin
n

Se trata de implementar un programa cliente/servidor muy sencillo: un Contador distribuido.


n

Los clientes pueden consultar y modificar el valor del contador. Tambin hay operaciones para incrementar y decrementar en una unidad el valor del contador. La aplicacin muestra el modo de invocacin esttico (stubs y skeletons generados por el compilador IDL) El programa cliente invoca 1000 veces la operacin incrementar sobre el contador y al final muestra el tiempo medio de respuesta

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

Notas del Alumno:

El objetivo de esta aplicacin es dar una visin completa de la utilizacin de CORBA desde el punto de vista del programador. La aplicacin es extremadamente sencilla para no perderse en los detalles de la misma. Se muestra el modo de invocacin esttico por ser el utilizado habitualmente. La aplicacin permite tambin explorar la eficiencia de la invocacin de operaciones en objetos CORBA locales o remotos.

Arquitectura de la aplicacin
Cliente
main()

Servidor
main()

crea
Objeto ImplContador

usa
Contador Helper Stub Contador Skeleton Contador

ORB

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

Notas del Alumno:

El cliente usa el ContadorHelper para acceder a funciones del ORB (por ejemplo, conseguir la referencia del objeto remoto) y el StubContador para invocar las operaciones en el objeto remoto. El servidor usa el SkeletonContador para recibir las invocaciones y devolver los resultados.

Especificacin de la interfaz con IDL


// contador.idl // contador.idl module PrimerEjemplo { module PrimerEjemplo { interface Contador { interface Contador { attribute long valor; attribute long valor; long inc(); long inc(); long dec(); long dec(); }; }; }; };
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 5

Notas del Alumno:

El ejemplo muestra una interfaz muy sencilla, llamada Contador, que se define dentro del mdulo EjemploContador (un mdulo en IDL es similar al package en Java). La interfaz define dos operaciones (sin parmetros, y que devuelven un entero long que es el equivalente al int en Java), inc() y dec(). El atributo, valor, equivale a dos operaciones, una de modificacin del valor: valor(long), y otra de consulta del valor: long valor(). Obsrvese que en la interfaz no hay constructor. Cmo un cliente puede crear y destruir objetos remotos lo veremos ms adelante al estudiar el patrn de diseo Factora.

Compilacin de la interfaz
contador.idl contador.idl > jidl contador.idl
Compilador IDL a Java

Cliente Servidor
_ContadorStub _ContadorStub ContadorHolder ContadorHolder ContadorHelper ContadorHelper <<interface>> Contador <<interface>> ContadorOperations ContadorPOA ContadorPOA

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

Notas del Alumno:

El compilador de IDL a Java genera dos interfaces Java y varias clases: PrimerEjemplo.Contador: es la interfaz de IDL en Java. PrimerEjemplo._ContadorStub: clase Java que implementa el stub de la interfaz Contador en el lado del cliente. PrimerEjemplo.ContadorHelper: clase Java que proporciona mtodos tiles para los clientes de objetos Contador. Por ejemplo los mtodos bind() para obtener una referencia a un objeto Contador, y narrow() para convertir referencias a objetos CORBA al tipo Contador. PrimerEjemplo.ContadorHolder: clase Java que se utiliza si hiciera falta pasar objetos Contador como parmetros out o inout en operaciones de otra interfaz. PrimerEjemplo. ContadorPOA: clase abstracta que sirve de base para la clase que tiene el cdigo que implementa las operaciones de la interfaz. PrimerEjemplo.ContadorOperations: es la interfaz de IDL en Java que deben satisfacer los objetos en los que delegan los objetos de la clase _tie_.

Cdigo generado por el compilador IDL: Contador.java y ContadorOperations.java


package PrimerEjemplo; package PrimerEjemplo; // IDL:PrimerEjemplo/Contador:1.0 // IDL:PrimerEjemplo/Contador:1.0 public interface Contador extends ContadorOperations, public interface Contador extends ContadorOperations, org.omg.CORBA.Object, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity org.omg.CORBA.portable.IDLEntity {{ }} package PrimerEjemplo; package PrimerEjemplo; public interface ContadorOperations {{ public interface ContadorOperations int valor(); int valor(); void valor(int val); void valor(int val); int inc(); int inc(); int dec(); int dec(); }}
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 7

Notas del Alumno:

Obsrvese que en la traduccin de IDL a Java: Cada operacin se corresponde con un mtodo Java Cada atributo se corresponde con dos mtodos: uno para leer y otro para modificar el valor del atributo La clase que implementa la interfaz en Java debe implementar los mtodos descritos en esta interfaz Java.

Cdigo generado por el compilador IDL: _ContadorStub.java


package PrimerEjemplo; package PrimerEjemplo; public class _ContadorStub public class _ContadorStub extends org.omg.CORBA.portable.ObjectImpl extends org.omg.CORBA.portable.ObjectImpl implements Contador implements Contador {{ // ... // ... public int valor() {{/* ... */ }} public int valor() /* ... */ public void valor(int value){ /* ... */} public void valor(int value){ /* ... */} public int inc() {{/* ... */} public int inc() /* ... */} public int dec() {{/* ... */} public int dec() /* ... */} // ... // ... }}
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 8

Notas del Alumno:

Para cada mtodo de la interfaz el cdigo del stub se encarga de hacer el marshalling de los parmetros (esto es, serializarlos), y pasrselos al ORB. Obsrvese que el atributo valor se plasma en dos operaciones, y que el resultado long de las operaciones inc() y dec() se traduce en Java a int. Adems, cada operacin de la interfaz se define como public. Aparte, esta clase define su propio constructor, y algunos otros mtodos de apoyo (como ejercicio, compilar el ejemplo y ver el cdigo de las clases resultantes).

Cdigo generado por el compilador IDL: ContadorHelper.java


package PrimerEjemplo; package PrimerEjemplo; final public class ContadorHelper {{ final public class ContadorHelper public static void insert(org.omg.CORBA.Any any, Contador val) {{ public static void insert(org.omg.CORBA.Any any, Contador val) // ... // ... }} public static Contador extract(org.omg.CORBA.Any any) {{ public static Contador extract(org.omg.CORBA.Any any) // ... // ... }} // ... // ... public static Contador narrow (org.omg.CORBA.Object val) {{ public static Contador narrow (org.omg.CORBA.Object val) //... //... }} }}
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 9

Notas del Alumno:

La clase Helper tiene mtodos estticos que pueden ser tiles para el programador del cliente y el servidor. El mtodo narrow() es estndar y sirve para convertir un objeto de tipo CORBA::Object a uno del tipo de la clase especfica, en este caso Contador.

Cdigo generado por el compilador IDL: ContadorHolder.java

package PrimerEjemplo; package PrimerEjemplo; final public class ContadorHolder implements org .omg.CORBA.portable.Streamable {{ final public class ContadorHolder implements org .omg.CORBA.portable.Streamable public Contador value; public Contador value; public ContadorHolder() {{ }} public ContadorHolder() public ContadorHolder(Contador initial) {{ public ContadorHolder(Contador initial) }} //... //... value = initial; }} value = initial;

}}

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

10

Notas del Alumno:

Las clases Holder sirven para soportar el paso de parmetros out e inout, que se describen en un tema posterior.

Cdigo generado por el compilador IDL: ContadorPOA.java


package PrimerEjemplo; package PrimerEjemplo; public abstract class ContadorPOA public abstract class ContadorPOA extends org.omg.PortableServer.Servant extends org.omg.PortableServer.Servant implements org .omg.CORBA.portable.InvokeHandler, implements org .omg.CORBA.portable.InvokeHandler, ContadorOperations ContadorOperations {{ // ... // ... public org.omg.CORBA.portable.OutputStream _invoke (String opName, public org.omg.CORBA.portable.OutputStream _invoke (String opName, org.omg.CORBA.portable.InputStream in, org.omg.CORBA.portable.InputStream in, org.omg.CORBA.portable.ResponseHandler handler) org.omg.CORBA.portable.ResponseHandler handler) {{ // ... // ... }} }}
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 11

Notas del Alumno:

Los mtodos de la interfaz se dejan como abstractos para que los implemente el programador en la clase que define a partir de sta.

Programacin del Cliente


n

El Cliente puede ser una clase Java con mtodo main() o un applet. En general un Cliente realiza las siguientes funciones:
1) Inicializar el ORB 2) Obtener la referencia a un objeto CORBA que implemente la interfaz deseada (en este ejemplo, Contador)
Usando el mtodo string_to_object() Usando el servicio de Nombres (solucin estndar)

3) Utilizar el objeto CORBA


Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 12

Notas del Alumno: Los pasos que realiza el cliente son: 1) Consigue una referencia a un objeto ORB (interfaz de las funciones del ORB). 2) Antes de usar un objeto CORBA es necesario tener su referencia (con los objetos Java es igual, hay que conseguir la referencia del objeto Java antes de poder usarlo. En CORBA se obtiene la referencia al objeto CORBA, y lo que ocurre entonces es que se obtiene una referencia al objeto proxy que implementa el stub de la interfaz del objeto remoto) Hay varias maneras de hacer esto, lo normal usando el servicio de nombres o como resultado de una operacin. El ms sencillo (aunque no es lo habitual) es usar el mtodo proporcionado por el ORB string_to_object(), que ser utilizado en este ejemplo. 3) Una vez que se ha obtenido su referencia, el objeto CORBA se puede utilizar como cualquier otro objeto Java (en realidad se usa el proxy que es un objeto Java). Para implementar el cliente como un applet el procedimiento es similar. Se ver con ms detalle en el tema dedicado a programacin de clientes CORBA.

ClienteContador.java (1)
package PrimerEjemplo; package PrimerEjemplo; public class ClienteContador {{ public class ClienteContador public static void main(String args[]) {{ public static void main(String args[]) java.util.Properties props = System.getProperties(); java.util.Properties props = System.getProperties(); props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORB"); props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORB"); props.put("org.omg.CORBA.ORBSingletonClass", props.put("org.omg.CORBA.ORBSingletonClass", "com.ooc.CORBA.ORBSingleton"); "com.ooc.CORBA.ORBSingleton"); try {{ try // 1. Inicializa el ORB // 1. Inicializa el ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props); org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props);

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

13

Notas del Alumno:

1) Inicializar el ORB siempre se hace igual, llamando al mtodo init(), mtodo esttico de la clase ORB y que devuelve una referencia al objeto que soporta la funcionalidad del ORB.

ClienteContador.java (2)
// 2. Consigue la referencia al objeto Contador // 2. Consigue la referencia al objeto Contador org.omg.CORBA.Object obj = null; org.omg.CORBA.Object obj = null; try {{ try String refFile = "Contador.ref"; String refFile = "Contador.ref"; java.io.BufferedReader in = java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader(refFile)); new java.io.BufferedReader(new java.io.FileReader(refFile)); String ref = in.readLine(); String ref = in.readLine(); obj = orb.string_to_object(ref); obj = orb.string_to_object(ref);

}} catch(java.io.IOException ex) {{ catch(java.io.IOException ex) ex.printStackTrace(); ex.printStackTrace(); System.exit(1); System.exit(1); }}

Contador cc= ContadorHelper.narrow(obj); Contador = ContadorHelper.narrow(obj);


Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 14

Notas del Alumno:

2) En este ejemplo, para conseguir una referencia al objeto que implementa la interfaz Contador se usa la solucin del mtodo string_to_object() que proporciona el ORB. Para ello se requiere que previamente se haya dejado en un fichero (o en un URL) la referencia al objeto contador al que se quiere acceder (esto lo habra hecho el servidor).

ClienteContador.java (3)
// 3. Utiliza el contador: // 3. Utiliza el contador: System.out.println("El Contador 11tiene el valor: "+c.valor()); System.out.println("El Contador tiene el valor: "+c.valor()); // Llama aala operacion inc() 1000 veces // Llama la operacion inc() 1000 veces System.out.println("Incrementando el contador..."); System.out.println("Incrementando el contador..."); long t_inicial = System.currentTimeMillis(); long t_inicial = System.currentTimeMillis(); for (int ii= 00;;ii< 1000 ;;i++ ))c.inc(); for (int = < 1000 i++ c.inc(); // Calcula el tiempo final eeimprime las estadisticas // Calcula el tiempo final imprime las estadisticas long t_final = System.currentTimeMillis(); long t_final = System.currentTimeMillis(); System.out.println("Tiempo medio de invocacion = System.out.println("Tiempo medio de invocacion = + ((t_final --t_inicial)/1000f) + ""msegs"); + ((t_final t_inicial)/1000f) + msegs"); System.out.println("Valor final del contador = ""+ c.valor()); System.out.println("Valor final del contador = + c.valor());

}} catch(org.omg.CORBA.SystemException e) {{ catch(org.omg.CORBA.SystemException e) System.err.println(CORBA System Exception: " + e); System.err.println(CORBA System Exception: " + e); }} }} }}
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java

15

Notas del Alumno:

3) El objeto Contador se puede usar como cualquier objeto Java. Este programa ejemplo, despus de incrementar 1000 veces el contador, lista el tiempo medio dedicado en la invocacin a la operacin inc(). Al ejecutarse se puede comparar el resultado cuando cliente y servidor estn en la misma o en distintas mquinas, o se puede probar a ejecutar varios clientes a la vez.

Compilacin del cliente


n

Para compilar el cliente el CLASSPATH tiene que indicar dnde encontrar las clases del ORB y las generadas por el compilador de IDL
> javac d . ClienteContador.java

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

16

Notas del Alumno:

Hace falta tener las variables de entorno PATH y CLASSPATH correctamente inicializadas, por ejemplo en Windows: set path=C:\ORBacus\bin;%path% set ORBACUS=C:\ORBacus\JOB-4.0.4\lib set CLASSPATH=%ORBACUS%\OB.jar;%ORBACUS%\OButil.jar;%ORBAC US%\OBNaming.jar;%ORBACUS%\OBEvent.jar;%CLASSPATH%

Implementacin del servidor


El servidor consta de dos partes:
1) La implementacin de una o varias interfaces IDL
n

Clases que implementan las operaciones de las interfaces y que se corresponden a objetos CORBA Hay dos maneras de implementar una interfaz:
Por herencia de la clase interfacePOA Por delegacin, usando una clase _tie_

2) El programa principal (main)


n n

Inicializa el ORB y POA Crea objetos que implementan interfaces

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

17

Notas del Alumno:

Un objeto CORBA puede estar implementado por un objeto Java. La clase del objeto de implementacin debe tener todos los mtodos de clases en la interfaz e incorporar el skeleton. Esto ltimo puede hacerse bien por herencia de la clase ImplBase, o utilizando objetos TIE que se encargan de realizar las tareas del skeleton y delegan la realizacin de la operacin al objeto de implementacin (que sera de una clase Java normal que implementa las operaciones de la interfaz). Por otra parte, los objetos CORBA deben vivir en un proceso. El mtodo main() del proceso inicializa el ORB y crea algunos objetos CORBA (al menos los necesarios para que el cliente pueda empezar a trabajar con el servidor).

Implementacin de la interfaz
n

En este ejemplo se utiliza la herencia La implementacin se realiza definiendo una clase de implementacin que tiene que hacer 2 cosas:
1) Heredar de la clase <interfazIDL>POA
Esta clase la genera el compilador de IDL y proporciona el skeleton

2) Implementar cada mtodo de la interfaz


Se pueden usar mtodos auxiliares en la clase de implementacin de la interfaz

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

18

Notas del Alumno:

ImplContador.java
package PrimerEjemplo; package PrimerEjemplo; class ImplContador extends ContadorPOA {{ class ImplContador extends ContadorPOA private int valor_; private int valor_; // Constructor // Constructor ImplContador () {{ ImplContador () valor_ = 0; valor_ = 0; System.out.println("Creado Objeto Contador con valor = "+valor_); System.out.println("Creado Objeto Contador con valor = "+valor_); }} // attribute valor // attribute valor public int valor() {{return valor_; }} public int valor() return valor_; public void valor(int val) {{valor_ = val; }} public void valor(int val) valor_ = val; // operaciones: // operaciones: public int inc() {{return ++valor_; }} public int inc() return ++valor_; public int dec() {{return --valor_; }} public int dec() return --valor_; }}
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 19

Notas del Alumno:

La clase, que tiene el nombre que decida el programador (en este ejemplo ImplContador), hereda de ContadorPOA dentro del paquete PrimerEjemplo (el nombre que se le dio al mdulo). En este ejemplo, todo contador nuevo empieza con el valor inicial dado en el constructor. Las operaciones son sencillas, y como puede verse no tienen nada de especial por el hecho de tratarse de la implementacin de un objeto CORBA. Si fuese necesario, la clase de implementacin podra aadir nuevos mtodos auxiliares.

Implementacin del servidor Programa principal (main)


n

El programa principal (main) realiza las siguientes funciones:


1) Inicializar el ORB y el POA 2) Crear los objetos CORBA
Al menos los que sean necesarios inicialmente (se pueden crear otros dinmicamente)

3) Pasar el control al ORB


Bucle de eventos

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

20

Notas del Alumno:

La clase que implementa el servidor debe realizar al menos las siguientes acciones: 1) Obtener una referencia a un objeto ORB (en esto es igual que el cliente). 2) Crear objetos CORBA. Dentro de un servidor puede haber varios objetos que implementan interfaces CORBA. Estos objetos pueden ser creados por otros objetos, pero al menos uno debera ser creado en el flujo principal del programa servidor para que algn cliente pudiera invocar operaciones sobre l. 3) Cuando ya se tienen objetos CORBA inicializados, entonces el servidor est preparado para recibir peticiones de operaciones en los objetos CORBA que contiene. Para eso, el servidor se mete en un bucle de eventos, esto es, se queda esperando recibir alguna peticin, y la procesa, vuelve a esperar la siguiente peticin y as indefinidamente.

ServidorContador.java (1)
package PrimerEjemplo; package PrimerEjemplo; public class ServidorContador {{ public class ServidorContador static public void main(String[] args) {{ static public void main(String[] args) java.util.Properties props = System.getProperties(); java.util.Properties props = System.getProperties(); props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORB"); props.put("org.omg.CORBA.ORBClass", "com.ooc.CORBA.ORB"); props.put("org.omg.CORBA.ORBSingletonClass","com.ooc.CORBA.ORBSingleton"); props.put("org.omg.CORBA.ORBSingletonClass","com.ooc.CORBA.ORBSingleton"); try {{ try // Inicializa el ORB // Inicializa el ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props); org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props); // Crea un POA yyobtiene la referencia al manager del rootPOA // Crea un POA obtiene la referencia al manager del rootPOA org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow( org.omg.PortableServer.POAHelper.narrow( orb.resolve_initial_references("RootPOA")); orb.resolve_initial_references("RootPOA")); org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager(); org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 21

Notas del Alumno:

1) La inicializacin del ORB para el servidor suele ser siempre igual.

ServidorContador.java (2)
// Crea el objeto Contador // Crea el objeto Contador ImplContador unObjetoContador = new ImplContador(); ImplContador unObjetoContador = new ImplContador(); Contador cc= unObjetoContador._this(orb); Contador = unObjetoContador._this(orb); // ... yyexporta su referencia en un fichero: // ... exporta su referencia en un fichero: try {{ try String ref = orb.object_to_string(c); String ref = orb.object_to_string(c); String refFile = "Contador.ref"; String refFile = "Contador.ref"; java.io.PrintWriter out = new java.io.PrintWriter( java.io.PrintWriter out = new java.io.PrintWriter( new java.io.FileOutputStream(refFile)); new java.io.FileOutputStream(refFile)); out.println(ref); out.println(ref); out.close(); out.close(); }} catch(java.io.IOException ex) {{ catch(java.io.IOException ex) ex.printStackTrace(); ex.printStackTrace(); System.exit(1); System.exit(1); }}
Juan Pavn Mestras, UCM 2000 -01 Aplicacin sencilla con CORBA y Java 22

Notas del Alumno:

2) La creacin de un objeto CORBA requiere dos pasos: - crear el objeto Java que lo implementa, con new. - indicar al ORB que el objeto creado se puede ofrecer al mundo Por otra parte habr que hacer su referencia accesible, por ejemplo dejndola como un string en un fichero (que leern los clientes).

ServidorContador.java (3)
// Se queda esperando peticiones de servicio // Se queda esperando peticiones de servicio System.out.println("Servidor Contador preparado para recibir peticiones"); System.out.println("Servidor Contador preparado para recibir peticiones"); manager.activate(); manager.activate(); orb.run(); orb.run(); }} catch(Exception e) {{ catch(Exception e) e.printStackTrace(); e.printStackTrace(); System.exit(1); System.exit(1); }} System.out.println("Fin de actividad del servidor Contador"); System.out.println("Fin de actividad del servidor Contador"); System.exit(0); System.exit(0);

}} }}

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

23

Notas del Alumno:

3) Para quedarse esperando indefinidamente peticiones se usa el mtodo run() Todo el cdigo se ha puesto dentro de try-catch porque se puede producir la excepcin SystemException (estndar) si alguna de las operaciones sobre el objeto orb fallara.

Prueba de la aplicacin
1) Arrancar el servidor: > java PrimerEjemplo.ServidorContador 2) Y ejecutar el cliente: > java PrimerEjemplo.Cliente Inicializa el ORB... Consigue la referencia al objeto Contador1 El objeto Contador1 tiene el valor: 0 Incrementando el contador... Tiempo medio de invocacion = 3.02 msegs Valor final del contador = 1000 >
n n

Puede ser interesante probar varios clientes a la vez. Algunos pueden ser aplicaciones y otros applets.
Aplicacin sencilla con CORBA y Java 24

Juan Pavn Mestras, UCM 2000 -01

Notas del Alumno:

Como ejercicio pueden verse los resultados de ejecutar el cliente y el servidor en la misma o en distintas mquinas. Tal vez los resultados sorprendan al no ver una gran ganancia en tiempo de respuesta en el caso de ejecucin local, y esto se debera al hecho de que el tiempo dedicado a conmutar entre los procesos cliente y servidor fuera similar al requerido para pasar los mensajes por la red.

Resumen
n

La realizacin de una aplicacin cliente/servidor con Java y CORBA requiere:


n n

Definir con IDL las interfaces que exporta el servidor Desarrollar el cliente usando los stubs generados por el compilador de IDL Implementar las interfaces y desarrollar el servidor utilizando los skeletons generados por el compilador de IDL

Juan Pavn Mestras, UCM 2000 -01

Aplicacin sencilla con CORBA y Java

25

Notas del Alumno:

Potrebbero piacerti anche