Professional Documents
Culture Documents
CORBA
CONTENIDO
Introduccin
1. 2. 3.
CONTENIDO
Referencias
1. 2.
Cmo hacer solicitudes a objetos CORBA Cmo obtener referencias a objetos CORBA Portable Object Adapter (POA) Manejadores de sirvientes Servicio de nombres (Naming Service)
Servicios Comunes
1.
INTRODUCCIN
INTRODUCCIN
CORBA: Common Object Request Broker Architecture. Arquitectura del administrador de solicitudes de objetos CORBA es una tecnologa para el manejo de objetos distribudos Especificacin de una arquitectura e interfaz que permite a una aplicacin hacer solicitudes a objetos Independiente del sistema operativo, de la plataforma hardware y del lenguaje de programacin Los clientes y servidores pueden residir en la misma computadora o estar distribuidos
INTRODUCCIN
TCP/IP
Cliente Proceso A
Objeto
Llamada directa
Cliente Proceso C
Cliente
Computador A
Proceso B
Computador B
INTRODUCCIN
El ORB es el mediador entre el cliente y el servidor
Referencia de objeto
Conexin lgica
Objeto CORBA
Solicitud
ORB cliente
Aplicacin cliente
ORB servidor
Aplicacin servidora
INTRODUCCIN
CORBA fue desarrollado por el OMG (Object Management Group) Una organizacin formada por ms de 700 empresas que desarrollan, venden y utilizan software El OMG desarroll OMA (Object Management Architecture) como estrategia fundamental para promover el uso de la tecnologa orientada a objetos
INTRODUCCIN
OMA: Object Management Architecture - Arquitectura para la manipulacin de objetos
Application objects Objetos aplicacin Common facilities Facilidades comunes
INTRODUCCIN
Componentes de OMA
Objetos de aplicacin (application objects). Son los programas de aplicacin que intercambian informacin durante su ejecucin Servicios comunes. Son objetos que ofrecen servicios fundamentales, tales como servicios de directorio, transacciones y persistencia. Estos servicios estn estandarizados para que sean interoperables
INTRODUCCIN
Componentes de OMA
Facilidades comunes. Son objetos que ofrecen servicios cuya funcionalidad responde a necesidades particulares de los dominios de aplicacin Object request broker (ORB). El ORB es el encargado de permitir que los dems componentes de OMA puedan interactuar
INTRODUCCIN
El ORB (Object Request Broker - Administrador de Solicitudes a Objetos) es el componente central del OMA CORBA es la especificacin del ORB El OMG no produce software. Los ORBs son desarrollados y distribuidos por las empresas miembro En la actualidad existen varios ORBs que se adhieren bien a las especificaciones CORBA Esto hace que las aplicaciones CORBA sean interoperables
INTRODUCCIN
Objetos distribuidos La programacin orientada objetos se presta de forma natural para el procesamiento distribuido Un objeto distribuido es un objeto que puede recibir solicitudes a travs de la red
INTRODUCCIN
Por qu objetos distribuidos?
Aplicacin A. Supervisin remota Aplicacin B. Al ser interrogada Debe interrogar a B para obtener por A lee un sensor y devuelve la lecturas de sensores lectura Red
INTRODUCCIN
Problemas:
La construccin, envo y decodificacin de mensajes no tiene nada que ver con la aplicacin propiamente dicha Las operaciones dependen del protocolo de red utilizado (TCP-IP, IPX-SPX, etc.) Son operaciones orientadas a entrada - salida
INTRODUCCIN
Utilizando objetos distribuidos:
Aplicacin A
... Sensor s; // objeto remoto temperatura = s.leer(); ...
Aplicacin B
int Sensor.leer() { ... } ... orb.run();
La operacin s.leer() es una solicitud que se hace al objeto remoto El ORB se encarga de codificar el mensaje, enviarlo a la mquina remota, decodificarlo, entregarlo a la aplicacin remota y repetir el proceso a la inversa para devolver el resultado
INTRODUCCIN
Las principales tecnologas de objetos distribuidos son:
COM/DCOM (distributed component object model). Tecnologa de objetos distribuidos de Microsoft, la cual est siendo sustituida por .NET. .NET. Tecnologa de objetos distribuidos de Microsoft, actualmente en desarrollo. RMI (remote method invocation). Tecnologa de objetos distribuidos de Java. SOAP (simple object access protocol). Tecnologa de objetos distribuidos basada en XML y http. CORBA (common object request broker architecture). Tecnologa de objetos distribuidos del OMG.
ARQUITECTURA
ARQUITECTURA
Componentes principales de CORBA
Clientes Objetos CORBA ORB (Object request broker - Administrador de
solicitudes a objetos)
ARQUITECTURA
Stubs IDL
Interfaz ORB
IDL Skeleton
Object Adapter
ARQUITECTURA
Cliente: Un ente que hace una solicitud a un objeto CORBA Servidor: Un ente capaz de recibir una solicitud de un cliente, realizar una accin (o mltiples acciones) en respuesta a dicha solicitud y devolver un resultado Tambin recibe el nombre de Objeto, o Implementacin de objeto (object implementation) Los dems componentes del diagrama constituyen el ORB
ORB
(OBJECT REQUEST BROKER)
ORB
Object Request Broker solicitudes a objetos) (Administrador de
Funcin: Enviar solicitudes a objetos y devolver las respuestas a los clientes Caracterstica ms importante: transparencia
ORB
El ORB debe ocultar lo siguiente:
El cliente no sabe donde reside el servidor: en el mismo proceso, en la misma computadora o en diferentes computadoras conectadas en red El cliente no sabe cmo se ha implementado el servidor, que lenguaje fue usado, en que sistema operativo o en que plataforma de hardware est implementado El cliente no sabe si el servidor est activo o no El cliente no sabe que mecanismo de comunicacin se est usando (TCP/IP, memoria compartida, llamada local, etc.)
Implementacin de objetos.
Mecanismo de comunicacin.
ORB
Componentes del orb
Ncleo del ORB (ORB core) IDL (lenguaje de definicin de interfaces) Stubs IDL Interfaz de invocacin dinmica (DII) Esqueletos IDL (IDL skeletons) Interfaz del ORB Object adapters
ORB
Ncleo del ORB
Es el mediador entre los clientes y los servidores
Referencia de objeto
Conexin lgica
Objeto CORBA
Solicitud
ORB cliente
ORB servidor
Aplicacin cliente
Aplicacin servidora
IDL
IDL. Lenguaje de definicin de interfaces
Un lenguaje que permite definir las interfaces
CORBA
Interfaz CORBA:
fuente IDL y produce como salida: 1. Stubs IDL 2. Esqueletos IDL (IDL skeletons)
IDL
IDL. Lenguaje de definicin de interfaces
El
del
lenguaje
de
tipos bsicos (enteros, floats, etc.), estructuras, objetos, arreglos dinmicos, strings, entre otros.
IDL
Compilador IDL
IDL
Stubs IDL
Son archivos fuente, en un lenguaje dado, que
permiten que un cliente haga solicitudes a objetos CORBA que implementan las interfaces definidas
Son Los
generados automticamente por compilador IDL a partir de interfaces CORBA stubs deben programas cliente solicitud al ORB ser incorporados en
el los
IDL
Esqueletos IDL (IDL skeletons)
Son
archivos fuentes que se incorporan al programa que implementa el o los servidores definidos en el fuente IDL generados automticamente por compilador IDL a partir de interfaces CORBA el
Son
IDL
IDL. Lenguaje de definicin de interfaces
Ejemplo: module aplpozos { interface Pozo { long devolverId(); long devolverProduccionCrudo(); }; };
IDL
IDL. Implementacin del objeto PozoImpl:
import org.omg.CORBA.*; import aplpozos.*; public class PozoImpl extends PozoPOA { static int valores[] = {120, 200, 140, 180, 300, 280}; int id; int produccionCrudo; PozoImpl(int id) { this.id =id; produccionCrudo = valores[id]; } public int devolverId() { return id; } public int devolverProduccionCrudo() { return produccionCrudo; } }
IDL
IDL. Implementacin del objeto PozoImpl:
import org.omg.CORBA.*; import org.omg.PortableServer.*; import aplpozos.*; public class AplicacionPozos { public static void main(String[] args) { try { //iniciar el orb ORB orb = ORB.init( args, null ); // iniciar el POA org.omg.CORBA.Object obj = orb.resolve_initial_references("RootPOA"); POA poa = POAHelper.narrow(obj); poa.the_POAManager().activate(); ...
IDL
IDL. Implementacin del objeto PozoImpl:
... // crear un pozo PozoImpl pi = new PozoImpl(2); obj = poa.servant_to_reference(pi); Pozo p = PozoHelper.narrow(obj); // hacer solicitudes int prod = p.devolverProduccionCrudo(); System.out.println("Produccion: "+prod); } catch( UserException e ) { System.err.println(e); } catch( SystemException e ) { System.err.println(e); } } }
IDL
(INTERFACE DEFINITION LANGUAGE)
IDL
Interfaces
module pozos { interface Pozo { string devolverId(); long devolverProduccionCrudo(); long devolverProduccionGas(); void devolverProduccion(out long prodCrudo, out long prodGas); void actualizarProduccionCrudo(in long produccion); void actualizarProduccionGas(in long produccion); }; interface FabricaPozos { Pozo crearPozo(in string id); }; };
IDL
Bindings o mappigns
El IDL es independiente del lenguaje de programacin utilizado para implementar las aplicaciones Los mappings determinan como se ven las interfaces en distintos lenguajes de programacin Un mapping utiliza los recursos de cada lenguaje para poder tener acceso a objetos CORBA
IDL
Mdulos
module aplpozos { module pozos { interface Pozo { long id; long devolverProduccionCrudo(); long devolverProduccionGas(); }; }; };
IDL
Ejercicio no. 1. Cree la interfaz Pozo presentada anteriormente. Siga los siguientes pasos: 1. Utilice un editor de texto para definir la interfaz. 2. Use un compilador IDL para generar el binding correspondiente a Java de la interfaz Pozo. 3. Edite los archivos PozoOperations.java y Pozo.java y estudie su contenido.
IDL
Tipos de datos bsicos
Tipos enteros:
1. Short/unsigned short. Enteros de 16 bits 2. long/unsigned long. Enteros de 32 bits 3. Long long/unsigned long long. Enteros de 64 bits
Tipos de Punto flotante
IDL
Tipos de datos bsicos
Tipo char
caracteres ISO Latin-1 (8859.1). Pueden sufrir transformaciones al ser transmitidos a travs del sistema de comunicacin
Tipo wchar
IDL
Tipos de datos bsicos
Tipo Boolean
TRUE y FALSE.
Tipo Octet
IDL
Tipos de datos complejos
Estructuras 1. Similares a las estructuras en lenguaje C
struct ubicacion { long latitud; long longitud; };
Tipos enumerados
1.
1.
IDL
Tipos de datos complejos
Tipos definidos por el usuario
Similar
al typedef de C++
Arreglos
Arreglos
IDL
Tipos de datos complejos
Secuencias
Son
arreglos unidimensionales con un tamao mximo fijo y una longitud que puede variar en tiempo de ejecucin
typedef sequence<long, 10> s; // delimitada typedef sequence<long> s; // sin limite
Se
IDL
Tipos de datos complejos
Strings
Son
IDL
Herencia
IDL
Herencia
... interface PozoGasLift : Pozo { void actualizarPresion(in long presion); long devolverPresion(); }; interface PozoBES : Pozo { void actualizarCorriente(in double c); double devolverCorriente(); }; };
IDL
Excepciones
CORBA permite el manejo de excepciones remotas Para que una aplicacin pueda lanzar una excepcin, sta debe ser declarada:
...
REFERENCIAS
REFERENCIAS
Para hacer una solicitud el cliente utiliza una referencia a un objeto Cuando un nuevo objeto es creado se crea una nueva referencia Los objetos son creados en la aplicacin servidora Para poder hacer una solicitud el cliente debe obtener, de alguna manera, la referencia al objeto
REFERENCIAS
Inicialmente el cliente no tiene acceso a la referencia de un nuevo objeto creado en la aplicacin servidora
Crear pozo
Referencia al Pozo
Aplicacin cliente
ORB
ORB
Referencia
Pozo
Aplicacin servidora
REFERENCIAS
A continuacin se presenta un mecanismo simple para obtener una referencia
// crear un pozo PozoImpl p = new PozoImpl(2); org.omg.CORBA.Object obj = poa.servant_to_reference(p); Pozo pozo = PozoHelper.narrow(obj);
REFERENCIAS
Si se tiene una referencia al objeto, se puede hacer una solicitud de la siguiente manera:
Pozo p; // declaracin de variable
REFERENCIAS
Convertir una referencia a string
Una aplicacin servidora puede pedir al ORB que
de datos
La aplicacin cliente puede leer la referencia-string
Se requiere que tanto el programa cliente como el servidor tengan acceso a archivos comunes Por esta razn este mtodo no puede ser usado en todos los casos
REFERENCIAS
Aplicacin servidora
Pozo
Escribir referencia
ORB
ORB
Archivos en disco
REFERENCIAS
Escribir una referencia a un archivo
// Arrancar el ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,nul) ... // Crear el objeto PozoImpl p = new PozoImpl(2); org.omg.CORBA.Object obj = poa.servant_to_reference(p); // convertir la refencia en string String ref = orb.object_to_string( obj ); // Escribir la referencia a un archivo FileWriter out = new FileWriter("pozo.ref"); out.write( ref ); out.close();
REFERENCIAS
Leer una referencia de un archivo
// Leer la referencia del pozo de un archivo FileReader f = new FileReader("pozo.ref"); BufferedReader r = new BufferedReader(f); String ref = r.readLine(); // convertir la refencia-string en refencia CORBA
org.omg.CORBA.Object obj = orb.string_to_object(ref);
// invocar operaciones
int prod = p.devolverProduccionCrudo();
REFERENCIAS
Ejemplo: aplicaciones cliente y servidor separadas. Servidor:
import import import import java.io.*; org.omg.CORBA.*; org.omg.PortableServer.*; aplpozos.*;
public class Servidor { public static void main(String[] args) { try { //inicializar el orb ORB orb = ORB.init( args, null ); // inicializar el POA POA poa = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); // crear un Pozo PozoImpl pozoImpl = new PozoImpl( 1 ); // crear la referencia org.omg.CORBA.Object obj = poa.servant_to_reference( pozoImpl ); ...
REFERENCIAS
Ejemplo: aplicaciones cliente y servidor separadas. Servidor
... // convertir la referencia a string FileWriter out = new FileWriter("pozo.ref"); out.write( orb.object_to_string( obj ) ); out.close(); // esperar solicitudes orb.run(); } catch( UserException e ) { System.err.println(e); } catch( SystemException e ) { System.err.println(e); } catch( IOException e ) { System.err.println(e); } } }
REFERENCIAS
Ejercicio no. 2. Implemente la aplicacin presentada en esta seccin. Siga los siguientes pasos: 1.Agregue una nueva operacin devolverProduccion void devolverProduccion(out long ProdCrudo, out long ProdGas); 2.Implemente las clases PozoImpl, Servidor y Cliente presentadas en esta seccin
REFERENCIAS
Obtener referencias mediante una fbrica
El cliente solicita a un objeto fbrica (factory
implementar igual que cualquier otro objeto (no hay fbricas predefinidas)
Para obtener una referencia de esta manera es
REFERENCIAS
Objeto fbrica
Aplicacin cliente
ORB
Referencia al pozo
ORB
Crear pozo
Referencia
Solicitudes
Pozo
Aplicacin servidora
REFERENCIAS
Obtener una referencia al crear un objeto
// Aplicacin cliente ... Pozo p; p = fabricaPozos.crearPozo( ); int prod = p.devolverProduccinCrudo( ); ...
REFERENCIAS
Declaracin IDL de una fbrica
interface FabricaPozos { Pozo crearPozo(in long id); };
REFERENCIAS
Implementacin de la fbrica
class FabricaPozosImpl extends FabricaPozosPOA { public Pozo crearPozo(String idPozo) { try { PozoImpl pozoImpl = new PozoImpl(idPozo); org.omg.CORBA.Object obj = poa.servant_to_reference(pozoImpl); Pozo p = PozoHelper.narrow(obj); return p; } catch( SystemException se ) { return null; } catch( UserException ue ) { return null; } } }
REFERENCIAS
Aplicacin servidora
... public class Servidor { public static void main(String[] args) { try { //inicializar el orb y el POA ... // crear la fbrica FabricaPozosImpl fabrica = new FabricaPozosImpl(); // crear la referencia org.omg.CORBA.Object obj = poa.servant_to_reference(fabrica); // convertir la referencia a string FileWriter out = new FileWriter("fabrica.ref"); out.write( orb.object_to_string( obj ) ); out.close(); // esperar solicitudes orb.run(); } // capturar excepciones ... } }
REFERENCIAS
Aplicacin cliente
public class Cliente { public static void main(String args[]) { try { // inicializar el orb ORB orb = ORB.init( args, null ); String ref = new BufferedReader( new FileReader("fabrica.ref")).readLine(); org.omg.CORBA.Object obj = orb.string_to_object( ref ); // Obtener la referencia a la fabrica FabricaPozos fabrica = FabricaPozosHelper.narrow( obj ); // verificar si se obtuvo la referencia if (fabrica == null) { System.out.println("La referencia no es vlida"); System.exit( 1 ); } // crear un pozo y usar un pozo Pozo p = fabrica.crearPozo(1); int prod = p.devolverProduccionCrudo(); } ...
REFERENCIAS
Ejercicio no. 3. Implemente la clase fbrica de pozos. Siga los siguientes pasos: 1.Defina la interfaz FabricaPozos. 2.Implemente el objeto FabricaPozosImpl. 3.Modifique las aplicaciones Cliente y Servidor para que utilicen la fbrica.
REFERENCIAS
Obtener referencias mediante un servicio de nombres El cliente puede invocar un servicio de bsqueda para obtener una referencia CORBA define un servicio de nombres: Interoperable Name Service Este servicio no crea objetos, sino que almacena referencias a objetos e informacin asociada (nombre, propiedades) y entrega la referencia cuando se le hace la solicitud El Name Service es un objeto CORBA, de manera que para obtener una referencia mediante este servicio se requiere tener una referencia al mismo
REFERENCIAS
Name Service
Registrarse
ORB
Referencia al pozo
ORB
Solicitudes
Pozo
REFERENCIAS
Utilizar la operacin resolve_initial_reference Se puede obtener una referencia a objetos que implementan servicios bsicos mediante la operacin resolve_initial_reference Esta solicitud se hace directamente al ORB. No requiere una referencia previa
... Object obj = null; obj = orb.resolve_initial_reference(NameService); ...
REFERENCIAS
Para que el ORB pueda resolver referencias iniciales es necesario configurarlo para indicarle como localizar los servicios bsicos Cada paquete CORBA tiene su propia mecanismo de configuracin Por ejemplo el ORB JavaORB utiliza un archivo de configuracin donde se definen las referencias iniciales de la siguiente manera:
REFERENCIAS
Archivo de configuracin del JavaORB
# # Java ORB Initial References # version 1.2 #
# Object Loader ObjectLoader Host(xxxx), ObjectId(IDL:JavaORB/loader:1.0), Key(ObjectLoader), port(2000) # Naming Service NamingService Host(xxxx), ObjectId(IDL:omg.org/CosNaming/NamingContext:1.0), Key(NamingRoot), Port(2001) # Interface Repository InterfaceRepository Host(cli29c5), ObjectId(IDL:org.omg/CORBA/Repository:1.0), Key(IRRoot), Port(2004)
(ADAPTADORES DE OBJETOS)
OBJECT ADAPTERS
OBJECT ADAPTERS
Los adaptadores de objetos (object adapters) se ubican entre los objetos y el ORB El ORB delega en el Adaptador de objetos las operaciones de crear y destruir referencias y la activacin y desactivacin de objetos El primer object adapter fue el BOA - basic object adapter Posteriormente se desarroll el POA - portable object adapter
OBJECT ADAPTERS
Cliente
ORB
Object adapter
Objeto CORBA
OBJECT ADAPTERS
Inicialmente se cre el BOA (basic object adapter) El BOA estaba subespecificado Cada implementador desarroll sus extensiones, por lo que el BOA dej de ser interoperable En respuesta a este problema el OMG desarroll el POA (portable object adpater) El POA est bien estandarizado y es interoperable Actualmente se recomienda usar el POA en lugar del BOA
Referencia de objeto
Conexin lgica
Objeto CORBA
Servant
Solicitud
ORB servidor
Aplicacin servidora
Servidores (servants)
Solicitudes
ORB
POA
POA Manager
org.omg.CORBA.Object obj = _poa().servant_to_reference(pozoImpl); Pozo pozo = PozoHelper.narrow(obj); return pozo; } catch( SystemException se ) { return null; } catch( UserException ue ) { return null; }
Las solicitudes son colocades en cola y despachadas una a la vez (modelo de un solo hilo de ejecucin) Cada solicitud es ejecutada en un hilo de ejecucin separado
org.omg.CORBA.Object obj = _poa().servant_to_reference(pozoImpl); Pozo pozo = PozoHelper.narrow(obj); return pozo; } catch( SystemException se ) { return null; } catch( UserException ue ) { return null; }
USE_DEFAULT_SERVANT
En este caso el POA usar un nico sirviente para todas las solicitudes. El programador debe sealarle al POA cual es el sirviente por defecto:
... PozoImpl p = new PozoImpl(1); // crear el sirviente ... poa.set_servant(p); // asignar el sirviente // por defecto ...
USE_SERVANT_MANAGER
En este caso, cuando un objeto inactivo recibe una solicitud, el POA usar un manejador de sirvientes (servant manager) para obtener el sirviente que se asignar al objeto. Manejador de sirvientes: un objeto que el POA invoca para obtener un sirviente y para destruir el siriviente en caso necesario Hay dos tipos:
Ejercicio no. 4. Implemente la aplicacin de objetos persistentes presentada en esta seccin. Siga los siguientes pasos: 1.Agregue los mtodos GuardarEstado y LeerEstado a la clase PozoImpl. 2.Implemente la clase ActivadorPozos. 3.Implemente una clase CreadorPozos que pida al usuario los datos del pozo e invoque la fbrica para crear el pozo. 4.Implemente una clase Consulta que pida el id del pozo, lea la refencia de un archivo cuyo nombre es el ID del pozo e imprima los datos del mismo. 5.Utilice la clase Servidor suministrada para probar la aplicacin.
SERVICIOS CORBA
SERVICIOS CORBA
Los servicios CORBA son una coleccin de interfaces y objetos que soportan funciones bsicas para el uso y la implementacin de objetos Estos servicios son necesarios para desarrollar cualquier aplicacin y son independientes de cualquier aplicacin particular Por ejemplo el servicio de nombres permite registrar referencias CORBA con un nombre y retribuir las referencias Los servicios son objetos CORBA
SERVICIOS CORBA
Algunos de los servicios ms importantes: Nombres (Naming) Notificacin (Notification) Persistencia (Persistent Object) Transacciones (Transaction)
SERVICIOS CORBA
Servicio de nombres El servicio de nombres (name service) es un directorio de objetos CORBA El servicio de nombres de CORBA permite:
Asociar nombres con objetos CORBA (registrar un
Si se conoce el nombre con el que un objeto est registrado se puede obtener su referencia haciendo una consulta al servicio de nombres (similar a un directorio telefnico)
SERVICIOS CORBA
Organizacin del servicio de nombres
El servicio de nombres consiste en una coleccin
contener permite
otros crear
SERVICIOS CORBA
Root context
Pozos de gas lift Pozos BES
p500
SERVICIOS CORBA
Uso del servicio de nombres Se debe ejecutar el servidor de nombres El servidor de nombres crea un contexto vaco denominado rootContext Para acceder al root context se usa la operacin resolve_initial_references
org.omg.CORBA.Object root = orb.resolve_initial_references("NameService"); NamingContextExt rc = NamingContextExtHelper.narrow(root);
SERVICIOS CORBA
Uso del servicio de nombres Para registrar un objeto en el root context (o en cualquier otro contexto) se usa la operacin bind
// registrar un pozo en el servicio de nombres Pozo p; ... String id = p.devolverId(); rc.bind(rc.to_name(id), p);
SERVICIOS CORBA
Uso del servicio de nombres
Para crear un nuevo contexto de nombres dentro de otro se usa la operacin bindNewContext.
// crear un contexto dentro de otro contexto rc.bind_new_context(rc.to_name("Pozos"));
Para registrar objetos dentro del contexto Pozos se puede obtener su referencia y luego usar la operacin bind.
// obtener el contexto de pozos org.omg.CORBA.Object obj = rc.resolve(rc.to_name("Pozos")); NamingContextExt pozos=NamingContextExtHelper.narrow(obj); // registrar un pozo Pozo p; ... pozos.bind(rc.to_name("104"), p);
SERVICIOS CORBA
Uso del servicio de nombres
SERVICIOS CORBA
Ejemplo: aplicacin de pozos con servicio de nombres Se presenta una aplicacin de pozos que maneja pozos persistentes La aplicacin servidora guarda la referencia de la fbrica de pozos en el root context Adicionalmente crea un contexto Pozos donde se registrarn todos los pozos creados Se incluye una aplicacin de reporte que lista el contenido del contexto Pozos
SERVICIOS CORBA
Ejemplo: aplicacin de pozos con servicio de nombres
import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; public class Servidor { public static void main(String[] args) { try { //iniciar el orb ORB orb = ORB.init( args, null ); // iniciar el POA POA rootPoa = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); // crear el poa que manejara los pozos org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[4]; policies[0] = rootPoa.create_id_assignment_policy (IdAssignmentPolicyValue.USER_ID); policies[1] = rootPoa.create_lifespan_policy (LifespanPolicyValue.PERSISTENT); policies[2] = rootPoa.create_servant_retention_policy (ServantRetentionPolicyValue.RETAIN);
SERVICIOS CORBA
Ejemplo: aplicacin de pozos con servicio de nombres
policies[3] = rootPoa.create_request_processing_policy (RequestProcessingPolicyValue.USE_SERVANT_MANAGER); POA pozoPoa = rootPoa.create_POA("PozoPOA", rootPoa.the_POAManager(), policies); // crear el servant manager y activarlo ActivadorPozos activador = new ActivadorPozos(); pozoPoa.set_servant_manager(activador._this(orb)); // crear la fabrica de polinomios FabricaPozosImpl f = new FabricaPozosImpl(pozoPoa, orb); org.omg.CORBA.Object obj = rootPoa.servant_to_reference(f); // registrar la referencia en el servicio de nombres org.omg.CORBA.Object r = orb.resolve_initial_references("NameService"); NamingContextExt rc = NamingContextExtHelper.narrow(r); rc.bind(rc.to_name("Fabrica de pozos"), obj); //crear el contexto que contendr las referencias de los pozos rc.bind_new_context(rc.to_name("Pozos")); rootPoa.the_POAManager().activate(); // esperar solicitudes orb.run(); }
SERVICIOS CORBA
Ejemplo: aplicacin de pozos con servicio de nombres
public class CreadorPozos { public static void main(String args[]) { try { // iniciar el ORB ORB orb = ORB.init( args, null ); // obtener la referencia de la fabrica de pozos //en el servicio de nombres org.omg.CORBA.Object root = orb.resolve_initial_references("NameService"); NamingContextExt rc = NamingContextExtHelper.narrow(root); org.omg.CORBA.Object obj = rc.resolve(rc.to_name("Fabrica de pozos")); FabricaPozos f = FabricaPozosHelper.narrow( obj ); // verificar si la referencia era del tipo correcto if( f == null ) { System.err.println("Error, referencia invlida"); System.exit( 1 ); }
SERVICIOS CORBA
Ejemplo: aplicacin de pozos con servicio de nombres
// verificar si la referencia era del tipo correcto if( f == null ) { System.err.println("Error, referencia invalida"); System.exit( 1 ); } InputStreamReader r = new InputStreamReader(System.in); LineNumberReader l = new LineNumberReader(r); // pedir datos al usuario System.out.print("id del pozo: "); String id = l.readLine(); System.out.print("Produccin de crudo: "); int prodCrudo = Integer.parseInt(l.readLine()); System.out.print("Produccin de gas: "); int prodGas = Integer.parseInt(l.readLine()); // crear el pozo Pozo p = f.crearPozo(id); p.actualizarProduccionCrudo(prodCrudo); p.actualizarProduccionGas(prodGas); // registrar el pozo en el servicio de nombres rc.bind(rc.to_name("Pozos/"+id), p); p.desactivar(); } //capturar excepciones
SERVICIOS CORBA
Ejemplo: aplicacin de pozos con servicio de nombres
public class Consulta { public static void main(String args[]) { try { // iniciar el ORB ORB orb = ORB.init( args, null ); // obtener la referencia del servicio de nombres org.omg.CORBA.Object root = orb.resolve_initial_references("NameService"); NamingContextExt rc = NamingContextExtHelper.narrow(root); InputStreamReader r = new InputStreamReader(System.in); LineNumberReader l = new LineNumberReader(r); System.out.print("Id del pozo: "); String id = l.readLine(); ...
SERVICIOS CORBA
Ejemplo: aplicacin de pozos con servicio de nombres
... // obtener la referencia del pozo en el servicio nombres org.omg.CORBA.Object obj = rc.resolve(rc.to_name("Pozos/"+id)); // hacer el narrow a Pozo Pozo p = PozoHelper.narrow( obj ); // verificar si la referencia era del tipo correcto if( p == null ) { System.out.println("Error, el pozo "+id+" no existe"); System.exit( 1 ); } int prodCrudo = p.devolverProduccionCrudo(); int prodGas = p.devolverProduccionGas(); System.out.println("Produccin de crudo: " + prodCrudo); System.out.println("Produccin de gas: " + prodGas); p.desactivar(); }
SERVICIOS CORBA
La operacin list devuelve el contenido de un contexto de nombres
try { BindingListHolder listHolder = new BindingListHolder(); BindingIteratorHolder iteratorHolder = new BindingIteratorHolder(); // obtener la lista de pozos pozos.list(0, listHolder, iteratorHolder); BindingIterator iterator = iteratorHolder.value; BindingHolder bindingHolder = new BindingHolder(); // recorrer la lista e imprimir cada pozo System.out.println("ID Prod. crudo Prod. gas"); while (iterator.next_one(bindingHolder)) { Binding binding = bindingHolder.value; NameComponent[] id = binding.binding_name; obj = pozos.resolve(id); Pozo p = PozoHelper.narrow(obj); System.out.println(p.devolverId()+" "+ p.devolverProduccionCrudo()+" "+ p.devolverProduccionGas()); } } catch (UserException ex) { System.out.println(ex); }
Ejercicio no. 5. Modifique la aplicacin de pozos para que, en lugar de guardar referencias en disco utilice el servicio de nombres CORBA para registrar la referencia de la fbrica de pozos y los pozos creados.
Ejercicio no. 6. Implemente una aplicacin que produzca un listado de los pozos registrados en el contexto Pozos de la aplicacin implementada en el ejercicio anterior.
Ejercicio no. 7. Modifique la aplicacin de pozos para que incluya las interfaces PozoGasLift y PozoBES definidas en la seccin 4.4. Siga los siguientes pasos: 1.Agregue a la interfaz Pozo el mtodo string toString()que devuelve un string con la informacin del Pozo (id, tipo y produccin). 2.Implemente los tipos PozoBES y PozoGasLift. 3.Defina un tipo enumerado TipoPozo que tenga los valores: PozoBES y PozoGasLift. 4.Modifique la fbrica de pozos para que tome como parmetro adicional el tipo de pozo requerido y cree el pozo del tipo correspondiente. 5.Modifique la aplicacin de crear pozos para que pida al usuario el tipo de pozo y cree el pozo correspondiente. 6.Modifique la aplicacin de reporte para que imprima la informacin de los diferentes tipos de Pozo.