Download Programación de servidores CORBA con Java - Grasia

Document related concepts
no text concepts found
Transcript
Implementaciones de servidores CORBA
con Java
Sistemas Distribuidos:
Programación con CORBA
Juan Pavón Mestras
Dep. Sistemas Informáticos y Programación
Universidad Complutense Madrid
Implementación de servidores CORBA
Un servidor CORBA consta de:
n
Un programa principal
n
n
n
n
Inicializa ORB y POA
Crea objetos CORBA
Bucle de eventos
Servidor
main()
A1
Varios objetos CORBA (servants)
n
• Por herencia de la clase
<interface>POA
• Por delegación, usando la clase
<interface>POATie
n
crea
Implementan interfaces
A2
B1
Pueden crear otros objetos
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
2
1
Programa principal
El programa principal de un servidor CORBA consiste en:
n
Conectar el servidor al ORB
n
Obtener una referencia al POA raíz
n
Crear y activar servants
• Usando el método org.omg.CORBA.ORB.init()
main()
• Con orb.resolve_initial_references(“RootPOA”)
• Un servant se implementa con algún objeto Java
• El método _this() activa el servant dándolo a conocer al POA y
devuelve la referencia de objeto CORBA asociada
n
Publicar las referencias a objetos CORBA para que sean
accesibles a los clientes
• Por ejemplo, uUsando el servicio de nombres
n
n
Activar el gestor del POA raíz
Iniciar un bucle de recepción de eventos
• Con el método run() el servidor se queda a la espera de que
algún cliente intente enviar una petición a uno de los objetos
CORBA
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
3
Programa principal
// Inicializa el ORB
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, props);
// Crea un POA
org.omg.PortableServer.POA POAraiz = org.omg.PortableServer.POAHelper.narrow(
orb.resolve_initial_references("RootPOA"));
// Crea el objeto Contador
ImplContador unServantContador = new ImplContador();
Contador objetoContadorCORBA = unServantContador._this(orb);
// ... y exporta su referencia en el servicio de nombres:
// ...
ns.rebind(nombreContador, objetoContadorCORBA );
// Obtiene la referencia al manager del rootPOA y lo activa
org.omg.PortableServer.POAManager gestorPOA = POAraiz .the_POAManager();
gestorPOA.activate();
// Se queda esperando peticiones de servicio
System.out.println("Servidor preparado para recibir peticiones");
orb.run();
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
4
2
Funcionamiento del servidor
servants
dispatch
Servidor
POA
gestor de POAs
ORB
nueva petición
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
5
Gestor de POAs (POA manager)
n
Representa un extremo de transporte usado por uno o varios POAs
n
Controla el flujo de peticiones a los POA
Cada POA tiene asociado un gestor de POAs que se asigna cuando se
crea el POA y no puede cambiarse
n
n
Por ejemplo, si se usa TCP/IP: <dirección IP, puerto>
module PortableServer {
// ...
interface POAManager {]
exception AdapterInactive {};
enum State { HOLDING, ACTIVE, DISCARDING, INACTIVE };
State get_state();
void activate() raises(AdapterInactive);
void hold_requests(in boolean wait_for_completion) raises(AdapterInactive);
void discard_requests(in boolean wait_for_completion) raises(AdapterInactive);
void deactivate(in boolean etherealize_objects,in boolean wait_for_completion)
raises(AdapterInactive);
};
};
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
6
3
Gestor de POAs (POA manager)
activate
Active
activate
activate
hold_requests
creation
deactivate
Holding
hold_requests
discard_requests
deactivate
discard_
requests
Inactive
destruction
deactivate
Discarding
discard_requests
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
7
POA
n
Puente entre objeto CORBA y la implementación de
su comportamiento (servant)
n
n
n
El POA es un espacio de nombrado para los servants
n
n
n
Hace la correspondencia entre las peticiones que llegan al
servidor y las instancias de objeto
Lleva la relación entre referencias a objetos, identificadores
de objeto y servants
Un POA puede tener varios servants pero un servant sólo
puede pertenecer a un POA
Todos los servants de un POA comparten un conjunto de
características determinadas por las políticas del POA
Puede haber varios POAs en un servidor
n
Además del POA raíz (que existe desde siempre y hasta el
final)
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
8
4
Referencias a objetos
n
Una referencia a objeto tiene:
n
Un identificador de repositorio
n
Información de direccionamiento
n
Clave de objeto
• identifica una interfaz (opcional)
• identifica una dirección de transporte
• identifica un POA y un objeto dentro de un POA
• la clave de objeto tiene un formato propietario de cada ORB
Object Reference
Repository ID
Juan Pavón Mestras, UCM 2000-01
Transport Address
Object Key
POA name Object ID
Implementación de servidores CORBA
9
POA
n
Cada POA tiene asociadas 7 políticas que controlan
las características de las referencias a objetos y los
servants:
n
n
LifespanPolicy indica si las referencias son transistorias o persistentes
IdAssignmentPolicy indica si object id es definido por la aplicación o
por el ORB
n
IdUniquenessPolicy indica si hay un servant por cada objeto CORBA o
si un servant puede encarnar varios objetos CORBA
n
ImplicitActivationPolicy indica si un servant debe ser activado
explícitamente o si lo es automáticamente cuando se crea la referencia
n
RequestProcessingPolicy indica si la relación object ID-servant la
mantenga la aplicación o el POA
n
ServantRetentionPolicy indica si se mantienen en memoria los
servants todo el tiempo o si se instancian cuando lleguen peticiones
n
ThreadPolicy indica si se usan varios threads para peticiones múltiples
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
10
5
POA raíz
n
El POA raíz tiene un conjunto de políticas fijas:
n
n
n
n
n
n
n
n
LifespanPolicy
IdAssignmentPolicy
IdUniquenessPolicy
ImplicitActivationPolicy
RequestProcessingPolicy
TRANSIENT
ServantRetentionPolicy
ThreadPolicy
RETAIN
SYSTEM_ID
UNIQUE_ID
IMPLICIT_ACTIVATION
USE_ACTIVE_OBJECT_MAP_ONLY
ORB_CTRL_MODEL
Este modelo es válido para objetos transitorios
n
n
Para objetos persistentes hace falta definir otro tipo de POA
Igualmente para modelos de concurrencia u otros
mecanismos más sofisticados
• Se verá en un tema posterior
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
11
Inicialización y conexión de objetos
n
Para crear un objeto CORBA hay que
n
Instanciar un objeto servant (el objeto Java que implementa
las operaciones de la interfaz)
• Por ejemplo, usando new
n
Se asocia a una referencia a objeto y se activa
• Llamando al método _this()
• Método de la clase que implementa el skeleton
• La primera vez se genera una referencia de objeto, que
devuelve el método, y se activa en el POA
• Llamadas posteriores a _this() simplemente devuelven la
referencia al objeto CORBA
ImplContador unServantContador = new ImplContador();
Contador objetoContadorCORBA = unServantContador._this(orb);
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
12
6
Bucle de eventos
n
Una vez concluida la inicialización y configuración del
servidor, se está listo para recibir operaciones sobre
los objetos
n
orb.run()
• Bloquea el servidor hasta ocurra un evento, lo trata, y vuelve a
esperar otro evento
n
Este método puede acabar si se ejecuta shutdown o destroy
• orb.shutdown(wait_for_completion)
• orb.destroy()
• Con estos métodos se llama implicitamente a POA.destroy()
para el POA raíz y éste a sus descendientes
n
Es conveniente cerrar el servidor con orb.destroy()
para liberar los recursos de forma apropiada
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
13
Implementación de interfaz
n
Herencia de la clase <interfaz>POA
class ImplContador extends ContadorPOA {
// definición de todos los métodos de la interfaz
}
...
Contador cuenta = new ImplContador();
n
Delegación desde la clase <interfaz>POATie
class ImplContador implements ContadorOperations {
// definición de todos los métodos de la interfaz
}
...
Contador cuenta = new ContadorPOATie (new ImplContador());
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
14
7
Implementación de interfaz: herencia
Contador.idl
org.omg.PortableServer
Servant
generado por el compilador de IDL a Java
ContadorPOA
<<implements>>
escrito por el programador
ImplContador
Juan Pavón Mestras, UCM 2000-01
<<interface>>
ContadorOperations
Implementación de servidores CORBA
15
Implementación de interfaz: ImplBase
Cliente
Servidor
Código
cliente
Impl
Contador
Proxy
(stub)
ORB
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
16
8
Implementación de interfaz: ImplBase
class ImplContador extends ContadorPOA {
private int valor_;
ImplContador (int valorinicial) {
valor_ = valorinicial;
}
// atributos
public int valor() { return valor_; }
// operaciones:
public int inc() { return ++valor_; }
public int dec() { return --valor_; }
}
Contador cuenta = new ImplContador(“Contador1”, 0);
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
17
Implementación de interfaz: TIE
Contador.idl
ContadorPOA
generado por el compilador de IDL a Java
ContadorPOATie
delega
<<interface>>
ContadorOperations
<<implements>>
escrito por el programador
Juan Pavón Mestras, UCM 2000-01
ImplContador
Implementación de servidores CORBA
18
9
Implementación de interfaz: TIE
Cliente
Servidor
Impl
Contador
Código
cliente
Contador
POAtie
Proxy
(stub)
ORB
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
19
Implementación de interfaz: TIE
class ImplContador implements contadorOperations {
private int valor_;
ImplContador (int valorinicial) {
valor_ = valorinicial;
}
// atributos
public int valor() { return valor_; }
// operaciones:
public int inc() { return ++valor_; }
public int dec() { return --valor_; }
}
ImplContador delegado = new ImplContador();
ContadorPOATie unObjetoContador = new ContadorPOATie(delegado);
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
20
10
Servidores con varias interfaces
n
n
Es normal que un servidor pueda soportar varias
interfaces.
Para que una clase implemente varias interfaces es
necesario utilizar el modo de implementación TIE:
public class Implementacion
implements UsoOperations, GestionOperations
{
// implementación de las operaciones de
// las interfaces de Uso y de Gestión
}
Servidor
Implementacion
Uso
POATie
Juan Pavón Mestras, UCM 2000-01
Gestion
POATie
Implementación de servidores CORBA
21
Implementación de interfaz
¿ herencia o delegación ?
n
En principio parece más sencillo y eficiente usar la herencia
• Sólo hay un objeto Java por cada objeto CORBA
n
Pero...
• Con la herencia de <interfaz>POA el objeto Java no puede heredar
de ninguna otra clase
• Y por tanto no puede implementar varias interfaces
• El modo TIE permite que una clase de implementación pueda
heredar de alguna otra clase Java
• y por tanto puede implementar varias interfaces a la vez
• y puede reutilizar otras clases
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
22
11
Gestión de excepciones
n
Una operación de un servidor puede crear y lanzar alguna de
las excepciones definidas por el usuario
n
Ejemplo:
n
IDL:
n
Código de implementación del objeto:
void reintegro(in float cantidad) raises (SaldoInsuficiente);
public void reintegro(float cantidad)
throws Banca.CuentaPackage.SaldoInsuficiente
{
if (saldo < cantidad) {
throw new Banca.CuentaPackage.SaldoInsuficiente(saldo);
// y acaba el método
}
// ... proceso normal de la operación
}
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
23
El patrón de diseño Factoría
n
Para que un cliente pueda crear objetos en un
servidor tiene que solicitarlo a un objeto del
servidor: el objeto Factoría
n
n
n
El main() del servidor crea los objetos Factoría
Los clientes se conectan a los objetos Factoría y les solicitan
crear nuevos objetos
Los objetos Factoría ejecutan new para crear el nuevo
objeto y devuelven la referencia CORBA del nuevo objeto
• Si el objeto ya existiera, entonces la Factoría simplemente
devuelve la referencia CORBA a dicho objeto
n
n
La Factoría suele llevar un control de los objetos
creados
La interfaz de la Factoría ofrece los métodos para
crear, buscar y destruir objetos
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
24
12
El patrón de diseño Factoría
n
n
El objeto Factoría lo crea el programa principal del
Servidor
El objeto Factoría crea los demás objetos en el
espacio del Servidor a petición de los clientes
n
El objeto Factoría debe llamar al método _this() para
activar los objetos creados
Servidor
Cliente
proxy
Fact
proxyA2
usa()
Juan Pavón Mestras, UCM 2000-01
proxy
A2
crea_A()
Fact
refA2
usa()
crea
main()
new
A2
A1
Implementación de servidores CORBA
25
El patrón de diseño Factoría
module Banca {
interface Cuenta;
interface CuentaCredito: Cuenta {
... };
interface Banco {
exception Rechazada { string causa; };
exception CuentaInexistente { };
Cuenta abrirCuenta (in identificador cliente) raises (Rechazada);
CuentaCredito abrirCuentaCredito (in identificador cliente, in float credito)
raises (Rechazada);
void cerrarCuenta(in Cuenta c) raises (CuentaInexistente);
};
};
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
26
13
Resumen
n
Para programar un servidor hay que definir:
n
n
Una clase que implementa el servidor, cuyo método estático
main() se encargue de iniciar el ORB, crear algún objeto
CORBA, activarlo en el POA, y esperar a que lleguen
peticiones al servidor
Las clases que implementan las interfaces soportadas por el
servidor
• Es recomendable seguir el mecanismo de delegación en vez de
herencia para implementar las interfaces, debido a las
restricciones de la herencia sencilla en Java
n
El patrón Factoría permite implementar de forma
sencilla el ciclo de vida de los objetos CORBA
Juan Pavón Mestras, UCM 2000-01
Implementación de servidores CORBA
27
14