Vous êtes sur la page 1sur 55

PROCESAMIENTO DISTRIBUIDO UTILIZANDO CORBA

Prof. Carlos Arvalo, M.Sc.

CONTENIDO
Introducci Introduccin
Qu Qu es CORBA? Caracter Caractersticas del CORBA Porqu Porqu usar Objetos distribuidos distribuidos?

Arquitectura del CORBA ORB (Object (Object Request Broker)


Descripci Descripcin Componentes

IDL (Lenguaje de Definici Definicin de Interfaces)


Stubs Esqueletos

CONTENIDO
Referencias
Cmo hacer solicitudes a objetos CORBA Cmo obtener referencias a objetos CORBA

Adaptadores de Objetos (Objetct (Objetct adapters) adapters)


Portable Object Adapter (POA) Manejadores de sirvientes

Servicios Comunes
Servicio de nombres (Naming (Naming Service) Service)

INTRODUCCIN

Introduccin
CORBA: Common Object Request Broker Architecture. Architecture. Arquitectura del administrador de solicitudes de objetos CORBA es una tecnolog tecnologa para el manejo de objetos distribuidos Especificaci Especificacin de una arquitectura e interfaz que permite a una aplicaci aplicacin hacer solicitudes a objetos Independiente del sistema operativo, de la plataforma hardware y del lenguaje de programaci programacin Los clientes y servidores pueden residir en la misma computadora o estar distribuidos

Invocacin Transparente de Objetos


Comunicacin entre procesos

TCP/IP

Cliente Proceso A

Objeto
Llamada directa

Cliente Proceso C

Cliente

Computador A

Proceso B

Computador B

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 (Object Management Group) Group) Una organizaci organizacin formada por m ms de 700 empresas que desarrollan, venden y utilizan software El OMG desarroll desarroll OMA (Object (Object Management Architecture) Architecture) como estrategia fundamental para promover el uso de la tecnolog tecnologa orientada a objetos

OMA: Object Management Architecture


Arquitectura para la manipulaci manipulacin de objetos
Application objects Objetos aplicacin Common facilities Facilidades comunes

ORB (Object Request broker)

Common services Servicios comunes

Componentes de OMA
Objetos de aplicaci aplicacin (application (application objects). objects). Son los programas de aplicaci aplicacin que intercambian informaci informacin durante su ejecuci ejecucin Servicios comunes. Son objetos que ofrecen servicios fundamentales, tales como servicios de directorio, transacciones y persistencia. Estos servicios est estn estandarizados para que sean interoperables

ORB - Object Request Broker


El ORB (Object (Object Request Broker - Administrador de Solicitudes a Objetos) es el componente central del OMA CORBA es la especificaci 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

Objetos Distribuidos
La programaci programacin orientada objetos se presta de forma natural para el procesamiento distribuido Un objeto distribuido es un objeto que puede recibir solicitudes a trav travs de la red

Por qu objetos distribuidos?


Aplicacin B. Al ser interrogada Aplicacin A. Supervisin remota por A lee un sensor y devuelve la Debe interrogar a B para obtener lectura lecturas de sensores 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); }

Por qu objetos distribuidos?


La construcci construccin, env envo y decodificaci decodificacin de mensajes no tiene nada que ver con la aplicaci aplicacin propiamente dicha Las operaciones dependen del protocolo de red utilizado (TCP(TCP-IP, IPXIPX-SPX, etc.) Son operaciones orientadas a entrada salida

Utilizando Objetos Distribuidos


Aplicacin A
... Sensor s; // objeto remoto temperatura = s.leer(); ...

Aplicacin B
int Sensor.leer() { ... } ... orb.run();

La operaci operacin s.leer() 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 aplicaci aplicacin remota y repetir el proceso a la inversa para devolver el resultado

Tecnologas de Objetos Distribuidos


COM/DCOM (distributed (distributed component object model). model). Tecnolog Tecnologa de objetos distribuidos de Microsoft, la cual est est siendo sustituida por .NET. .NET. Tecnolog Tecnologa de objetos distribuidos de Microsoft, actualmente en desarrollo. RMI (remote method invocation). invocation). Tecnolog Tecnologa de objetos distribuidos de Java. SOAP (simple object access protocol). protocol). Tecnolog Tecnologa de objetos distribuidos basada en XML y http. http. CORBA (common (common object request broker architecture). architecture). Tecnolog Tecnologa de objetos distribuidos del OMG.

ARQUITECTURA

Componentes Principales de CORBA


Clientes Objetos CORBA ORB (Object (Object request broker Administrador de solicitudes a objetos)

Estructura del CORBA


Cliente Objeto

Stubs IDL

Dynamic Invocation Interface

Interfaz ORB

Dynamic skeleton interface

IDL Skeleton

Object Adapter

ORB Ncleo del ORB

Componentes de Corba
Cliente: Un ente que hace una solicitud a un objeto CORBA Servidor: Un ente capaz de recibir una solicitud de un cliente, realizar una acci accin (o m mltiples acciones) en respuesta a dicha solicitud y devolver un resultado Tambi Tambin recibe el nombre de Objeto, o Implementaci Implementacin de objeto (object (object implementation) implementation) Los dem dems componentes del diagrama constituyen el ORB

10

ORB
(OBJECT REQUEST BROKER)

ORB
Object Request Broker (Administrador de solicitudes a objetos) Funci Funcin: Enviar solicitudes a objetos y devolver las respuestas a los clientes Caracter Caracterstica m ms importante: transparencia

11

El ORB Oculta:
Ubicaci 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

Implementaci Implementacin de objetos.


El cliente no sabe c cmo se ha implementado el servidor, que lenguaje fue usado, en que sistema operativo o en que plataforma de hardware est est implementado

Estado del servidor.


El cliente no sabe si el servidor est est activo o no

Mecanismo de comunicaci comunicacin.


El cliente no sabe que mecanismo de comunicaci comunicacin se est est usando (TCP/IP, memoria compartida, llamada local, etc.)

Componentes del ORB


Ncleo del ORB (ORB (ORB core) core) IDL (lenguaje de definici definicin de interfaces) Stubs IDL Interfaz de invocaci invocacin din dinmica (DII) Esqueletos IDL (IDL (IDL skeletons) skeletons) Interfaz del ORB Object adapters

12

Ncleo del ORB


Es el mediador entre los clientes y los servidores
Referencia de objeto
Conexin lgica

Objeto CORBA

Solicitud

ORB cliente
Aplicacin cliente

Flujo real de la solicitud

ORB servidor
Aplicacin servidora

Interface Definition Language:IDL

13

IDL: Lenguaje de definici definicin de interfaces


Un lenguaje que permite definir las interfaces CORBA Interfaz CORBA:
Un conjunto de operaciones y sus par parmetros

Compilador IDL: toma como entrada un archivo fuente IDL y produce como salida:
Stubs IDL Esqueletos IDL (IDL (IDL skeletons) skeletons)

Caractersticas del IDL


El IDL es independiente del lenguaje de programaci programacin Existen compiladores IDL para diversos lenguajes de programaci programacin: C, C++, Java, Pascal, y otros Soporta diferentes tipos de datos, incluyendo tipos b bsicos (enteros, floats, floats, etc.), estructuras, objetos, arreglos din dinmicos, strings, strings, entre otros.

14

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

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

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

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 generados autom automticamente por el compilador IDL a partir de interfaces CORBA Los stubs deben ser incorporados en los programas cliente Contienen el c cdigo necesario para canalizar la solicitud al ORB

15

Esqueletos IDL (IDL skeletons)


Son archivos fuentes que se incorporan al programa que implementa el o los servidores definidos en el fuente IDL Son generados autom automticamente por el compilador IDL a partir de interfaces CORBA Contienen los esqueletos (definiciones de las clases sin la implementaci implementacin de los mtodos) de las interfaces CORBA

IDL: Ejemplo

module aplpozos { interface Pozo { long devolverId(); devolverId(); long devolverProduccionCrudo(); devolverProduccionCrudo(); }; };

16

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

AplicacinPozos
import org.omg.CORBA.*; org.omg.CORBA.*; import org.omg.PortableServer.*; org.omg.PortableServer.*; import aplpozos.*; aplpozos.*; public class AplicacionPozos { public static void main(String[] main(String[] args) args) { try { //iniciar //iniciar el orb ORB orb = ORB.init( ORB.init( args, args, null ); // iniciar el POA org.omg.CORBA.Object obj = orb.resolve_initial_references("RootPOA"); orb.resolve_initial_references("RootPOA"); POA poa = POAHelper.narrow(obj); POAHelper.narrow(obj); poa.the_POAManager().activate(); poa.the_POAManager().activate(); ...

17

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

18

IDL: Bindings o Mappigns


El IDL es independiente del lenguaje de programaci programacin utilizado para implementar las aplicaciones Los mappings determinan como se ven las interfaces en distintos lenguajes de programaci programacin Un mapping utiliza los recursos de cada lenguaje para poder tener acceso a objetos CORBA

IDL: Tipos de Datos Bsicos


Tipos enteros:
Short/unsigned Short/unsigned short. Enteros de 16 bits long/unsigned long/unsigned long. Enteros de 32 bits Long long/ long/unsigned long long. long. Enteros de 64 bits

Tipos de Punto flotante


float. float. IEEE std 754754-1985 double. double. IEEE std 754754-1985

19

IDL: Tipos de Datos Bsicos


Tipo char
Caracteres de 8 bits basados en el juego de caracteres ISO LatinLatin-1 (8859.1). Pueden sufrir transformaciones al ser transmitidos a trav travs del sistema de comunicaci comunicacin

Tipo wchar
Caracteres de m ms de un byte, byte, por ejemplo Unicode. Unicode. El tama tamao y el juego de caracteres no est est especificado

IDL: Tipos de Datos Bsicos


Tipo Boolean
TRUE y FALSE.

Tipo Octet
Una cantidad de 8 bits que no sufre ninguna conversi conversin al ser transmitida por el sistema de communicaci communicacin

Tipo Any
Una variable de tipo any puede contener valores de cualquier otro tipo de dato

20

IDL:Tipos de Datos Complejos


Estructuras
Similares a las estructuras en lenguaje C
struct ubicacion { long latitud; long longitud; };

Tipos enumerados
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];

21

IDL:Tipos de Datos Complejos


Secuencias
Son arreglos unidimensionales con un tama tamao m mximo fijo y una longitud que puede variar en tiempo de ejecuci 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 l lmite
string s; // sin lmite string s<10>; // con limite

22

IDL: Herencia
Una interfaz puede derivarse de otra Puede haber herencia m 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(); }; };

23

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

24

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 aplicaci 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 aplicaci aplicacin servidora
Crear pozo

Referencia al Pozo

Aplicacin cliente

ORB

ORB

Referencia

Pozo

Aplicacin servidora

25

Obtener una Referencia


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

Usando un Objeto
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();

26

Compartir una Referencia


Convertir una referencia a string
Una aplicaci 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 aplicaci aplicacin cliente puede leer la referenciareferencia-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 raz razn este m mtodo no puede ser usado en todos los casos

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

27

Escribir una referencia a un archivo


// Arrancar el ORB org.omg.CORBA.ORB orb org.omg.CORBA.ORB.init(args,nul) 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); poa.servant_to_reference(p); // convertir la refencia en string String ref = orb.object_to_string( orb.object_to_string( obj ); // Escribir la referencia a un archivo FileWriter out = new FileWriter("pozo.ref"); FileWriter("pozo.ref"); out.write( out.write( ref ); out.close(); out.close(); =

Leer una referencia de un archivo


// Leer la referencia del pozo de un archivo FileReader f = new FileReader("pozo.ref"); FileReader("pozo.ref"); BufferedReader r = new BufferedReader(f); BufferedReader(f); String ref = r.readLine(); r.readLine(); // convertir la refenciarefencia-string en refencia CORBA org.omg.CORBA.Object obj = orb.string_to_object(ref); orb.string_to_object(ref); // hacer el narrow a Pozo Pozo p = PozoHelper.narrow(obj); PozoHelper.narrow(obj); // verificar si la operaci operacin if( p == null ) { System.out.println("Error System.exit( System.exit( 1 ); } // invocar operaciones int prod = p.devolverProduccionCrudo(); p.devolverProduccionCrudo(); fue correcta al obtener la referencia"); referencia");

28

Obtener referencias mediante una fbrica


El cliente solicita a un objeto f fbrica (factory (factory object) object) la creaci creacin de un nuevo objeto El objeto f fbrica crea el objeto en la aplicaci aplicacin servidora y devuelve una referencia al mismo El objeto f fbrica es un objeto CORBA y se debe implementar igual que cualquier otro objeto (no hay f fbricas predefinidas) Para obtener una referencia de esta manera es necesario previamente tener la referencia del objeto f fbrica

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

29

Obtener referencias mediante una fbrica


// Aplicaci Aplicacin cliente ... Pozo p;

p = fabricaPozos.crearPozo( fabricaPozos.crearPozo( ); int prod = p.devolverProducci p.devolverProduccinCrudo( nCrudo( ); ...

Una fabrica
interface FabricaPozos { Pozo crearPozo(in long id); }; 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; } } }

30

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

Obtener referencias mediante un servicio de nombres


Pozo)

Referencia al Name service

Resolver(

Name Service
Registrarse

zo l po ia a c n ere Ref

Aplicacin cliente Aplicacin servidora

ORB

Referencia al pozo

ORB

Solicitudes

Pozo

31

Referencia Inicial
Utilizar la operaci operacin resolve_initial_reference resolve_initial_reference Se puede obtener una referencia a objetos que implementan servicios b bsicos mediante la operaci operacin resolve_initial_reference resolve_initial_reference Esta solicitud se hace directamente al ORB. No requiere una referencia previa
... Object obj = null; obj = orb.resolve_initial_reference(NameService); ...

Referencia Inicial
Para que el ORB pueda resolver referencias iniciales iniciales es necesario configurarlo para indicarle como localizar los servicios b bsicos Cada paquete CORBA tiene su propia mecanismo de configuraci configuracin Por ejemplo el ORB JavaORB JavaORB utiliza un archivo de configuraci configuracin donde se definen las referencias iniciales de la siguiente manera:

32

Configuracin de JavaORB
# # Java ORB Initial References # version 1.2 # # Object Loader ObjectLoader Host(xxxx), Host(xxxx), ObjectId(IDL:JavaORB/loader:1.0), Key(ObjectLoader), Key(ObjectLoader), port(2000) # Naming Service NamingService Host(xxxx), Host(xxxx), ObjectId(IDL:omg.org/CosNaming/NamingContext:1.0), Key(NamingRoot), Key(NamingRoot), Port(2001) # Interface Repository InterfaceRepository Host(cli29c5), ObjectId(IDL:org.omg/CORBA/Repository:1.0), Key(IRRoot), Key(IRRoot), Port(2004)

OBJECT ADAPTERS (ADAPTADORES DE OBJETOS)

33

Adaptadores de Objetos
Los adaptadores de objetos (object (object adapters) 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 activaci activacin y desactivaci desactivacin de objetos El primer object adapter fue el BOA - basic object adapter Posteriormente se desarroll desarroll el POA - portable object adapter

Adaptadores de Objetos
El object adapter se sit sita entre el ORB y el objeto

Cliente

ORB

Object adapter

Objeto CORBA

34

BOA
BOA: Basic Object Adapter) Adapter) Primer adaptador de objetos El BOA estaba subespecificado Cada implementador desarroll desarroll sus extensiones, por lo que el BOA dej dej de ser interoperable En respuesta a este problema el OMG desarroll desarroll el POA (portable (portable object adpater) adpater) El POA est est bien estandarizado y es interoperable Actualmente se recomienda usar el POA en lugar del BOA

POA
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

35

POA: Despacho de Solicitudes

Referencia de objeto

Conexin lgica

Objeto CORBA

Servant
Solicitud

POA ORB cliente


Flujo real de la solicitud

ORB servidor

POA: Despacho de Solicitudes

Aplicacin servidora
Servidores (servants)

Solicitudes

ORB

POA
POA Manager

36

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 informaci informacin necesaria para determinar la ubicaci ubicacin de un objeto y poder hacer solicitudes al mismo Clave del objeto (object (object key). key). Es una parte de la referencia de un objeto. Identifica al objeto dentro del contexto del ORB donde reside.

Definiciones
ID del objeto (object (object ID). Es una parte de la clave del objeto. El ID identifica al objeto dentro del contexto del POA que lo maneja Servant. Servant. El sirviente es el objeto en el lenguaje de implementaci 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

37

Sirviente (servant)
Es la unidad de ejecuci ejecucin que encarna al objeto CORBA. Por ejemplo, un objeto en Java o en C++ (Tambi (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)

Sirviente (servant)
Cuando el objeto no tiene un sirviente asociado se dice que est est inactivo. Cuando se le asocia un sirviente se dice que est est activo Activar un objeto consiste en asociarlo a un sirviente Desactivar un objeto consiste en romper la asociaci 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 caracter caractersticas permiten crear aplicaciones escalables que utilicen eficientemente los recursos de la mquina.

38

Creacin y Activacin de un Objeto


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

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

39

Activacin de Objetos
Objeto no existe
ea Cr bje t

Objeto existe

Destruir

r re fer

ro

enc

Cr ea

ia

Activar objeto desactivar objeto Objeto activado Objeto desactivado

Polticas del POA


El POA es altamente configurable Existen diversas opciones para cada una de las responsabilidades del POA agrupadas en categor categoras Para manejar las diferentes categor categoras el POA define lo que se conoce como pol polticas del POA (POA (POA policies) policies) Algunas pol polticas del POA son:
Unicidad del ID Asignaci Asignacin del ID Tiempo de vida Retenci Retencin de sirvientes Procesamiento de solicitudes Hilos (threads ) (threads) Activaci Activacin impl implcita

40

Polticas del POA


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

Polticas del POA


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

41

Como crear un POA


... // obtener la refencia al rootPOA POA rootPoa = POAHelper.narrow( POAHelper.narrow( orb.resolve_initial_references("RootPOA")); orb.resolve_initial_references("RootPOA")); // crear un nuevo poa con pol polticas diferentes org.omg.CORBA.Policy policies[] = new org.omg.CORBA.Policy[4]; policies[0] = rootPoa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID ); rootPoa.create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID); policies[1] = rootPoa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT); rootPoa.create_lifespan_policy(LifespanPolicyValue.PERSISTENT); policies[2] = rootPoa.create_servant_retention_policy(ServantRetentionPolicyValue. rootPoa.create_servant_retention_policy(ServantRetentionPolicyValue. RETAIN); policies[3] = rootPoa.create_request_processing_policy(RequestProcessingPolicyValue , rootPoa.create_request_processing_policy(RequestProcessingPolicyValue, USE_SERVANT_MANAGER); USE_SERVANT_MANAGER); POA myPoa = rootPoa.create_POA("myPOA", rootPoa.create_POA("myPOA", rootPoa.the_POAManager(), rootPoa.the_POAManager(), policies); ...

Asignacin de Sirvientes
La pol poltica de procesamiento de solicitudes determina como el POA obtiene el sirviente que va a procesar las solicitudes. Los posibles valores son:
USE_ACTIVE_ USE_ACTIVE_ OBJECT_MAP USE_DEFAULT_SERVANT USE_SERVANT_MANAGER

42

Mapa de Objetos Activos:


USE_ACTIVE_ USE_ACTIVE_ OBJECT_MAP

El POA utiliza una tabla (denominada AOM: Active Object Map) Map) para encontrar al sirviente que procesar procesar una solicitud. 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.

Sirviente nico:
USE_DEFAULT_SERVANT En este caso el POA usar usar un nico sirviente para todas las solicitudes. El programador debe se sealarle al POA cual es el sirviente por defecto:
... PozoImpl p = new PozoImpl(1); ... poa.set_servant(p); ...

// crear el sirviente // asignar el sirviente // por defecto

43

Manejador de Sirvientes:
USE_SERVANT_MANAGER En este caso, cuando un objeto inactivo recibe una solicitud, el POA usar usar un manejador de sirvientes (servant servant manager) para obtener el ( sirviente que se asignar 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 ) (ServantActivator) Localizador de sirvientes (ServantLocator ) (ServantLocator)

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

44

Activadores de Sirvientes
Para usar un activador de sirvientes las siguientes pol polticas deben estar definidas:
Pol Poltica de procesamiento de solicitudes:
USE_SERVANT_MANAGER. USE_SERVANT_MANAGER.

Pol Poltica de retenci retencin de sirvientes:


RETAIN.

Adem Adems, ser 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));

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 ning ningn momento Para usar un localizador de sirvientes las siguientes pol polticas deben estar definidas:
Pol Poltica de procesamiento de solicitudes:
USE_SERVANT_MANAGER. USE_SERVANT_MANAGER.

Pol Poltica de retenci retencin de sirvientes:


NON_RETAIN

Tambi Tambin ser ser necesario definir el ServantLocator: ServantLocator:


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

45

Ejemplo: una aplicacin de objetos persistentes


Se presenta una aplicaci 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 aplicaci aplicacin de creaci creacin de pozos y una aplicaci aplicacin de consulta que pide el ID de un Pozo e imprime los datos del mismo.

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

46

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

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) { } }

47

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) { } } }

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

48

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

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

49

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

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

50

SERVICIOS CORBA

Servicios Corba
Los servicios CORBA son una colecci coleccin de interfaces y objetos que soportan funciones bsicas para el uso y la implementaci implementacin de objetos Estos servicios son necesarios para desarrollar cualquier aplicaci aplicacin y son independientes de cualquier aplicaci aplicacin particular Por ejemplo el servicio de nombres permite registrar referencias CORBA con un nombre y retribuir las referencias Los servicios son objetos CORBA

51

Servicios Corba
Algunos de los servicios ms importantes: importantes:
Nombres (Naming) Notificaci Notificacin (Notification) Persistencia (Persistent Object) Transacciones (Transaction)

Servicio de Nombres
El servicio de nombres (name (name service) 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 est registrado se puede obtener su referencia haciendo una consulta al servicio de nombres (similar a un directorio telef telefnico)

52

Servicio de Nombres
El servicio de nombres consiste en una colecci 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 contener otros NamingContexts, NamingContexts, lo cual permite crear estructuras jer jerrquicas o grafos

Servicio de Nombres
Fabrica de Pozos Pozos de flujo natural

Root context
Pozos de gas lift Pozos BES

Naming contex Objetos finales

53

Uso del Servicio de Nombres


Se debe ejecutar el servidor de nombres El servidor de nombres crea un contexto vac vaco denominado rootContext Para acceder al root context se usa la operaci operacin resolve_initial_references
org.omg.CORBA.Object root = orb.resolve_initial_references("NameService"); NamingContextExt rc = NamingContextExtHelper.narrow(root);

Uso del Servicio de Nombres


Para registrar un objeto en el root context (o en cualquier otro contexto) se usa la operaci operacin bind
// registrar un pozo en el servicio de nombres Pozo p; ... String id = p.devolverId(); rc.bind(rc.to_name(id), p);

54

Uso del Servicio de Nombres


Para crear un nuevo contexto de nombres dentro de otro se usa la operaci 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);

Uso del Servicio de Nombres


Para resolver un nombre se usa la operaci operacin resolve. 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 )

55

Vous aimerez peut-être aussi