Está en la página 1de 33

Tema 2: Introduccin a CORBA

Qu es CORBA ? (1)
n

Permite invocar mtodos de objetos remotos sin que importe el lenguaje en el que estn escritos el llamador y el llamado, ni las plataformas (s.o. y hw.) y redes de comunicacin intermedias Incluye un buen nmero de servicios
n n n n n n n

Nombres Trading Seguridad Transacciones Persistencia Notificaciones Etc.

Qu es CORBA ? (2)
n

Est estandarizado por el OMG (Object Management Group)


n n

El mayor consorcio de la industria del software Slo emite especificaciones (no existe implementacin de referencia) Las especificaciones se desarrollan por consenso y son pblicas y gratuitas Existen muchos fabricantes que implementan las especificaciones ms importantes para las plataformas ms usuales Tambin estandariza UML (Unified Modeling Language)

Qu es CORBA ? (y 3)
n

Ventajas (con respecto a otras tecnologas similares)


n

Software COTS (Commercial Off The Shelf)


n

Estandarizado, mltiples implementaciones (no se depende de un fabricante)

n n n

Las especificaciones se adoptan por consenso Buena infraestructura para construir aplicaciones distribuidas Permite integrar aplicaciones heterogneas No es la tecnologa ms sencilla de utilizar ... Las especificaciones tardan en desarrollarse, y en consecuencia las implementaciones tardan en salir al mercado

Desventajas
n n

La arquitectura de gestin de objetos (OMA)

Interfaces de aplicacin

Interfaces del dominio

Facilidades comunes

Object Request Broker (ORB)

Servicios

ORB
n

Permite realizar invocaciones de mtodos de objetos remotos en un entorno heterogneo El documento estndar se llama CORBA (Common Object Request Broker Architecture)
n

En la prctica, el nombre CORBA realmente se aplica para referirse al conjunto de especificaciones

Las especificaciones de interfaces remotos se hacen en IDL (Interface Definition Language) Se han estandarizado los mappings de IDL a los lenguajes ms comunes (C, C++, Java, COBOL, Smalltalk, Ada, etc.)

Servicios
n

Interfaces de servicios tiles para aplicaciones de cualquier dominio


n n n n n n n n

Nombres Trading Seguridad Transacciones Persistencia Eventos Notificaciones Etc.

Facilidades comunes
n

Interfaces de servicios tiles para muchas aplicaciones, pero no tan fundamentales como los servicios CORBA
n n

Internacionalizacin y Tiempo Agentes mbiles

Interfaces del dominio


n

Interfaces tiles para dominios especficos


n n n n n n

Negocios Finanzas Manufacturacin Salud Telecomunicaciones Transporte

Interfaces de aplicacin
n

Interfaces desarrollados especficamente para una aplicacin Lgicamente, no estn estandarizados por el OMG, pero si se repiten en muchas aplicaciones diferentes, se convertirn en candidatos para estandarizacin (servicios, facilidades comunes o interfaces del dominio)

Componentes de un ORB
Aplicacin cliente Aplicacin servidora

DII

Stubs IDL estticos

Interfaz ORB

Skeletons IDL estticos

DSI

Adaptador de Objetos

Ncleo ORB
Interfaz igual para todos los ORBs Puede haber mltiples adaptadores de objetos Un stub y un skeleton especfico para cada objeto Interfaz privado del ORB

Clock.idl
/* * Clock example. */ module es { module udc { module fbellas { module corba { module clock { module idl { struct TimeOfDay { short hour; // 0-23 short minute; // 0-59 short second; // 0-59 }; interface Clock { TimeOfDay getTimeOfDay(); }; }; }; }; }; }; };

El compilador de IDL
Clock.idl

Compilador IDL-a-Java

Compilador IDL-a-C++

Ficheros .java

Ficheros .cpp

Stubs y skeletons
n

Stubs IDL estticos o SII (Static Invocation Interface)


n

n n

Las operaciones locales que usan los clientes como sustitutas de las remotas Generadas por el compilador de IDL Envan y reciben mensajes (haciendo marshalling / unmarshalling). En lenguajes OO se genera una clase proxy por cada interfaz remoto (patrn de diseo Proxy) Las operaciones en el servidor que invocan las correspondientes implementaciones proporcionadas por el programador Generadas por el compilador de IDL Reciben y envan mensajes (haciendo unmarshalling / marshalling) En lenguajes OO se genera una clase skeleton por cada interfaz remoto

Skeletons IDL estticos o SSI (Static Skeleton Interface)


n

n n

Algunos conceptos
n

Objeto CORBA
n

Entidad virtual sobre la que se pueden realizar invocaciones remotas Estructura de datos (puntero) que identifica a un objeto CORBA Son opacas Entidad del lenguaje de programacin que implementa uno o ms objetos CORBA. En lenguajes OO, un servant es una instancia de una clase que implementa las operaciones del interfaz remoto

Referencia a un objeto CORBA


n

Servant
n

Adaptador de objetos
n

n n

En el servidor: recibe una peticin y la dirige al servant correspondiente Corresponde al patrn de diseo Adapter Hasta CORBA 2.1 (inclusive), la especificacin CORBA estandarizaba el BOA (Basic Object Adapter)
n n

Especificacin ambigua y poco potente Los fabricantes aadieron sus propias extensiones => problemas de portabilidad importantes

A partir de CORBA 2.2 (inclusive), la especifiacin CORBA estandariz el POA (Portable Object Adapter)
n n

Potente, pero complejo ... El BOA ya no forma parte de CORBA

Interfaz del ORB, DII y DSI


n

Interfaz del ORB


n

Proporciona operaciones para inicializarlo, convertir referencias a objetos remotos a cadenas de caracteres y viceversa, etc. Permite realizar invocaciones de mtodos de objetos remotos sin utilizar los stubs correspondientes Permite recibir invocaciones de mtodos de objetos remotos sin disponer de los skeletons correspondientes

Dynamic Invocation Interface (DII)


n

Dynamic Skeleton Interface (DSI)


n

Repositorios de interfaces e implementaciones


n

Repositorio de interfaces
n

Repositorio que contiene descripciones de las definiciones de tipos en IDL El programador dispone de un API para consultar el repositorio Mantiene un registro de servidores de manera que puede proporcionar caractersticas como: arranque automtico de servidores, balanceo de carga, etc.

Repositorio de implementaciones
n

Interoperabilidad
n

Interoperabilidad entre distintos ORBs de distintos fabricantes


n

GIOP (General Inter-ORB Protocol)


n

Protocolo abstracto que especifica el formato de transferencia de tipos IDL y un conjunto de formatos de mensajes para permitir que ORBs de distintos fabricantes pueden interoperar sobre un protocolo de transporte orientado a la conexin GIOP sobre TCP/IP Formato estndar de una referencia a un objeto remoto (es opaco para el programador) No siguen GIOP (porque hay una infraestructura subyacente que quieren aprovechar) DCE CIOP (DCE Common Inter-ORB Protocol)

IIOP (Internet Inter-ORB Protocol)


n

IOR (Interoperable Object Reference)


n

ESIOPs (Environment-Specific Inter-ORB Protocols)


n

Tambin est estandarizada la interoperabilidad COM/DCOM

Un sencillo ejemplo con CORBA/Java Definicin de un interfaz remoto


/* * Clock example. */ module es { module udc { module fbellas { module corba { module clock { module idl { struct TimeOfDay { short hour; // 0-23 short minute; // 0-59 short second; // 0-59 }; interface Clock { TimeOfDay getTimeOfDay(); }; }; }; }; }; }; };

Compilacin del interfaz IDL


Clock.idl

Compilador IDL-a-Java
Clock.java ClockHelper.java TimeOfDay.java La clase proxy que implementa Clock - ClockPOA.java - etc.

Ficheros .java

Servidor Implementacin del objeto remoto


package es.udc.fbellas.corba.clock.server; import java.util.Calendar; import es.udc.fbellas.corba.clock.idl.TimeOfDay; import es.udc.fbellas.corba.clock.idl.ClockPOA; class ClockImpl extends ClockPOA { public TimeOfDay getTimeOfDay() { short hour = (short) Calendar.getInstance().get(Calendar.HOUR); short minute = (short) Calendar.getInstance().get(Calendar.MINUTE); short second = (short) Calendar.getInstance().get(Calendar.SECOND); return new TimeOfDay(hour, minute, second); } }

Servidor main (1)


package es.udc.fbellas.corba.clock.server; import import import import import import org.omg.CORBA.ORB; org.omg.PortableServer.POA; org.omg.PortableServer.POAHelper; org.omg.PortableServer.POAManager; java.io.PrintWriter; java.io.FileOutputStream;

import es.udc.fbellas.corba.clock.idl.Clock; class Server { public static void main(String args[]) { ORB orb = null;

Servidor main (2)


try { /* Initialize ORB. */ orb = ORB.init(args, null); /* Get a reference to the Root POA. */ org.omg.CORBA.Object rootPOAObject = orb.resolve_initial_references("RootPOA"); POA rootPOA = POAHelper.narrow(rootPOAObject); /* Activate the Root POA's manager. */ POAManager rootPOAManager = rootPOA.the_POAManager(); rootPOAManager.activate(); /* * Create servant, register it on the Root POA and * obtain a reference to it. */ ClockImpl clockImpl = new ClockImpl(); Clock clock = clockImpl._this(orb);

Servidor main (3)


/* Write the reference in file "Clock.ref". */ String stringifiedReference = orb.object_to_string(clock); FileOutputStream fileOutputStream = null; PrintWriter printWriter = null; try { fileOutputStream = new FileOutputStream("Clock.ref"); printWriter = new PrintWriter(fileOutputStream); printWriter.println(stringifiedReference); } finally { if (printWriter != null) { printWriter.close(); } if (fileOutputStream != null) { fileOutputStream.close(); } }

Servidor main (y 4)
/* Allow the ORB to start processing requests. */ System.out.println("Server running"); orb.run(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (orb != null) { orb.destroy(); } } catch (org.omg.CORBA.SystemException e) { e.printStackTrace(); } } } // main } // class

Cliente (1)
package es.udc.fbellas.corba.clock.client; import org.omg.CORBA.ORB; import java.io.BufferedReader; import java.io.FileReader; import es.udc.fbellas.corba.clock.idl.Clock; import es.udc.fbellas.corba.clock.idl.ClockHelper; import es.udc.fbellas.corba.clock.idl.TimeOfDay; class Client { public static void main(String args[]) { ORB orb = null; try { /* Initialize ORB. */ orb = ORB.init(args, null);

Cliente (2)
/* Read stringified reference from "Clock.ref". */ FileReader fileReader = null; BufferedReader bufferedReader = null; String stringifiedReference; try { fileReader = new FileReader("Clock.ref"); bufferedReader = new BufferedReader(fileReader); stringifiedReference = bufferedReader.readLine(); } finally { if (bufferedReader != null) { bufferedReader.close(); } if (fileReader != null) { fileReader.close(); } }

Cliente (3)
/* * Convert stringified reference into a Clock object * reference. */ org.omg.CORBA.Object clockObject = orb.string_to_object(stringifiedReference); if (clockObject == null) { throw new Exception("stringified reference is nil"); } Clock clock = ClockHelper.narrow(clockObject); /* Obtain the time of day and print it. */ TimeOfDay timeOfDay = clock.getTimeOfDay(); System.out.println("Hour: " + timeOfDay.hour); System.out.println("Minute: " + timeOfDay.minute); System.out.println("Second: " + timeOfDay.second);

Cliente (y 4)
} catch (Exception e) { e.printStackTrace(); } finally { try { if (orb != null) { orb.destroy(); } } catch (org.omg.CORBA.SystemException e) { e.printStackTrace(); } } } // main } // class

Flujo de una invocacin remota


n

Cliente
n

TimeOfDay timeOfDay = clock.getTimeOfDay(); El cliente invoca la operacin sobre un proxy La operacin getTimeOfDay del proxy enva un mensaje por la red utilizando el ORB El ORB del servidor recibe el mensaje y se lo entrega al gestor del POA (rootPOAManager) y ste al POA (rootPOA) El adaptador de objetos enva la invocacin al servant (clockImpl)
n

Flujo de la invocacin
n n

Se llama a una operacin de ClockPOA, que realiza el unmarshalling e invoca a la operacin abstracta getTimeOfDay, definida en ClockImpl.

Cuando el servant termina de ejecutar la operacin, la respuesta se enva al cliente

Ejecucin del ejemplo Clock


* cd $CORBA_JAVA_EXAMPLES_HOME/Subsystems/Clock/Scripts * Ejecutar ClockServer.sh * Ejecutar ClockClient.sh

Implementaciones
n

Existe un buen nmero de implementaciones, comerciales y gratuitas, del ORB de CORBA (para distintos lenguajes y plataformas) y de los servicios ms comunes
n n n n n

http://www.cs.wustl.edu/~schmidt/corba-products.html Iona (http://www.iona.com). Orbix Inprise (http://www.inprise.com). Visibroker Object Oriented Concepts (http://www.ooc.com). ORBacus http://www.cs.wustl.edu/~schmidt/TAO.html. TAO