Академический Документы
Профессиональный Документы
Культура Документы
CONTENIDO
Introducci Introduccin
Qu Qu es CORBA? Caracter Caractersticas del CORBA Porqu Porqu usar Objetos distribuidos distribuidos?
CONTENIDO
Referencias
Cmo hacer solicitudes a objetos CORBA Cmo obtener referencias a objetos CORBA
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
TCP/IP
Cliente Proceso A
Objeto
Llamada directa
Cliente Proceso C
Cliente
Computador A
Proceso B
Computador B
Objeto CORBA
Solicitud
ORB cliente
Aplicacin cliente
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
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
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
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
ARQUITECTURA
Stubs IDL
Interfaz ORB
IDL Skeleton
Object Adapter
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
12
Objeto CORBA
Solicitud
ORB cliente
Aplicacin cliente
ORB servidor
Aplicacin servidora
13
Compilador IDL: toma como entrada un archivo fuente IDL y produce como salida:
Stubs IDL Esqueletos IDL (IDL (IDL skeletons) skeletons)
14
Compilador IDL
class Pozo { int devolverProduccionCrudo(); int devolverProduccionGas(); }
Compilador 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 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
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
19
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
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
Tipos enumerados
Similares al tipo enum de Pascal y C
emum TipoPozo { flujo_natural, gas_lift, bes };
Arreglos
Arreglos multidimensionales. Sintaxis similar a la del lenguaje C
typedef long a[10]; typedef long b[20][20];
21
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;
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
Usando un Objeto
Si se tiene una referencia al objeto, se puede hacer una solicitud de la siguiente manera:
Pozo p; // declaracin de variable
26
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
Aplicacin servidora
Pozo
Escribir referencia
ORB
ORB
Archivos en disco
27
28
Objeto fbrica
Aplicacin cliente
ORB
Referencia al pozo
ORB
Crear pozo
Referencia
Solicitudes
Pozo
Aplicacin servidora
29
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
Resolver(
Name Service
Registrarse
zo l po ia a c n ere Ref
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)
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
Referencia de objeto
Conexin lgica
Objeto CORBA
Servant
Solicitud
ORB servidor
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
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
40
41
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
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); ...
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.
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.
45
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 ... }
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
53
54
55