Publicado el 21 de Febrero del 2021
372 visualizaciones desde el 21 de Febrero del 2021
224,2 KB
45 paginas
Creado hace 19a (10/11/2005)
Sistemas de
Información
Tecnologías de objetos distribuidos:
CORBA: Invocación estática
Agradecimientos: Jesus Villamor Lugo, Simon Pickin de IT/UCIIIM, Juan Pavón UCM
1
Ejemplo CORBA
Servidor Corba que actua como una calculadora
Los clientes se conectan al servidor y le piden
que ejecute una operación
Suma
División
En la petición van incluidos los parámetros
necesarios para realizar la operación
El servidor una vez realizada la operación
devuelve el resultado
2
Construcción de una aplicación
CORBA
Calculator.idl
Especificación
IDL
CalculatorOperations.java
Calculator.java
CalculatorHelper.java
CalculatorHolder.java
CalculatorStub.java
CalculatorPOA.java
Compilación
IDL
Implementación
del Cliente
Client.java
Implementación
de la interfaz
Implementación
del Servidor
CalculatorPOAImpl.java
ServerPOA.java
3
CORBA Ejemplo 1
Declarando Interfaz en IDL
// Descripcion de una excepcion
exception DivisionPorCero{
float op1;
float op2;
};
interface Calculator{
// operacion de Suma
float add ( in float nb1, in float nb2 );
// operacion de Division
float div ( in float nb1, in float nb2 ) raises ( DivisionPorCero );
};
(*) Ejemplo tomado de http://www.programacion.com/tutorial/acscorba
4
Compilación de la interfaz
Calculator.idl
> idl2java Calculator.idl
Compilador
IDL a Java
Cliente
Calculator_Stub
Calculator_Stub
CalculatorHolder
CalculatorHolder
CalculatorHelper
CalculatorHelper
Client.java
Servidor
CalculatorPOA
CalculatorPOA
<<interface>>
<<interface>>
Calculator
Calculator
<<interface>>
<<interface>>
CalculatorOperations
CalculatorOperations
ServerPOA.java
CalculatorPOAImpl.java
Ficheros generados por el compilador idl
Ficheros generados por el programador
5
Compilando la interfaz
Calculator y CalculatorOperations
CalculatorOperations Interfaz Java que define todos los
métodos correspondientes a la interfaz idl. Es la que implementa el
servant
Cada operación de la interfaz corresponde a un método java
Cada atributo del interfaz corresponde a dos métodos java (leer, escribir)
public interface CalculatorOperations {
public interface CalculatorOperations {
//...
//...
float add(float nb1, float nb2);
float add(float nb1, float nb2);
float div(float nb1, float nb2);
float div(float nb1, float nb2);
}
}
Calculator Interfaz java que extiende a la anterior. Es la que
implementa el stub
public interface Calculator extends CalculatorOperations,
public interface Calculator extends CalculatorOperations,
org.omg.CORBA.Object,
org.omg.CORBA.Object,
org.omg.CORBA.portable.IDLEntity {...}
org.omg.CORBA.portable.IDLEntity {...}
6
Compilando la interfaz
Calculator_Stub.java
Clase java que implementa el stub de la interfaz
Calculator en el lado del cliente
Hace marshalling (serialización) para los parámetros de cada
método de la interfaz antes de pasárselos al ORB. (También
unmarshalling en la recepción)
Define también su propio constructor y otros métodos de apoyo
(Comprobar en prácticas editando el fichero)
public class Calculator_Stub
public class Calculator_Stub
extends org.omg.CORBA.portable.ObjectImpl
extends org.omg.CORBA.portable.ObjectImpl
implements Calculator{
implements Calculator{
// ...
// ...
}
}
7
Compilando la interfaz
CalculatorHelper
Clase Java que proporciona métodos estáticos útiles
para los usuarios de objetos Calculator (cliente y
servidor).
Por ejemplo método narrows para convertir de objetos
Corba genéricos a objetos Calculator
final public class CalculatorHelper {
final public class CalculatorHelper {
public static void insert(org.omg.CORBA.Any any, Calculator val)
public static void insert(org.omg.CORBA.Any any, Calculator val)
{...}
{...}
public static Contador extract(org.omg.CORBA.Any any) {...}
public static Contador extract(org.omg.CORBA.Any any) {...}
public static Contador narrow (org.omg.CORBA.Object val) {...}
public static Contador narrow (org.omg.CORBA.Object val) {...}
}
}
8
Compilando la interfaz
CalculatorHolder
Clase Java que se utiliza si es necesario pasar
objetos Calculator como parámetros out o
inout en operaciones de otra interfaz
final public class CalculatorHolder
final public class CalculatorHolder
implements org.omg.CORBA.portable.Streamable {
implements org.omg.CORBA.portable.Streamable {
public Calculator value;
public Calculator value;
public CalculatorHolder(){ }
public CalculatorHolder(){ }
public CalculatorHolder(Calculator initial){
public CalculatorHolder(Calculator initial){
}
}
value = initial;
value = initial;
//...
//...
}
}
9
Compilando la interfaz
CalculatorPOA
Clase abstracta que sirve de base para la
implementación del servant (código del servidor que
implementa las operaciones definidas en la interfaz idl)
Esta clase es la que contiene el skeleton del servidor
public abstract class CalculatorPOA
public abstract class CalculatorPOA
extends org.omg.PortableServer.Servant
extends org.omg.PortableServer.Servant
implements org.omg.CORBA.portable.InvokeHandler,
implements org.omg.CORBA.portable.InvokeHandler,
CalculatorOperations{
CalculatorOperations{
// ...
// ...
public org.omg.CORBA.portable.OutputStream _invoke(String opName,
public org.omg.CORBA.portable.OutputStream _invoke(String opName,
org.omg.CORBA.portable.InputStream in,
org.omg.CORBA.portable.InputStream in,
org.omg.CORBA.portable.ResponseHandler handler){
org.omg.CORBA.portable.ResponseHandler handler){
// ...
// ...
}
}
}
}
10
Arquitectura de la aplicación
Cliente
Client.java
main()
Servidor
ServerPOA.java
main()
usa
CalculatorHelper
Calculator_Stub
ORB
crea
Objeto
CalculatorPOAImpl
Skeleton
Calculator
(CalculatorPOA)
11
Programación del cliente:
Modelos de implementación
Modelos de implementación
Clase java con método main
Applet de java con método init
Tareas a realizar
1. Conectar el cliente al orb (Inicializar ORB)
2. Obtener referencia a un objeto CORBA que
implemente interfaz Calculator
Usando método string_to_object()
Usando servicio de nombres (solución estándar)
3. Usar el objeto CORBA como si fuese local
12
Programación del Cliente:
Conectarse al ORB
Para conectarse al ORB es necesario invocar al método
estático org.omg.CORBA.orb.init() que devuelve un
objeto orb
Sobre este objeto ose pueden invocar el resto de los
métodos que definen la funcionalidad del orb
El método init() sin parámetros devuelve un orb único
Llamadas sucesivas a este orb devoverían ref al mismo
objeto
También se puede invocar al método con parámetros
para funcionalidad adicional:
En aplicaciones: init(args, null)
En applets: init( Applet app, java.util.Properties props) ej:
init(this, null)
13
Programación del Cliente:
Obtención de refs. a objetos corba
El ORB es capaz de convertir de un string a una ref a un objeto
corba y viceversa.
La ref a un objeto corba encapsula
Dirección de red del proceso servidor
Un identificador único (puesto por el servidor) que identifica la
implementación concreta a la que va dirigida la petición
Al obtenerse una ref a un objeto corba en realidad obtenemos una
ref a un objeto java que implementa en el cliente el representante
(stub) del proceso servidor
Cuando el cliente obtiene ref a objeto corba
El ORB instancia un proxi (stub) en el lenguaje apropiado en el espacio
del cliente. El cliente no puede instanciar estas referencias lo hace
siempre el ORB
Una vez creado el stub, el cliente realiza operaciones sobre él.
El stub hace marshalling de las peticiones y se las pasa al ORB
El ORB localiza al servidor y establece las conexiones de transporte
necesarias de forma transparente para el cliente.
Con la respuesta del servidor se realiza el proceso inverso
14
Referencias a objetos
Uso del Servicio de Nombres
El Servicio de Nombres guarda pares
<nombre, referencia a objeto>
Los nombres están organizados en una jerarquía
El Servicio de Nombres es usado por cliente y servidor:
El servidor asocia (bind) en el Servicio de Nombres una referencia a
objeto con un nombre
El cliente puede pedirle al Servicio de Nombres que a partir de un
nombre le dé (resolve) una referencia a un objeto CORBA
Servicio de Nombres
Servidor
bind(A, ref)
A
jerarquía de
nombres
(*) Gráfico: Juan Pavón. UCM
resolve(A)
cliente
ref
proxyA
15
Referencias a objetos
Uso del Servicio de Nombres
Los nombres en el Servicio de Nombres se organizan jerárquicamente
(como sist de ficheros)
Cada nodo en la jerarquía de nombres puede ser:
NamingContext: Define un espacio de nombres
Name: Tiene asociada una referencia a un objeto
Cada NameComponent es un par identificador, clase <id, kind>. Kind es opcional
Un objeto puede tener asociados varios nombres
Compañía
Name
NamingContext
Sucursales
Presidente
Divisiones
Personal
Barcelona
Madrid
Valencia
RRHH
Ventas
Producción
Director
Soporte
Director
Vendedor1
Pérez
López
(*) Gráfico: Juan Pavón. UCM
Directorio Sucursales
16
CORBA Ejemplo 1
Desarrollo del cliente
public class Client{
public static void main( String args[] ) {
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args,null);
org.omg.CORBA.Object obj = null;
org.omg.CosNaming.NamingContext naming = null;
try{
1) Inicializar el ORB
obj = orb.resolve_initial_references("NamingService");
naming = org.omg.CosNaming.NamingContextHelper.narrow(obj);
org.omg.CORBA.ORB orb =
org.omg.CORBA.ORB.init(args,null);
System.out.println("No se ha po
Comentarios de: Tecnologías de Objetos Distribuidos: CORBA IDL (Invocación Estática) (0)
No hay comentarios