La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Invocación Dinámica en CORBA

Presentaciones similares


Presentación del tema: "Invocación Dinámica en CORBA"— Transcripción de la presentación:

1 Invocación Dinámica en CORBA

2 Invocación Dinámica La interfaz de invocación dinámica (DII) permite la invocación de operaciones a objetos sin hacer uso del stub correspondiente. Para hacer invocaciones dinámicas se usa un objeto “request” Un request consiste de una referencia, una operación y una lista de parámetros Un cliente que usa un request obtiene el mismo resultado que un cliente que use los stubs En el DII un parámetro de una solicitud es un elemento de una lista (NVList) denominado NamedValue

3 Invocación Dinámica Para ejecutar una solicitud se usa el método invoke en el objeto request. Invoke es bloqueante. La operación send_deffered envia una solicitud y regresa de inmediato (no bloqueante o asíncrona). Para obtener los resultados se usa la operación get_response. Si la solicitud no ha finalizado esta llamada se bloquea hasta que la solicitud termine La operación poll_response permite determinar si la llamada ha finalizado

4 Invocación Dinámica Ejemplo. Dada la siguiente interfaz IDL:
interface MessagePrinter { void printHello(); }; Se puede invocar el método printHello dinámicamente como sigue: org.omg.CORBA.Object obj=orb.string_to_object(ior); Request request = obj._request("printHello"); request.invoke(); Observe que si no se tiene el stub no se puede hacer el narrow porque la clase MessagePrinterHelper está en dicho stub.

5 Invocación Dinámica Los parámetros y valores devueltos (return value) en invocaciones dinámicas se manejan como variables de tipo “any”. El tipo any en CORBA puede almacenar valores de cualquier tipo. Ejemplo de uso de any: Any a = org.omg.CORBA.ORB.init().create_any(); // char a.insert_string("Hola"); // long int l = 4711; a.insert_long(l);

6 Invocación Dinámica Ejemplo de uso de any:
Any a = org.omg.CORBA.ORB.init().create_any(); // referencia sin tipo org.omg.CORBA.Object obj; a.insert_Object(obj); // referencia con tipo Cuenta c; CuentaHelper.insert(a, c); // estructuras Person p = new Person(1, "Pedro Pérez"); PersonHelper.insert(a, p);

7 Invocación Dinámica Ejemplo de uso de any. Extraer valores Any a;
double d = a.extract_double(); String s = a.extract_string(); Cuenta c = CuentaHelper.extract(a); org.omg.CORBA.Object obj = a.extract_Object();

8 Invocación Dinámica Solicitudes dinámicas con parámetros.
Los parámetros se manejan como valores any Ejemplo: interface Funcion { double evaluar(in double x1, in double x2); };

9 Invocación Dinámica Solicitudes dinámicas con parámetros. Ejemplo:
org.omg.CORBA.Request r = obj._request("evaluar"); r.add_in_arg().insert_double( x1 ); r.add_in_arg().insert_double( x2 ); r.set_return_type(orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_double)); r.invoke(); Any any = r.return_value(); double v = any.extract_double(); System.out.println(v);

10 Invocación Dinámica Invocación asíncrona Ejemplo:
org.omg.CORBA.Request r = obj._request("evaluar"); r.add_in_arg().insert_double( x1 ); r.add_in_arg().insert_double( x2 ); r.set_return_type(orb.get_primitive_tc( org.omg.CORBA.TCKind.tk_double));

11 Invocación Dinámica Invocación asíncrona
El DII permite invocación asíncrona mediante la operación send_deferred() Ejemplo: r.send_deferred(); while (!r.poll_response()) { Thread.sleep(1000); } Any any = r.return_value(); double v = any.extract_double(); System.out.println(v);

12 Invocación Dinámica Invocación asíncrona con objetos callback
En lugar de usar poll_response(), se puede pasar un objeto como parámetro el cual será invocado para enviar la respuesta Ejemplo: interface Response { void setResult(in double value); }; interface Funcion { void evaluar(in double x1, in double x2, in Response response);

13 Invocación Dinámica Invocación asíncrona con objetos callback Ejemplo:
org.omg.CORBA.Request r = obj._request("evaluar"); r.add_in_arg().insert_double( x1 ); r.add_in_arg().insert_double( x2 ); ResponseImpl respImpl = new ResponseImpl(); org.omg.CORBA.Object obj2=poa.servant_to_reference( respImpl); Response response = ResponseHelper.narrow(obj2); ResponseHelper.insert(r.add_in_arg(), response); r.send_deferred();

14 Invocación Dinámica Invocación asíncrona con objetos callback Ejemplo:
public class FuncionImpl extends FuncionPOA { public void evaluar(double x1, double x2, Response response) double result = x1*x2; response.setResult(result); }

15 Herencia en CORBA Corba permite la herencia de interfaces
Una interfaz puede heredar de otra, en cuyo caso hereda las operaciones definidas en la super interfaz No hay herencia de implementaciones. Cada implementación debe implementar todos los métodos Se puede usar composición para lograr reutilización de código Un parámetro o variable de un tipo puede recibir un valor de cualquier subtipo

16 Herencia en CORBA Ejemplo: interface Pozo { string devolverId();
Ubicacion devolverUbicacion(); long devolverProduccionCrudo(); long devolverProduccionGas(); void actualizarProduccionCrudo( in long produccion); void actualizarProduccionGas(in long produccion); };

17 Herencia en CORBA Ejemplo: interface PozoGasLift : Pozo {
void actualizarPresion(in long presion); long devolverPresion(); }; interface PozoBES : Pozo { void actualizarCorriente(in double c); double devolverCorriente();

18 Herencia en CORBA Un parámetro o variable de un tipo puede recibir un valor de cualquier subtipo: void procesar(Pozo p) { ... } PozoGasLift pg; procesar(pg);

19 Herencia en CORBA Ejemplo de uso de composición para reutilizar código: public class Pozo { int id; int prodCrudo; ... public Pozo(int id) { } int devolverProduccionCrudo() {

20 Herencia en CORBA Ejemplo de uso de composición para reutilizar código: public class PozoImpl extends PozoPOA { Pozo p; public PozoImpl(int id) { p = new Pozo(); } int devolverProduccionCrudo() { return p.devolverProduccionCrudo(); ...

21 Herencia en CORBA Ejemplo de uso de composición para reutilizar código: public class PozoGasListImpl extends PozoGasLiftPOA { Pozo p; int presion; public PozoGasListImpl(int id) { p = new Pozo(); } int devolverProduccionCrudo() { return p.devolverProduccionCrudo(); int devolverPresion() { return presion;

22 Mecanismo de Implementación por Delegación
Corba ofrece un mecanismo de implementación por delegación mediante las clases TIE. Por cada interfaz definida el compilador IDL genera una clase TIE automáticamente. Una clase TIE es una implementación completa y funcional de un objeto Corba La clase TIE usa un delegado para ejecutar las operaciones. El delegado es una clase que implementa la interfaz Operations generada por el compilador IDL

23 Mecanismo de Implementación por Delegación
Ejemplo: module tie { enum TipoCuenta { corriente, ahorros }; interface Cuenta { void depositar(in long monto); void retirar(in long monto); long getSaldo(); }; interface CuentaAhorros : Cuenta { void getInteresMes(); interface FabricaCuentas { Cuenta crearCuenta(in TipoCuenta tipo, in long saldoIni);

24 Mecanismo de Implementación por Delegación
Ejemplo: class CuentaImpl implements CuentaOperations { private int saldo; CuentaImpl(int saldoIni) { this.saldo = saldoIni; } public void depositar(int monto) { saldo = saldo + monto; public void retirar(int monto) { saldo = saldo - monto; public int getSaldo() { return saldo;

25 Mecanismo de Implementación por Delegación
Ejemplo: class FabricaCuentasImpl extends FabricaCuentasPOA { public Cuenta crearCuenta(int saldoIni) { CuentaImpl ctaImpl = new CuentaImpl(saldoIni); CuentaPOATie ctaTie = new CuentaPOATie(ctaImpl); try { org.omg.CORBA.Object obj = _poa(). servant_to_reference(ctaTie); Cuenta cuenta = CuentaHelper.narrow(obj); return cuenta; } catch( Exception e ) { return null; ...

26 Mecanismo de Implementación por Delegación
Ejemplo: public class CuentaAhorrosImpl extends CuentaImpl implements CuentaAhorrosOperations { public CuentaAhorrosImpl(int saldoIni) { super(saldoIni); } public int getInteresMes() { return (int)(getSaldo() * 0.02);

27 Mecanismo de Implementación por Delegación
Ejemplo: public CuentaAhorros crearCuentaAhorros(int saldoIni) { CuentaAhorrosImpl ctaImpl = new CuentaAhorrosImpl(saldoIni); CuentaAhorrosPOATie ctaTie = new CuentaAhorrosPOATie(ctaImpl); try { org.omg.CORBA.Object obj=_poa().servant_to_reference(ctaTie); CuentaAhorros cuenta = CuentaAhorrosHelper.narrow(obj); return cuenta; } catch( Exception e ) { return null;


Descargar ppt "Invocación Dinámica en CORBA"

Presentaciones similares


Anuncios Google