Invocación Dinámica en CORBA
-
Upload
brenden-kemp -
Category
Documents
-
view
41 -
download
0
description
Transcript of Invocación Dinámica en CORBA
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”
● 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;
}