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