Invocacin Dinmica en CORBA - PowerPoint PPT Presentation

1 / 27
About This Presentation
Title:

Invocacin Dinmica en CORBA

Description:

{ void setResult(in double value); interface Funcion { void evaluar(in double x1, in double x2, in. Response response); Invocaci n Din mica ... – PowerPoint PPT presentation

Number of Views:26
Avg rating:3.0/5.0
Slides: 28
Provided by: ica86
Category:
Tags: corba | dbl | dinmica | invocacin

less

Transcript and Presenter's Notes

Title: Invocacin Dinmica en CORBA


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 objorb.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 obj2poa.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 x1x2
  • 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_r
    eference(ctaTie)
  • CuentaAhorros cuenta CuentaAhorrosHelper.n
    arrow(obj)
  • return cuenta
  • catch( Exception e )
  • return null
Write a Comment
User Comments (0)
About PowerShow.com