Está en la página 1de 38

MMT MCE Martín Alfaro Arenas

CORBA: Common Object Request Broker


Architecture. Tecnología para el manejo de
objetos distribuidos

Independiente del sistema operativo, de la


plataforma hardware y del lenguaje de
programación

Los clientes y servidores pueden residir en la


misma computadora o estar distribuidos

“Middleware” orientado a objetos distribuidos


Componentes
Š Clientes: Ente que hace una solicitud a un objeto CORBA
Š Objetos CORBA: Ente capaz de recibir una solicitud de un cliente,
realizar una acción (o múltiples acciones) en respuesta a dicha solicitud
y devolver un resultado /* Servidor */
Š ORB (Administrador de solicitudes a objetos)

Cliente Objeto

Dynamic Skeleton
Stubs Dynamic Interfaz skeleton IDL Object
Invocation ORB interface
IDL Interface Adapter

ORB

Núcleo del ORB


El ORB es el mediador entre el cliente y
el servidor

Conexión
Referencia de objeto Objeto CORBA
lógica

Solicitud

ORB cliente Flujo real ORB servidor


de la solicitud

Aplicación cliente Aplicación servidora


Mecanismo evolucionado de RPC
Función: Enviar solicitudes a objetos y
devolver las respuestas a los clientes
ORBs: Java ORB, JACORB, Orbix, Orbacus,
Etc.
Š Ubicación de los objetos.
ŠEl cliente no sabe donde reside el servidor: en el mismo
proceso, en la misma computadora o en diferentes
computadoras conectadas en red
Š Implementación de objetos.
ŠEl cliente no sabe cómo se ha implementado el servidor, que
lenguaje fue usado, en que sistema operativo o en que
plataforma de hardware está implementado
Š Estado del servidor.
ŠEl cliente no sabe si el servidor está activo o no
Š Mecanismo de comunicación.
ŠEl cliente no sabe que mecanismo de comunicación se está
ŠEl IDL es independiente del lenguaje de
programación
ŠExisten compiladores IDL para diversos
lenguajes de programación: idltojava
ŠSoporta diferentes tipos de datos,
incluyendo tipos básicos (enteros,
floats, etc.), estructuras, objetos,
arreglos dinámicos, strings, entre otros.
IDL. Lenguaje de definición de interfaces
Š Un lenguaje que permite definir las interfaces
CORBA
Š Interfaz CORBA:
Š Un conjunto de operaciones y sus parámetros
Š Compilador IDL: toma como entrada un
archivo fuente IDL y produce como salida:
1.IDL Stubs
2.IDL skeletons
Š Tipos definidos por el usuario
½ Similar al typedef de C++

typedef short Identificador;


Š Secuencias
½ Son arreglos unidimensionales con un tamaño máximo fijo y una
longitud que puede variar en tiempo de ejecución
typedef sequence<long, 10> s; // delimitada
typedef sequence<long> s; // sin limite

Š Estructuras
1. Similares a las estructuras en lenguaje C
struct ubicacion {
long latitud;
long longitud;
};

class Customer {
int getInfo();
interface Customer { int End();
int getInfo(); }
Compilador ….
int End();
} IDL Stub IDL (archivo fuente
en lenguaje X)


class Customer {
int getInfo();
int End();
Archivo fuente en }
lenguaje IDL ….

Esqueleto IDL (archivo


fuente en lenguaje X)
Stubs IDL
Š Son archivos fuente, en un lenguaje dado, que
permiten que un cliente haga solicitudes a objetos
CORBA que implementan las interfaces definidas
Š Son generados automáticamente por el compilador
IDL a partir de interfaces CORBA
Š Los stubs deben ser incorporados en los programas
cliente
Š Contienen el código necesario para canalizar la
solicitud al ORB
Š Stub: “Proxy”- objeto del lado del cliente que actúa
como si fuera el verdadero objeto servidor
Para hacer una solicitud el cliente utiliza
una referencia a un objeto
Cuando un nuevo objeto es creado se
crea una nueva referencia
Los objetos son creados en la aplicación
servidora
Para poder hacer una solicitud el cliente
debe obtener, de alguna manera, la
referencia al objeto
Inicialmente el cliente no tiene acceso a la referencia
de un nuevo objeto creado en la aplicación servidora

Getinfo

Referencia
ORB

ORB
Referencia
al Customer
?
Customer

Aplicación cliente Aplicación servidora


// Obtener refencia CORBA
org.omg.CORBA.Object obj = orb.obtiene_referencia(ref);
// hacer el narrow a Customer
Customer v_customer = CustomerHelper.narrow(obj);
// verificar si la operación fue correcta
if( v_customer == null ) {
System.out.println("Error al obtener la
referencia");
System.exit( 1 );
}
// invocar operaciones
int saldo = v_customer.GetInfo();
v Obtener una referencia mediante un servicio
de nombres

”)
o lve r(“ Customer Name
Referencia Res
Service
al Name
st omer
service u
al C
ORB

nc ia Registrarse
e f ere
R

Referencia

ORB
al Customer
Solicitudes Customer

Aplicación cliente
Aplicación servidora
• Interoperable Object Reference
“Detalles de contacto” que una aplicación cliente usa para comunicarse
con un objeto CORBA.
Ejemplo:

IOR:00a000000000001e49444c3a636f6e76657267696e2f6f74612f4d61
6e616765723a312e300000000000000100008200000000410001000000
00000c31302e392e32392e3137370051ef00000000002514010f004e555
00000000f0000000000000001006f746130360099000000000000016f746
Obtener una referencia desde un IOR

Aplicación cliente Aplicación servidora

Solicitudes
Referencia Customer
al Customer
ORB

ORB
Leer Escribir
referencia referencia

IOR
1. Seleccionar el lenguaje de programación deseado.
2. Usar el compilador de IDL apropiado para generar código en el
lenguaje seleccionado (el stub que servirá de proxy para el cliente).
3. El programa cliente tiene que:
a. Incluir/importar el código generado
b. Inicializar su ORB
c. Usar el IOR del objeto que se quiera usar en la API y obtener su
referencia.
d. Invocar los métodos deseados de la API
e. Cerrar la conexión
Aplicación cliente
public class Cliente
{
public static void main(String args[]) {
try {
// inicializar el orb
ORB orb = ORB.init( args, null );
String ref = new BufferedReader(
new FileReader(“IOR-subscriber.ref")).readLine();
org.omg.CORBA.Object obj = orb.string_to_object( ref );
// Obtener la referencia
oSubscriberAPI = converginProvisioningSubscriber.narrow(obj);
// verificar si se obtuvo la referencia
if (converginProvisioningSubscriber == null) {
System.out.println("La referencia no es válida");
System.exit( 1 );
}
// Usar un método
int res = oSubscriberAPI.modifyState(“Usr”, “UsrPss”, subid, Suspend)
}
...
Customer Subscriber Account
-Customer# -DN / MIN -Account#

Subscriber: Entidad básica con información demográfica y


elementos de red (HLR, ciudad..)
Account: Información y actividad monetaria
Wallets: Tipo, Balance, Límite, Fecha de Expiración
Sobre ésta entidad se aplican: pagos, ajustes, cambios de
rate plan, etc.
Customer: agrupación de subscribers

Customer Subscriber Account


-# -DN / MIN -#
Un CUG (Closed User Group) habilita en
servicio de VPN (Virtual Private Network)
DN: 5585825000
CUG:
Nombre: LaAcademia
Prioridad: 30
Fecha de Inicio: 1/1/2007
Fecha de Fin: 1/1/2008

NT: Number Translation


NT: #5000
Formato
convergin::GenericOutput api_method_name (INPUT_ARGS ,OUTPUT_ARGS)
‘in’ y ’out’ indican si el argumento es de entrada o salida
GenericOutput modifyPersonalInfo (
in convergin::LoginName i_user,
in convergin::LoginPass i_pass,
in convergin::provisioning::Subscriber::ID i_subid,
in string i_first,
in string i_middle,
in string i_last,
in string i_language,
out double o_balance,
out converging::Subscriber::State o_state);
Parámetro Tipo Descripción Disponibilidad
Result int Tue / False Siempre
Error_Code int Identificador de eror Cuando Result_code=False
Error_Message char(100) Error descriptivo Cuando Result_code=False
Transaction_ID int Identificador de transacción Siempre
Arreglo de estructuras de datos de tipo “Item”

v_generic
n V_item(0)
Code = 1
Value = “Valor del código 1”
n V_item(1)
Code = 2
Value = “Valor del código 2”
n …
Ejemplo: c_converginOptionalString
n Exists { True, False }
n Value

Ejemplo 2: i_cuenta
n DN : OptionalString
n MIN: OptionalString
n Numero de Cuenta: OptionalExternalNo
(Cualquiera de los 3 puede ser la llave para la transacción, todos son
opcionales, pero uno de ellos es requerido)
login name (convergin::LoginPass)
password (convergin::LoginPass)

2 servidores API: opción de


fail over
Encolamiento a cargo del
cliente
Add
GetInfo
End
ModifyInfo
GetInfo
Add Subscriber ListFriendsAndFamily
ModifyInfo RemoveF&F
GetInfo RemoveAllF&F
ModifyState AddCUGMembership
End EndCUGMembership
AddAccount ListCUGMembership
AddRestriction AddComment
EndRestriction ListComment
ListAllRestriction
AddFriendsAndFamily
struct ID {
convergin::OptionalString m_dn;
convergin::OptionalString m_min;
convergin::OptionalString m_cc;
};

struct Membership { struct Time {


string m_cug; long m_year;
long m_month;
long m_priority;
long m_day;
convergin::Time m_start; long m_hour;
convergin::Time m_end; long m_minute;
}; long m_second;
};
typedef string LoginPass;
ModifyInfo AddWallet
GetInfo GetLlastRecharge
ModifyState
End
ModifyWalletExpiry
Payment
Adjustment
AddRecurrentCharge
EndRecurrentCharge
Extra parameter: 1, Número único de operación
typedef sequence<Wallet> WalletList;

Struct Wallet
{
convergin::provisioning::Account::WalletType m_type;
convergin::provisioning::Account::WalletBalance
m_balance;
convergin::Time m_expiry;
};
Type Balance Expiry
Default 100.0 11/01/2008
Minutos 5 31/12/2099
LD 0 11/11/1977
QueryTimeforCall
CallCharge
QueryChargeForSMS
ChargeSMS
QueryChargeforDataSession
ChargeDataSession
struct PreCallDetails {
Direction m_direction;
MediaType m_mediaType;
convergin::OptionalBillingAccount m_originator;
convergin::OptionalBillingAccount m_terminator;
string m_calledDigits;
convergin::OptionalLocation m_originatorLocation;
convergin::OptionalLocation m_terminatorLocation;
convergin::Time m_startTime;
};
struct PostCallDetails {
convergin::Time m_answerTime;
convergin::Time m_disconnectTime;
};