270 likes | 420 Views
Invocación Dinámica en CORBA. 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”
E N D
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
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
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.
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);
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);
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();
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); };
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);
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));
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);
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); };
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();
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); } }
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
Herencia en CORBA • Ejemplo: interface Pozo { string devolverId(); Ubicacion devolverUbicacion(); long devolverProduccionCrudo(); long devolverProduccionGas(); void actualizarProduccionCrudo( in long produccion); void actualizarProduccionGas(in long produccion); };
Herencia en CORBA • Ejemplo: interface PozoGasLift : Pozo { void actualizarPresion(in long presion); long devolverPresion(); }; interface PozoBES : Pozo { void actualizarCorriente(in double c); double devolverCorriente(); };
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);
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() { ... } ... }
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(); } ... }
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; } }
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
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); }; };
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; } }
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; } ...
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); } }
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; }