La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

1 Tema 3: Programación Básica CORBA sobre Java Programación Concurrente y Distribuida Prácticas.

Presentaciones similares


Presentación del tema: "1 Tema 3: Programación Básica CORBA sobre Java Programación Concurrente y Distribuida Prácticas."— Transcripción de la presentación:

1 1 Tema 3: Programación Básica CORBA sobre Java Programación Concurrente y Distribuida Prácticas

2 22 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

3 33 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

4 4 1. CORBA frente a RMI  1997: Se introduce RMI en JDK 1.1  1998:  Se introduce Java IDL en JDK 1.2 (Compatible con CORBA)  JDK 1.2 incluye su propio ORB  Posibilidad de RMI sobre IIOP (Interoperabilidad CORBA/RMI)  RMI:  No diferencia interfaz de implementación  Permite el paso de objetos por valor  Permite elegir entre usar… IIOP JRMP (Java Remote Method Protocol) Tema 3: Programación Básica CORBA sobre Java

5 55 Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

6 6 2. Uso del traductor idlj  Terminología:  Sirviente (servant): Objeto que implementa una (o varias) interfaces IDL.  Servidor (server): Programa que crea sirvientes y los hace accesible a los clientes.  Cliente (client): Programa que hace uso de algún sirviente  Sirviente de puede crear de dos formas:  Herencia  Delegación Tema 3: Programación Básica CORBA sobre Java especific.idl xxxxx.java … idlj

7 7 2. Uso del traductor idlj  Línea de comandos de idlj (versión 3.2 o posterior): idlj [opciones] archivos.idl  Opciones más habituales: -fclient : genera sólo infraestructura para lado cliente. -fserver : genera sólo infraestructura para construir lado servidor mediante herencia. -fserverTIE : genera sólo infraestructura para construir lado servidor mediante delegación. -fall : genera infraestructura para lados cliente y servidor (lado servidor mediante herencia) -fallTIE : genera infraestructura para lados cliente y servidor (lado servidor mediante delegación) -oldImplBase : genera infraestructura para lado servidor basado en BOA en lugar de POA Tema 3: Programación Básica CORBA sobre Java

8 8 2. Uso del traductor idlj  Si se trabaja con eclipse: posibilidad de usar plugins  ORBStudio: plugin gratuito para eclipse (www.orbzone.org) idlj *.idl Archivos generados tanto para lado cliente como servidor:  *Operations.java :  Intefaz Java resultante de aplicar las reglas de mapping IDL a Java a la interfaz traducida.  *.java :  Interfaz CORBA que verán los clientes  Hereda de *Operations (tiene todas las operaciones de Interfaz)  Hereda de org.omg.CORBA.Object (superclase común a todos los objetos CORBA) Tema 3: Programación Básica CORBA sobre Java

9 9 2. Uso del traductor idlj Archivos generados para lado cliente:  _*Stub.java :  Se usa de forma transparente (actúa como representante local en el cliente del objeto CORBA remoto).  Sólo necesaria para compilar.  Obsérvese que implementa las operaciones de la interfaz.  *Holder.java :  Clase que actúa como clase corbertura  Se genera una clase Holder para cada… Tipo definido por usuario en IDL Tipo predefinido, si es necesario (por ejemplo, por usarse como argumento out/inout)  Contiene: atributo “value” Constructores Tema 3: Programación Básica CORBA sobre Java

10 10 2. Uso del traductor idlj Archivos generados para lado cliente (cont.):  *Helper.java :  Clase abstracta que se genera en mismas circunstancias que clase Holder.  Proporciona algunos métodos útiles para la manipulación del tipo. Ejemplo: método narrow() Tema 3: Programación Básica CORBA sobre Java

11 11 2. Uso del traductor idlj Tema 3: Programación Básica CORBA sobre Java Archivos generados para construcción lado servidor por herencia (idl -fserver)  *POA.java  Clase abstracta que… Afirma implementar Interfaz ¡pero no define sus operaciones! Hereda de org.omg.CORBA.portable.InvokeHandler Hereda de org.omg.portableServer.Servant  Para construir sirviente: Debe heredar de esta clase Debe implementar las operaciones pendientes  Es por tanto la clase base de todos los sirvientes

12 12 2. Uso del traductor idlj Tema 3: Programación Básica CORBA sobre Java Archivos generados para construcción lado servidor por delegación (idl -fserverTIE)  *POATie.java  Clase delegadora  Hereda de _*POA: Implementa interfaz (¡y es verdad!)  Tiene un constructor que acepta un objeto *Operations  ¡Nótese cómo delega la implementación de las operaciones!

13 13 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

14 14 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java  Pasos a seguir: 1.Partimos de la(s) interfaz(ces) IDL 2.Traducir dichas interfaces con idlj 3.Para cada interfaz, escribir una clase sirviente…  Por herencia  Por delegación 4.Creación de un servidor: 1.Crear e inicializar ORB 2.Crear e inicializar al menos un POA 3.Crear objetos sirvientes 4.Activar sirvientes 5.Hacer accesible a los clientes referencias a los sirvientes

15 15 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java  En detalle: “hola mundo”  Paso 1: Interfaz IDL interface holaMundo { attribute string mensaje; void saluda(); };  Paso 2: traducción a IDL holaMundo.java holaMundoOperations.javaholaMundoPOA.java idlj –fserver holaMundo.idl

16 16 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java  Paso 3: Implementar clase sirviente (por herencia) public class holaMundoImpl extends holaMundoPOA { private String mensaje= "Mensaje por Defecto"; public holaMundoImpl() { super(); } public String mensaje() // Acessor { return mensaje; } public void mensaje(String mensaje) // Mutator { this.mensaje= mensaje; } public void saluda() { System.out.println(mensaje); }

17 17 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java  Paso 3: Implementar clase sirviente (por delegación) public class holaMundoImpl implements holaMundoOperations { private String mensaje= "Mensaje por Defecto"; public holaMundoImpl() { … } public String mensaje() // Acessor { return mensaje; } public void mensaje(String mensaje) // Mutator { this.mensaje= mensaje; } public void saluda() { System.out.println(mensaje); }

18 18 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java  Paso 4: Creación de un servidor import org.omg.CORBA.*; import org.omg.PortableServer.*; public static void main(String[] args) { // Inicialización del ORB ORB orb= ORB.init(args, null); // Creación del POA raíz: POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); // Crear y activar sirvientes: // Si se usó herencia: holaMundoImpl sirviente= new holaMundoImpl(); org.omg.CORBA.Object obj= poa.servant_to_reference(sirviente); … // Si se usó delegación: holaMundoImpl sirviente= new holaMundoImpl(); holaMundoPOATie pseudosirviente= new holaMundoPOATie(sirviente); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente);

19 19 3. Creación del lado servidor Tema 3: Programación Básica CORBA sobre Java  Paso 4: Creación de un servidor (cont.) // Poner una referencia al objeto a disposición de los clientes, bien sea… // - Publicándola en servicio de nombres, de trading, etc. // - Devolviendo la referencia como valor de retorno o parámetro de salida, // - Convirtiéndola a una IOR y publicándola de alguna manera, por ejemplo… String ior= orb.object_to_string(obj); PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior"))); ps.println(orb.object_to_string(ior)); ps.close(); // Evitar terminación: orb.run(); …

20 20 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

21 21 4. Creación del lado cliente Tema 3: Programación Básica CORBA sobre Java  Cliente no depende de cómo se han implementado los sirvientes (herencia o delegación)  Cliente no tiene por qué ser objeto CORBA  Pasos a seguir: 1.Partimos de la(s) interfaz(ces) IDL 2.Traducir dichas interfaces con idlj 3.Creación del cliente: 1.Crear e inicializar ORB 2.Obtener referencias a objetos 3.Interactuar con ellos como si fuesen locales

22 22 4. Creación del lado cliente Tema 3: Programación Básica CORBA sobre Java  En detalle: (cliente para “hola mundo”)  Pasos 1 y 2: análogo a lado servidor interface holaMundo { attribute string mensaje; void saluda(); }; holaMundo.java holaMundoOperations.java _holaMundoStub.java holaMundoHolder.java holaMundoHelper.java idlj –fclient holaMundo.idl

23 23 4. Creación del lado cliente Tema 3: Programación Básica CORBA sobre Java  Paso 3: Creación de un cliente import org.omg.CORBA.*; public static void main(String[] args) { // Inicialización del ORB ORB orb= ORB.init(args, null); // Obtener referencia a objetos. Si se usó una “strinfied IOR”, se lee la cadena // del archivo… LineNumberReader input = new LineNumberReader(new FileReader("server.ior")); String ior = input.readLine(); org.omg.CORBA.Object obj = orb.string_to_object(ior); // Y se convierte al tipo correcto usando el método narrow de la clase helper: holaMundo hola = holaMundoHelper.narrow(obj); // Ya se puede usar el objeto: hola.mensaje(“Hola a todo el mundo”); hola.saluda(); }

24 24 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

25 25 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java A operacionA(); B operacionB(); C operacionC(); public interface COperations extends AOperations, BOperations { void operacionC (); } COperations public interface C extends COperations, A, B { } C public abstract class CPOA extends org.omg.PortableServer.Servant implements COperations, org.omg.CORBA.portable.InvokeHandler { … CPOA

26 26 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java public class CPOATie extends CPOA { private COperations _impl; public CPOATie ( COperations delegate ) { this._impl = delegate; } public void operacionC () { _impl.operacionC(); } public void operacionA () { _impl.operacionA(); } public void operacionB () { _impl.operacionB(); } … CPOATie

27 27 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java APOABPOACPOA  Implementación por herencia:  cada implementación debe heredar de su *POA: AImplBImplCImpl

28 28 5. Implementando herencia Tema 3: Programación Básica CORBA sobre Java  Solución: implementar herencia mediante delegación class CImpl implements COperations { private AImpl deleg_A; private BImpl deleg_B; public CImpl (AImpl A, BImpl B) { this.deleg_A= A; this.deleg_B= B; … } public void operacionC() {…} public void operacionA() { deleg_A.operacionA(); } public void operacionB() { deleg_B.operacionB(); } …

29 29 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

30 30 6. Uso de excepciones Tema 3: Programación Básica CORBA sobre Java  Excepciones son remotas:  Se producen en objeto sirviente  Se capturan en cliente  Pasos a seguir para usar excepciones: 1.En IDL, hay que 1.Definir la excepción 2.Indicar qué operación(es) puede(n) lanzarlas: interface conexion { exception error_tx { short codigo; string descripcion; }; void inicio_trasmision (in short modo) raises (error_tx); …

31 31 6. Uso de excepciones Tema 3: Programación Básica CORBA sobre Java 2.Al implementar el sirviente: 1.Declarar que los métodos que implementan las operaciones que lanzan excepciones, pueden lanzar dichas excepciones 2.Lanzar las excepciones cuando sea oportuno: public class conexionImpl implements conexionOperations { … void inicio_trasmision (short modo) throws error_tx { … if (fallo_imprevisto()) throw new error_tx(codigo_error(), texto_error()); … 3.En el lado cliente, excepciones se tratan como locales 1.O se capturan mediante try … catch 2.O se declara mediante trhows que se propaga la excepción

32 32 6. Uso de excepciones Tema 3: Programación Básica CORBA sobre Java public class conexionImpl implements conexionOperations { … void inicio_trasmision (short modo) throws error_tx { … if (fallo_imprevisto()) throw new error_tx(codigo_error(), texto_error()); … int tabla[]= new int[MAX]; … tabla[MAX]= 0;  UNKNOWN_EXCEPTION:  Excepción que le llega a cliente cuando sirviente eleva una excepción que no está declarada en la definición IDL de la operación  Ejemplo: ArrayIndexOutOfBoundsException ¿?

33 33 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

34 34 7. Objetos fábrica Tema 3: Programación Básica CORBA sobre Java  Son objetos CORBA con operaciones que proporcionan referencias a otros objetos CORBA  Frecuentemente, crean otros objetos CORBA  Para crear un objeto CORBA y devolverlo como resultado de una operación: 1.En IDL, la operación debe declarar el tipo interfaz correspondiente como tipo de retorno. 2.Sirviente debe tener ORB y POA previamente inicializado 3.Método de sirviente: 1.Crea nuevo sirviente (clase *Impl correspondiente) 2.Registra dicho sirviente en POA (método servant_to_reference) 3.Usa método narrow de clase *Helper para convertir referencia obtenida al tipo adecuado 4.Devuelve la referencia resultante de conversión

35 35 7. Objetos fábrica Tema 3: Programación Básica CORBA sobre Java interface conexion { exception error_tx { short codigo; string descripcion; }; void inicio_trasmision (in short modo) raises (error_tx); … }; interface gestorConexiones { conexion nuevaConexion(in string nombre); … };  Ejemplo:

36 36 7. Objetos fábrica Tema 3: Programación Básica CORBA sobre Java class gestorConexionImpl extends gestorConexionPOA { … conexion nuevaConexion (string nombre) { … … return c; } … // Si sirviente sirviente creado por herencia conexionImpl sirviente= new conexionImpl(); org.omg.CORBA.Object obj= poa.servant_to_reference(sirviente); conexion c= conexionHelper.narrow(obj); // Si sirviente sirviente creado por delegación conexionImpl sirviente= new conexionImpl(); conexionPOATie pseudosirviente= new conexionPOATie(sirviente); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente); conexion c= conexionHelper.narrow(obj);

37 37 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

38 38 8. Metodología Tema 3: Programación Básica CORBA sobre Java  CORBA no es más que un middleware que permite el acceso a objetos remotos  Inconvenientes: programas contienen mucho código…  … muy dependiente de dicho middleware  … difícil de mantener  … críptico // Inicialización del ORB ORB orb= ORB.init(args, null); // Creación del POA raíz: POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); // Crear y activar sirvientes: holaMundoImpl sirviente= new holaMundoImpl(); holaMundoPOATie pseudosirviente= new holaMundoPOATie(sirviente); org.omg.CORBA.Object obj= poa.servant_to_reference(pseudosirviente); ¿Con B o con V?

39 39 8. Metodología Tema 3: Programación Básica CORBA sobre Java  Sería deseable que nuestras aplicaciones sean lo más independientes de middleware posible. Ventajas:  Facilidad de desarrollo  Facilidad de mantenimiento  Portabilidad  …  IDEA: Encapsular todos los detalles dependientes del middleware en una capa de abstracción de middleware  Para portar la aplicación a otro middleware, sólo habría que modificar dicha capa  Inconveniente:  Puede obligar a renunciar a determinadas particularidades del middleware…  … o esta capa puede resultar muy compleja

40 40 8. Metodología Tema 3: Programación Básica CORBA sobre Java  Abstrayendo: normalmente, todo middleware…  … puede necesitar ser inicializado  … puede necesitar ser terminado  … puede registrar (publicar) un objeto  … puede desconectar un objeto  … puede localizar un objeto a través de su nombre  …  ¡Implementemos un middleware virtual que soporte estas operaciones, y las mapee sobre un middleware real!

41 41 8. Metodología Tema 3: Programación Básica CORBA sobre Java  Propuesta: patrón de diseño basado en… 1.Interfaz IMiddleware: public interface IMiddleware { public void inicializar(); public void detener(); public void esperar(); public Object registrar(Object sirviente,String nombre_interfaz); public void desregistrar(Object objeto); public void nombrar (Object objeto, String nombre); public Object localizar(String nombre_objeto, String nombre_clase); }

42 42 8. Metodología Tema 3: Programación Básica CORBA sobre Java 2.Clase Middleware: public abstract class Middleware { private static IMiddleware middleware; private static void inicializar(IMiddleware middleware) { this.middleware= middleware; middleware.inicializar(); } public static void detener() { middleware.detener(); } public static void esperar() { middleware.esperar(); } …

43 43 8. Metodología Tema 3: Programación Básica CORBA sobre Java 3.Clases de abstracción de middleware: public class JavaORB implements IMiddleware { // Argumentos de inicialización: public String opcionesLC[]; // Opciones para ORB por la línea de comandos public Properties opcionesProp; // Opciones para ORB como lista de propiedades public String nombreSN=""; // Nombre de raíz en Servicio de Nombres public String kindSN=""; // Tipo (extensión) de dicho nombre … public void inicializar() { // Inicializar ORB usando las opciones. orb= org.omg.CORBA.ORB.init(opcionesLC, opcionesProp); _nombreSN= nombreSN; _kindSN= kindSN; // Inicializar POA try { poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); } catch (AdapterInactive e) { e.printStackTrace(); } …

44 44 8. Metodología Tema 3: Programación Básica CORBA sobre Java  Para construir una aplicación basada en el Middleware abstracto: class holaMundoServer { public static void main(String args[]) { // Inicializar middleware: Properties props= new Properties(); JavaORB mdlw= new JavaORB(); mdlw.opcionesLC=args; mdlw.opcionesProp= props; mdlw.nombreSN="ejemplo"; // A partir de aquí, código es independiente de middleware! Middleware.inicializar(mdlw); holaMundoImpl sirviente= new holaMundoImpl(); holaMundo obj= (holaMundo)Middleware.registrar(sirviente,"holaMundo"); Middleware.nombrar(obj,"holamundo"); …

45 45 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

46 46 8. Detalles de implementación Tema 3: Programación Básica CORBA sobre Java  ¡Las referencias a objetos CORBA, apuntan a objetos que pueden estar en otra máquina! … conexion c= gestor.nuevaConexion (“C01”); c.inicio_transmision(0); … cliente servidor conexionImpl conexion _conexionStub ORB conexionPOATie

47 47 8. Detalles de implementación Tema 3: Programación Básica CORBA sobre Java Consecuencias:  ¡Dos referencias al mismo objeto pueden ser distintas!  Basta que se hayan obtenido por procedimientos distintos  Para saber si dos referencias apuntan a mismo objeto:  método is_equivalent(Object other) heredado de la clase org.omg.CORBA.Object  El true es seguro, el false no: ¡mejor implementar nuestro propia lógica de identificación!  El ORB intenta que las referencias a objetos locales sean referencias directas al propio sirviente  Para determinar si una referencia apunta a un objeto local: método _is_local() heredado de org.omg.CORBA.Object

48 48 Tema 3: Programación Básica CORBA sobre Java Índice: 1.CORBA frente a RMI 2.Uso del traductor idlj 3.Creación del lado servidor 4.Creación del lado cliente 5.Implementando herencia 6.Uso de excepciones 7.Objetos Fábrica 8.Metodología 9.Detalles de implementación 10.El servicio de nombres

49 49 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres

50 50 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres

51 51 10.1 Generalidades Tema 3: Programación Básica CORBA sobre Java  Servicio estandarizado por OMG  Su interfaz IDL está definida en estándar CORBA  Paquete org.omg.CosNaming: implementación de dicha interfaz  Permite crear una jerarquía de nombres similar a un árbol de directorios  Cada nombre puede tener asociada una referencia a un objeto Initial Naming Context Investigación Desarrollo Gestión Objeto1 Objeto2

52 52 10.1 Generalidades Tema 3: Programación Básica CORBA sobre Java  Terminología:  Componente de nombre (NameComponent): Nombre asociado a cualquiera de los nodos. Un nombre consta de un nombre y un tipo (ambos son cadenas)  Contexto de nombre (NamingContext): Nodo del árbol. Puede tener asociado una referencia o ser un nodo intermedio Es un objeto CORBA  Nombre: Se suele llamar así a los contextos de nombre que tienen asociada una referencia  Contexto: Se suele llamar así a los contextos de nombre intermedios  Sólo la raíz de la estructura (contexto de nombre inicial) es persistente

53 53 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres

54 54 10.2 Inicio y localización del servicio Tema 3: Programación Básica CORBA sobre Java  Servicio debe arrancarse para poderlo usar:  UNIX: tnameserv  Windows: start tnameserv (en una ventana de comandos)  Por defecto, servicio usa puerto 900  Para cambiar puerto: parámetro –ORBInitialPort n  Para usar servicio, basta obtener referencia a contexto de nombre inicial: // Localización y puerto de servicios: en inicialización de ORB Properties conf= new Properties(); conf.Put(“org.omg.CORBA.ORBInitialPort”, “1024”); conf.Put(“org.omg.CORBA.ORBInitialHost”, “servidor.eii.us.es”); ORB orb= ORB.init(args, conf); // Se obtiene referencia a contexto inicial: org.omg.CORBA.Object obj= orb.resolve_initial_references(“NameService”); NamingContext root= NamingContextHelper.narrow(obj);

55 55 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres

56 56 10.3 Creando contextos y asociando nombres Tema 3: Programación Básica CORBA sobre Java 1.Para crear un nombre: clase NameComponent :  Tiene sólo dos atributos de tipo string, id y kind :  Los nombres se manejan como arrays de nombres simples … NameComponent nc= new NameComponent (“plans”, “text”); NameComponent[] nombre= {nc}; … 2.Asociar el nombre a un referencia obj, bajo un contexto cuya referencia es ctx: método rebind() de clase NamingContext  También se puede usar método bind(), pero genera excepción si nombre ya está en uso en ese contexto … ctx.rebind(nombre, obj); …

57 57 10.3 Creando contextos y asociando nombres Tema 3: Programación Básica CORBA sobre Java 3.Para deshacer anterior operación (borrar un nombre): método unbind() : … ctx.unbind(nombre); … 4.Para asociar el nombre a un nuevo contexto creado como hijo de un contexto ctx ya existente: métodos new_context() y rebind_context() de clase NamingContext : … // Se pide a contexto padre que fabrique un nombre contexto: NamingContext nuevo= ctx.new_context(); // Se convierte este contexto en su hijo, asociándole un nombre: ctx.rebind_context(nombre, nuevo); …

58 58 10.3 Creando contextos y asociando nombres Tema 3: Programación Básica CORBA sobre Java  Alternativa: pedir a un contexto que cree un nuevo contexto hijo con un nombre (método bind_new_context() de clase NamingContext )  Eleva excepción si nombre ya está en uso en dicho contexto … NamingContext nuevo= ctx.bind_new_context(nombre); … 5.Para deshacer anterior operación (destruir un contexto): método destroy() de clase NamingContext : … nuevo.destroy() …

59 59 10. El servicio de nombres Tema 3: Programación Básica CORBA sobre Java 1.Generalidades 2.Inicio y localización del servicio 3.Creando contextos y asociando nombres 4.Explorando la estructura de nombres

60 60 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java  Dado un contexto de nombre ctx, para obtener lo que haya asociado en él a un nombre dado: método resolve() de clase NamingContext … NameComponent nc= new NameComponent(“nombre”, “tipo”); NameComponent[] nombre= {nc}; org.omg.CORBA.Object obj= ctx.resolve(nombre); … // Si sabemos que objeto es otro contexto: NamingContext hijo= NamingContextHelper.narrow(obj); // Si sabemos que objeto es un objeto de usuario: miClase miObjeto= miClaseHelper.narrow(obj);

61 61 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java  Para explorar todo el contenido de un NamingContext : método de list() de dicha clase: … BindingListHolder bl= new BindingListHolder(); BindingIteratorHolder bit= new BindingIteratorHolder(); ctx.list(max, bl, bit); …  Los parámetros bl y bit son “Holder” porque en la interfaz IDL del servicio están definidos como parámetros OUT  Los max primeros elementos: van a bl  Los restantes (si los hay): van a bit  En ambos casos, el contenido son objetos de una clase llamada Binding

62 62 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java  Para extraer los Binding de la lista: atributo value de clase BindingListHolder … Binding Bindings[]= bl.value; …  Para extraer los Binding del iterador: método next_one() del atributo value  Tipo boolean: devuelve true si queda alguno más  Parámetro bh : parámetro de salida de tipo BindingHolder, que tiene un atributo value de tipo Binding … BindingHolder bh; bit.value.next_one(bh); Binding b= bh.value; …

63 63 10.4 Explorando la estructura de nombres Tema 3: Programación Básica CORBA sobre Java  Clase Binding:  Atributo binding_name (de tipo NameComponent[] ): se trata del nombre, que puede ser resuelto mediante el método resolve() del contexto del que se obtuvo  Atributo binding_type : de tipo BindingType, que puede valer: BindingType.ncontext, en cuyo caso representa a un contexto, o BindingType.nobject, en cuyo caso representa a un objeto de usuario

64 64


Descargar ppt "1 Tema 3: Programación Básica CORBA sobre Java Programación Concurrente y Distribuida Prácticas."

Presentaciones similares


Anuncios Google