Sie sind auf Seite 1von 140

Universidad del Zulia Facultad de Ingeniera Instituto de Clculo Aplicado

PROCESAMIENTO DISTRIBUIDO UTILIZANDO

CORBA

Prof. Carlos Arvalo, M.Sc.

CONTENIDO
Introduccin
1. 2. 3.

Qu es CORBA? Caractersticas del CORBA Porqu usar Objetos distribuidos?

Arquitectura del CORBA ORB (Object Request Broker)


1. 2.

Descripcin Componentes Stubs Esqueletos

IDL (Lenguaje de Definicin de Interfaces)


1. 2.

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)

Adaptadores de Objetos (Objetct Adapters)


1. 2.

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


Invocacin transparente de objetos

TCP/IP

Comunicacin entre procesos

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

Flujo real de la solicitud

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

ORB (Object Request broker)

Common services Servicios 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

... construir_mensaje( s ); enviar_mensaje( B, s ); esperar_respuesta( r ); decodificar( r ); procesar_respuesta( ); ...

While (true) { esperar_mensaje( s ); decodificar_mensaje( s ); procesar_solicitud( ); construir_mensaje( r ); enviar_mensaje(A, r); }

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


Estructura del CORBA Cliente Objeto

Stubs IDL

Dynamic Invocation Interface

Interfaz ORB

Dynamic skeleton interface

IDL Skeleton

Object Adapter

ORB Ncleo del ORB

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:

Ubicacin de los objetos.


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.

Estado del servidor.


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

Flujo real de la solicitud

ORB servidor

Aplicacin cliente

Aplicacin servidora

IDL
IDL. Lenguaje de definicin de interfaces
Un lenguaje que permite definir las interfaces

CORBA
Interfaz CORBA:

Un conjunto de operaciones y sus parmetros

Compilador IDL: toma como entrada un archivo

fuente IDL y produce como salida: 1. Stubs IDL 2. Esqueletos IDL (IDL skeletons)

IDL
IDL. Lenguaje de definicin de interfaces
El

IDL es independiente programacin

del

lenguaje

de

Existen compiladores IDL para diversos lenguajes

de programacin: C, C++, Java, Pascal, y otros


Soporta diferentes tipos de datos, incluyendo

tipos bsicos (enteros, floats, etc.), estructuras, objetos, arreglos dinmicos, strings, entre otros.

IDL

interface Pozo { int devolverProduccinCrudo(); int devolverProduccinGas(); }

class Pozo { int devolverProduccionCrudo(); int devolverProduccionGas(); }

Compilador IDL

Stub IDL (archivo fuente en lenguaje C++)


class Pozo { int devolverProduccionCrudo(); int devolverProduccionGas(); }

Archivo fuente en lenguaje IDL

Esqueleto IDL (archivo fuente en lenguaje C++)

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

Contienen el cdigo necesario para canalizar la

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

Contienen los esqueletos (definiciones de las

clases sin la implementacin de los mtodos) de las interfaces CORBA

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

1. float. IEEE std 754-1985 2. double. IEEE std 754-1985

IDL
Tipos de datos bsicos
Tipo char

 Caracteres de 8 bits basados en el juego de

caracteres ISO Latin-1 (8859.1). Pueden sufrir transformaciones al ser transmitidos a travs del sistema de comunicacin

Tipo wchar

 Caracteres de ms de un byte, por ejemplo

Unicode. El tamao y el juego de caracteres no est especificado

IDL
Tipos de datos bsicos
Tipo Boolean

 TRUE y FALSE.
Tipo Octet

 Una cantidad de 8 bits que no sufre ninguna

conversin al ser transmitida por el sistema de communicacin


Tipo Any

 Una variable de tipo any puede contener

valores de cualquier otro tipo de dato

IDL
Tipos de datos complejos
Estructuras 1. Similares a las estructuras en lenguaje C
struct ubicacion { long latitud; long longitud; };

Tipos enumerados
1.
1.

Similares al tipo enum de Pascal y C


emum TipoPozo { flujo_natural, gas_lift, bes };

IDL
Tipos de datos complejos
Tipos definidos por el usuario
 Similar


al typedef de C++

typedef short Identificador;

Arreglos
 Arreglos

multidimensionales. Sintaxis similar a la del lenguaje C


typedef long a[10]; typedef long b[20][20];

 

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
 

pueden declarar secuencias de secuencias

typedef sequence<s> s2; typedef sequence< sequence<long> > s;

IDL
Tipos de datos complejos
Strings
 Son
 

secuencias de caracteres con o sin lmite

string s; // sin lmite string s<10>; // con limite

IDL
Herencia

Una interfaz puede derivarse de otra Puede haber herencia mltiple


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); }; ...

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:
...

exception IdNoValido { long id; string mensaje; };


...

void asignarId(in long id) raises (IdNovalido); ...

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

// obtener referencia; .... // hacer solicitud int prod = p.devolverProduccionCrudo();

REFERENCIAS
Convertir una referencia a string
Una aplicacin servidora puede pedir al ORB que

convierta la referencia en un string (una cadena de caracteres)


El string se puede almacenar en un archivo o base

de datos
La aplicacin cliente puede leer la referencia-string

del archivo y pedir al ORB que la convierta de nuevo en referencia viva

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


Obtener una referencia desde un archivo


Aplicacin cliente
Referencia al pozo Leer referencia Solicitudes

Aplicacin servidora

Pozo
Escribir referencia

ORB

ORB

... Datos.dat Pozo.ref ...

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);

// hacer el narrow a Pozo


Pozo p = PozoHelper.narrow(obj);

// verificar si la operacin fue correcta


if( p == null ) { System.out.println("Error al obtener la referencia"); System.exit( 1 ); }

// 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

object) la creacin de un nuevo objeto


El objeto fbrica crea el objeto en la aplicacin

servidora y devuelve una referencia al mismo


El objeto fbrica es un objeto CORBA y se debe

implementar igual que cualquier otro objeto (no hay fbricas predefinidas)
Para obtener una referencia de esta manera es

necesario previamente tener la referencia del objeto fbrica

REFERENCIAS


Obtener referencias mediante una fbrica

Referencia al objeto fbrica

Crear pozo Referencia

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


Obtener una referencia mediante un servicio de nombres


Referencia al Name service

Name Service
Registrarse

Aplicacin cliente Aplicacin servidora

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


El object adapter se sita entre el ORB y el objeto

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

PORTABLE OBJECT ADAPTER


POA: Portable Object Adapter El POA es responsable de:
Crear referencias a objetos Activar objetos Despachar las solicitudes que se hacen a los objetos Desactivar objetos

PORTABLE OBJECT ADAPTER




Mecanismo de despacho de solicitudes

Referencia de objeto

Conexin lgica

Objeto CORBA

Servant
Solicitud

POA ORB cliente


Flujo real de la solicitud

ORB servidor

PORTABLE OBJECT ADAPTER




Mecanismo de despacho de solicitudes

Aplicacin servidora
Servidores (servants)

Solicitudes

ORB

POA
POA Manager

PORTABLE OBJECT ADAPTER


Algunas definiciones
Objeto CORBA. Un ente capaz de recibir solicitudes, realizar operaciones en respuesta a dichas solicitudes y devolver el resultado. Adicionalmente puede tener estado (variables internas). Los solicitudes pueden ser locales o remotas Referencia CORBA. Un bloque de datos que contiene toda la informacin necesaria para determinar la ubicacin de un objeto y poder hacer solicitudes al mismo Clave del objeto (object key). Es una parte de la referencia de un objeto. Identifica al objeto dentro del contexto del ORB donde reside.

PORTABLE OBJECT ADAPTER


Algunas definiciones
ID del objeto (object ID). Es una parte de la clave del objeto. El ID identifica al objeto dentro del contexto del POA que lo maneja Servant. El sirviente es el objeto en el lenguaje de implementacin que realiza las operaciones solicitadas al objeto CORBA. Si dicho lenguaje no es orientado a objetos, el sirviente puede ser una estructura de datos con una serie de operaciones asociadas

PORTABLE OBJECT ADAPTER


Sirviente (servant)
Es la unidad de ejecucin que encarna al objeto CORBA. Por ejemplo, un objeto en Java o en C++ (Tambin puede ser un proceso). Un objeto CORBA es una entidad conceptual: un ente capaz de recibir solicitudes y ... El objeto existe siempre que exista una referencia al mismo Cuando el objeto recibe una solicitud debe ser asociado con un sirviente que realice la tarea (como suelen hacer los sirvientes)

PORTABLE OBJECT ADAPTER


Cuando el objeto no tiene un sirviente asociado se dice que est inactivo. Cuando se le asocia un sirviente se dice que est activo Activar un objeto consiste en asociarlo a un sirviente Desactivar un objeto consiste en romper la asociacin con su sirviente Un mismo sirviente puede ser asociado con varios objetos. Los sirvientes pueden destruirse cuando se desactivan los objetos o pueden permanecer Estas caractersticas permiten crear aplicaciones escalables que utilicen eficientemente los recursos de la mquina

PORTABLE OBJECT ADAPTER


Ejemplo. Se crea un objeto y se activa al mismo tiempo
... // crear el sirviente PozoImpl pozoImpl = new PozoImpl(id); try {
// crear la referecia

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; }

PORTABLE OBJECT ADAPTER


La activacin del objeto puede hacerse :
Al momento de crear el objeto. Explcitamente, solicitando al POA que active el objeto. Cuando se reciba una solicitud estando el objeto inactivo. Cada vez que se recibe una solicitud.

PORTABLE OBJECT ADAPTER


Objeto no existe Objeto existe Destruir Activar objeto desactivar objeto Objeto activado Objeto desactivado

PORTABLE OBJECT ADAPTER


El POA es altamente configurable Existen diversas opciones para cada una de las responsabilidades del POA agrupadas en categoras Para manejar las diferentes categoras el POA define lo que se conoce como polticas del POA (POA policies) A continuacin se describen algunas de las categoras y las polticas correspondientes

PORTABLE OBJECT ADAPTER


Poltica de unicidad del ID Determina si ms de un ID de objeto puede referirse al mismo sirviente Posibles valores: UNIQUE_ID y MULTIPLE_ID Valor por defecto: UNIQUE_ID

PORTABLE OBJECT ADAPTER


Poltica de asignacin del ID Determina si el ID del objeto lo asigna el programador o el POA Posibles valores: USER_ID y SYSTEM_ID Valor por defecto: SYSTEM_ID

PORTABLE OBJECT ADAPTER


Tiempo de vida Determina si los objetos son transitorios o persistentes. Es decir si los objetos estn disponibles despus de que el POA haya sido destruido Posibles valores: TRANSIENT y PERSISTENT Valor por defecto: TRANSIENT

PORTABLE OBJECT ADAPTER


Poltica de retencin de sirvientes
Determina si el POA mantiene la asociacin entre el ID del objeto y el sirviente en su Mapa de Objetos Activos (Active Object Map) Posibles valores: RETAIN y NON_RETAIN Valor por defecto: RETAIN

PORTABLE OBJECT ADAPTER


Poltica de procesamiento de solicitudes Determina que debe utilizar el POA para localizar al sirviente:
  

Mapa de objetos activos Default servant Servant locator o Servant activator

Posibles valores: USE_SERVANT_MANAGER, USE_ACTIVE_OBJECT_MAP, USE_DEFAULT_SERVANT Valor por defecto: USE_ACTIVE_OBJECT_MAP

PORTABLE OBJECT ADAPTER


Poltica de hilos (threads).
El POA ofrece dos opciones al momento de despachar las solicitudes a los servidores (multithreding policy):

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

Posibles valores: ORB_CTRL_MODEL y SINGLE_TREAD_MODEL

Valor por defecto: ORB_CTRL_MODEL

PORTABLE OBJECT ADAPTER


Poltica de activacin implcita
Determina si el POA puede activar implcitamente al sirviente al momento de crear el ID del objeto Posibles valores: IMPLICIT_ACTIVATION Y NO_IMPLICIT_ACTIVATION Valor por defecto: NO_IMPLICIT_ACTIVATION (excepto para el rootPOA que permite IMPLICIT_ACTIVATION)

PORTABLE OBJECT ADAPTER


Es posible que se desee que diferentes objetos utilicen polticas diferentes Cuando se define una poltica a un POA la misma se aplica a todos los objetos que maneja Sin embargo, se puede crear ms de un POA y cada POA puede tener un conjunto diferente de polticas

PORTABLE OBJECT ADAPTER


Existe un POA inicial llamado RootPOA Si no se requieren conjuntos de polticas diferentes se puede usar el RootPOA para todos los objetos Por el contrario, se pueden crear diferentes POAs y asignar polticas diferentes a cada uno

PORTABLE OBJECT ADAPTER


Como crear un POA
... // obtener la refencia al rootPOA POA rootPoa = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); // crear un nuevo poa con polticas diferentes 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); policies[3] = rootPoa.create_request_processing_policy(RequestProcessingPolicyValue, USE_SERVANT_MANAGER); POA myPoa = rootPoa.create_POA("myPOA", rootPoa.the_POAManager(), policies); ...

PORTABLE OBJECT ADAPTER


Ejemplo. Se crea un objeto y se activa al mismo tiempo
...
// crear el sirviente

PozoImpl pozoImpl = new PozoImpl(id); try {


// crear la referecia

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; }

PORTABLE OBJECT ADAPTER


Asignacin de sirvientes:
Para determinar cual sirviente utilizar el POA usa una tabla denominada AOM (active object map) Cuando el objeto es activado se agrega una entrada al AOM que asocia el ID del objeto con el sirviente Cuando el objeto es desactivado se elimina la entrada del AOM Es posible configurar el POA para que, en lugar del AOM, invoque a un objeto definido por el usuario para obtener el sirviente La poltica de procesamiento de solicitudes determina como se hace la asociacin entre el objeto y el sirviente

PORTABLE OBJECT ADAPTER


Asignacin de sirvientes:
Es posible configurar el POA para que, en lugar del AOM, invoque a un objeto definido por el usuario para obtener el sirviente La poltica de procesamiento de solicitudes determina como obtiene el POA el sirviente que va a procesar las solicitudes. Los posibles valores son:
  

USE_ACTIVE_ OBJECT_MAP USE_DEFAULT_SERVANT USE_SERVANT_MANAGER

PORTABLE OBJECT ADAPTER


Cuando el valor de la poltica es


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

PORTABLE OBJECT ADAPTER


Cuando el valor de la poltica es


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:
 

Activador de sirvientes (ServantActivator) Localizador de sirvientes (ServantLocator)

PORTABLE OBJECT ADAPTER


Activadores de sirvientes:
Son invocados cuando se hace una solicitud a un objeto inactivo o cuando el objeto es activado explcitamente mediante una invocacin al POA No son invocados cuando un objeto activo recibe solicitudes Cuando el objeto est activo y se recibe una solicitud, el POA usa el AOM para obtener el sirviente

PORTABLE OBJECT ADAPTER


Activadores de sirvientes:
Para usar un activador de sirvientes las siguientes polticas deben estar definidas:
  

Poltica de procesamiento de solicitudes: USE_SERVANT_MANAGER. Poltica de retencin de sirvientes: RETAIN.

Adems, ser necesario indicarle al POA cual es el manejador de sirvientes:


// crear el servant manager y activarlo ActivadorPozos activador = new ActivadorPozos(); pozoPoa.set_servant_manager(activador._this(orb));

PORTABLE OBJECT ADAPTER


Localizadores de sirvientes:
Son invocados cada vez que se hace una solicitud al objeto En este caso el POA no usa el AOM para localizar el sirviente en ningn momento Para usar un localizador de sirvientes las siguientes polticas deben estar definidas: Poltica de procesamiento de solicitudes:
 

USE_SERVANT_MANAGER. Poltica de retencin de sirvientes: NON_RETAIN

Tambin ser necesario definir el ServantLocator:


// crear el servant manager y activarlo LocalizadorPozos localizador = new LocalizadorPozos(); pozoPoa.set_servant_manager(localizador._this(orb));

PORTABLE OBJECT ADAPTER


Ejemplo: una aplicacin de objetos persistentes
Se presenta una aplicacin de pozos que maneja pozos persistentes Los Pozos guardan su estado en un archivo en disco Se usa un ServantActivator para obtener los sirvientes y para leer y escribir el estado de los objetos Se incluye una aplicacin de creacin de pozos y una aplicacin de consulta que pide el ID de un Pozo e imprime los datos del mismo.

PORTABLE OBJECT ADAPTER


Interfaces
module pozos { interface Pozo { string devolverId(); long devolverProduccionCrudo(); long devolverProduccionGas(); void actualizarProduccionCrudo(in long produccion); void actualizarProduccionGas(in long produccion); void desactivar(); }; interface FabricaPozos { Pozo crearPozo(in string id); }; };

PORTABLE OBJECT ADAPTER


Implementacin de pozos
public class PozoImpl extends PozoPOA { String id; int produccionCrudo; int produccionGas; PozoImpl(String id) { this.id =id; } public String devolverId() { return id; } public int devolverProduccionCrudo() { return produccionCrudo; } public void actualizarProduccionGas(int produccion) { produccionGas = produccion; }

PORTABLE OBJECT ADAPTER


Implementacin de pozos
... public void desactivar() { try { _poa().deactivate_object(_poa().servant_to_id(this)); } catch( Exception e ) { } } public void guardarEstado() { try { FileWriter f = new FileWriter("P"+id+".dat"); PrintWriter p = new PrintWriter(f); p.println(produccionCrudo); p.println(produccionGas); p.flush(); } catch (FileNotFoundException e) { } catch (IOException e) { } }

PORTABLE OBJECT ADAPTER


Implementacin de pozos
public void leerEstado() { try { FileReader f = new FileReader("P"+id+".dat"); LineNumberReader l = new LineNumberReader(f); produccionCrudo = Integer.parseInt(l.readLine()); produccionGas = Integer.parseInt(l.readLine()); } catch (FileNotFoundException e) { } catch (IOException e) { } } }

PORTABLE OBJECT ADAPTER


Aplicacin servidora
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[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));

PORTABLE OBJECT ADAPTER


Aplicacin servidora
... // crear la fabrica de pozos FabricaPozosImpl f = new FabricaPozosImpl(pozoPoa, orb); // crear la referencia org.omg.CORBA.Object obj = rootPoa.servant_to_reference(f); // escribir la referencia a un archivo FileWriter out = new FileWriter("fabrica.ref"); out.write( orb.object_to_string( obj ) ); out.close(); rootPoa.the_POAManager().activate(); // esperar solicitudes orb.run(); } // capturar excepciones ... }

PORTABLE OBJECT ADAPTER


Implementacin del manajador de sirvientes
public class ActivadorPozos extends ServantActivatorPOA { public Servant incarnate(byte[] oid, POA adapter) throws ForwardRequest { PozoImpl p = new PozoImpl(new String(oid)); p.leerEstado(); return p; } public void etherealize(byte[] oid, POA adapter, Servant serv, boolean cleanup_in_progress, boolean remaining_activations) { PozoImpl p = (PozoImpl) serv; p.guardarEstado(); } }

PORTABLE OBJECT ADAPTER


Aplicacin de crear pozos
public class CrearPozo { public static void main(String args[]) { try { // iniciar el ORB ORB orb = ORB.init( args, null ); // leer la referencia de la fabrica de pozos String ior = new BufferedReader( new FileReader("fabrica.ref")).readLine(); org.omg.CORBA.Object obj = orb.string_to_object( ior ); FabricaPozos f = FabricaPozosHelper.narrow( obj ); // verificar si la referencia era del tipo correcto if( f == null ) { System.err.println("Error, referencia invalida"); System.exit( 1 ); }

PORTABLE OBJECT ADAPTER


Aplicacin de crear pozos
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); // escribir la referencia a un archivo FileWriter out = new FileWriter("p"+id+".ref"); out.write( orb.object_to_string( p ) ); out.close(); p.desactivar(); } // capturar excepciones

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

objetos en el servicio de nombres)


Dado el nombre de un objeto, obtener su referencia

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

de objetos CORBA llamados NamingContext (Contexto de nombres)


Un NamingContext es un objeto CORBA que

almacena pares (nombre, objeto), denominados bindings


Un

NamingContext puede NamingContexts, lo cual estructuras jerrquicas o grafos

contener permite

otros crear

SERVICIOS CORBA


Servicio de nombres de CORBA


Fabrica de Pozos Pozos de flujo natural

Root context
Pozos de gas lift Pozos BES

p128 p129 p200

Naming contex Objetos finales

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);

Tambin es posible registrar el nuevo Pozo mediante el root context:


rc.bind(rc.to_name("Pozos/104"), p);

SERVICIOS CORBA
Uso del servicio de nombres

Para resolver un nombre se usa la operacin resolve.


// obtener la referencia del pozo en el servicio nombres

String id = "104"; org.omg.CORBA.Object obj = rc.resolve(rc.to_name("Pozos/"+id));


// hacer el narrow a Pozo

Pozo p = PozoHelper.narrow( obj );

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.