Sunteți pe pagina 1din 7

Interfaz de invocación dinámica (DII)

Sistemas Distribuidos:
Programación con CORBA

Juan Pavón Mestras


Dep. Sistemas Informáticos y Programación
Universidad Complutense Madrid

Restricciones del modelo basado en stubs


n El modelo basado en el uso de stubs (conocido también como
invocación estática), aún siendo sencillo, tiene algunas
limitaciones:
n Los stubs son generados en tiempo de compilación del IDL
• Un cambio en el IDL requiere rehacer todos los clientes
n Hay aplicaciones que no saben de antemano qué tipos de
interfaces van a utilizar
• Por ejemplo: gateways, navegadores, depuradores, intérpretes, ...
n CORBA ofrece una solución estándar a este problema, basada
en:
n El Repositorio de Interfaces
• Guarda la descripción de las nuevas interfaces
n La interfaz de invocación dinámica(DII, Dynamic Invocation
Interface)
• Permite construir en tiempo de ejecución una petición de operación

Juan Pavón Mestras, UCM 2000-01 DII 2

1
El Repositorio de Interfaces
n Es un servicio estándar proporcionado por el ORB que mantiene
las definiciones que aparecen en los ficheros IDL
n Es una base de datos de definiciones de objetos
• Cada objeto representa una definición IDL
• Los objetos están anidados unos dentro de otros en una estructura que
refleja las definiciones IDL
• Es posible navegar y buscar definiciones en dicha estructura
n Las definiciones pueden suministrarse al Repositorio de Interfaces:
• Usando una utilidad (irfeed en ORBacus, putidl en OrbixWeb, idl2ir en
Visibroker)
• Desde cualquier programa usando las funciones de escritura de la
interfaz del Repositorio de Interfaces
n Se puede acceder al Repositorio de Interfaces como un servicio
bien definido (se accede al objeto Repository raíz de la jerarquía):

org.omg.CORBA.Object obj = orb.resolve_initial_references(“InterfaceRepository”);


org.omg.CORBA.Repository intfRepository = org.omg.CORBA. RepositoryHelper.narrow(obj);
Juan Pavón Mestras, UCM 2000-01 DII 3

El Repositorio de Interfaces

n Está implementado como un conjunto de objetos


persistentes (metadatos) que representan la
información que contiene (un objeto por cada tipo de
construcción IDL)
n ModuleDef
n InterfaceDef
n OperationDef
n ParameterDef
n AttributeDef
n ConstantDef
n ExceptionDef
n TypeDef
n además del objeto
n Repository, que contiene a todos

Juan Pavón Mestras, UCM 2000-01 DII 4

2
El Repositorio de Interfaces
Contained Container

Repository

ConstantDef TypeDef ModuleDef ExceptionDef InterfaceDef

ConstantDef TypeDef InterfaceDef ExceptionDef ModuleDef

ConstantDef TypeDef OperationDef ExceptionDef AttributeDef

ParameterDef ExceptionDef

Juan Pavón Mestras, UCM 2000-01 DII 5

La Interfaz de Invocación Dinámica (DII)

n La interfaz de invocación dinámica permite que un


cliente construya una petición en tiempo de
ejecución
n Se trata de crear y configurar un objeto de tipo Request
n Luego se le solicitará al ORB que lo envíe al objeto destino
con invoke()

Juan Pavón Mestras, UCM 2000-01 DII 6

3
La Interfaz de Invocación Dinámica (DII)

n Para ello se manejan 4 interfaces de pseudo-objetos


CORBA:
n CORBA::Object
• Operaciones que soportan todos los objetos CORBA. Para
invocaciones dinámicas:
• get_interface()
• create_request()
• _request()
n CORBA::Request
• Representa una petición de operación y ofrece métodos para
darle parámetros, para invocarla, y leer los resultados
n CORBA::NVList
• Permite construir listas de parámetros
n CORBA::ORB
• Permite crear objetos NVList, y enviar y recibir múltiples
peticiones
Juan Pavón Mestras, UCM 2000-01 DII 7

Programación de cliente con invocación dinámica

n Pasos para realizar la invocación dinámica de una


operación
1) Averiguar cómo es la operación que quiere invocar
2) Construir un objeto Request con los parámetros y código de
operación correspondientes
3) Solicitar al ORB que pase este objeto Request al objeto
destino que implementa la operación
4) Leer los resultados en el objeto Request
5) Liberar el objeto Request (y la NVList si se hubiera
utilizado)

Juan Pavón Mestras, UCM 2000-01 DII 8

4
Programación de cliente con invocación dinámica

1) Averiguar cómo es la operación que quiere invocar


n La interfaz estará descrita con un objeto InterfaceDef
• Para obtener una referencia al mismo se puede utilizar el
método _get_interface() que ofrecen todos los objetos de la
clase CORBA::Object
org.omg.CORBA.InterfaceDef intfContador = contador._get_interface();
n A partir de este objeto InterfaceDef se puede acceder a toda
la información de la interfaz, manipulando los objetos que
contiene:

org.omg.CORBA.InterfaceDefPackage.FullInterfaceDescription descripcion;
descripcion = intfContador.describe_interface();

for (i=0; i<descripcion.operations.length; i++)


if ( descripcion.operations[i].name.compareTo(“inc”) == 0 )
// existe una operación con el nombre inc
Juan Pavón Mestras, UCM 2000-01 DII 9

Programación de cliente con invocación dinámica

2) Construir un objeto Request


n Crear el org.omg.CORBA.Request y configurarlo con las
operaciones que ofrece
• Al crear el objeto se indica el nombre de la operación
• Crear el objeto Request primero para configurarlo luego:
org.omg.CORBA.Object._request(“nombre_operacion”)
• O crear el objeto Request completamente configurado:
org.omg.CORBA.Object._create_request(contexto,
“nombre_operacion”,
lista_de_argumentos, tipo_de_resultado)
n Incluir los parámetros
• Con las operaciones sobre el objeto Request add_in_arg(),
add_out_arg() y add_inout_arg()

Juan Pavón Mestras, UCM 2000-01 DII 10

5
Programación de cliente con invocación dinámica

2) Construir un objeto Request (...)


n Si hacen falta varios parámetros entonces especificarlos con
una NVList
• Se crea un objeto de tipo NVList con la operación create_list()
del ORB
• NVList es una lista de objetos NamedValue
• La operación add_item() en el objeto NVList permite incluir un
nuevo NV
• Esta NVList se puede pasar en la operación _create_request()
• Otra posibilidad es añadir los argumentos directamente sobre el
objeto Request con las operaciones add_arg() y add_value() que
ofrece
n Indicar el tipo de valor de retorno
• Con el método sobre el objeto Request
_set_return_type(typecode)
o bien inicializándolo con un valor de un tipo determinado
• Para leer el resultado se utiliza el método return_value() que
devuelve un objeto de tipo org.omg.CORBA.Any
Juan Pavón Mestras, UCM 2000-01 DII 11

Programación de cliente con invocación dinámica

3) Solicitar al ORB que pase este objeto Request al


objeto destino que implementa la operación
n usando el método invoke() del objeto Request
4) Leer los resultados en el objeto Request
n usando el método return_value() del objeto Request
5) Liberar el objeto Request (y la NVList si se hubiera
utilizado)
n En el caso de Java liberando las referencias a esos objetos

Juan Pavón Mestras, UCM 2000-01 DII 12

6
Ejemplo de cliente con invocación dinámica
// obtiene la referencia del objeto contador
Contador contador = ... ;

// Crea el objeto request para hacer dinámicamente la operación inc


org.omg.CORBA.Request peticion;
peticion = contador._request(“inc”);

// Indica el tipo de valor de resultado


TypeCode tc =
orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_long);
peticion.set_return_type(tc);

// Invoca la operación
peticion.invoke();

// Finalmente, para leer el resultado


int resultado = peticion.return_value().extract_long();

Juan Pavón Mestras, UCM 2000-01 DII 13

Resumen

n La invocación dinámica sirve permite crear


aplicaciones que descubren nuevas interfaces y sean
capaces de utilizarlas, dotando así de mayor
flexibilidad al sistema
n La información para poder construir dinámicamente
un objeto Request se puede encontrar en el
Repositorio de Interfaces

Juan Pavón Mestras, UCM 2000-01 DII 14

S-ar putea să vă placă și