## Un Aplicación Multi-Fila con Beans de Enterprise

La proliferación de aplicaciones basadas en internet - e intranet - ha creado una gran necesidad de aplicaciones transacionales distribuidas que aumente la velocidad, seguridad y rendimiento de la tecnología del lado del servidor. Una forma de conseguir estas necesidades es usar un modelo multi-fila donde una pequeña aplicación cliente invoca lógica de negocio que se ejecuta en el servidor.

Normalmente, las pequeñas aplicaciones clientes multi-hilo son dificiles de escribir porque se involucran muchas líneas de código intrincado para manejar la transación, el control de estados, multithreads, solape de recursos y otros detalles complejos de bajo nivel. Y para rematar estas dificultades, tenemos que retrabajar este código cada vez que escribamos una aplicación porque es tan de bajo nivel que no es reutilizable.

Si pudieramos usar un código de manejo de transaciones preconstruido por alguien o incluso si puedieramos reutilizar algo de nuestro propio código, ahorrariamos mucho tiempo y energía que podríamos utilizar para resolver otros problemas. Bien, la tecnología Enterprise JavaBeansTM puede darnos la ayuda necesaria. Esta tecnología hace sencillas de escribir las aplicaciones transacionales distribuidas porque separa los detalles de bajo nivel de la lógica del negocio. Nos concentramos en crear la mejor solución para nuestro negocio y dejamos el resto a la arquitectura oculta.

Este capítulo describe cómo crear la aplicación de subastas del ejemplo usando los servicios proporcionados por la plataforma Enterprise JavaBeans. En los siguientes capítulos veremos como podemos personalizar estos servicios e integrar estas características en aplicaciones existentes no EJB.

- Enterprise Beans Definidos
- Pequeños Programas Clientes
- Arquitectur Multi-Hilo
- Beans de entidad y de sesión
- La Casa de Subastas Funciona
- Desarrollar y Ejecutar Aplicaciones
- ¿Cómo funcionan las Aplicaciones multi-hilo?

### Enterprise Beans Definidos

Un Bean Enterprise es una clase que proporciona dos tipos de métodos: lógica de negocio y ciclo de vida. Un programa cliente llama a los métodos de la lógica de negocio para interactuar con los datos contenidos en el servidor. El contenedor llama a los métodos de ciclo de vida para manejar el Bean en el servidor. Además de estos dos tipos de métodos, un Bean Enterprise tiene un fichero de configuración asociado, llamado un descriptor de desarrollo, se usa para configurar el Bean en el momento del desarrollo.

Así como es el responsable de la creacción y borrado de Beans, el servidor de JavaBeans de Enterprise también maneja las transaciones, la concurrencia, la seguridad y la persistencia de datos. Incluso las conexiones entre el cliente y el servidor se proporcionan usando los APIs de RMI y JNDI y opcionalmente los servidores pueden proporcionar escalabilidad a través del manejo de threads.

El ejemplo de la casa de subastas implementa una completa solución de JavaBeans de Enterprise que sólo proporcionan la lógica de negocio y usa los servicios ocultos proporcionados por la arquitectura. Sin embargo, podríamos encontrar que el servicio de contenedores controladores, aunque proporcionando una máxima portabilidad, no consigue todos los requerimientos de nuestra aplicación. En los próximos capítulos veremos cómo proporcionar estos servicios a nuestro Bean y también como usar estos servicios en aplicaciones que no usen Beans de Enterprise.

### Pequeño Programas Cliente

Un pequeño cliente es un programa cliente que invoca a la lógica de negocio que se ejecuta en el servidor. Se llama "pequeño" porque la mayoría del proceso sucede en el servidor. En la siguiente figura, el servlet es el cliente. Invoca a los Beans Enterprise que se ejecutan sobre un servidor de JavaBeans Enterprise. También ejecuta la lógica que crea las páginas web que aparecen en el navegador.

### Arquitectura Multi-Fila

La arquitectura multi-fila o arquitectura de tres filas desciende del modelo estándard de dos filas de cliente y servidor situando una aplicación multi-fila entre el cliente y la base de datos.

Los programas clientes se comunican con la base de datos a través de la aplicación del servidor usando llamadas de alto nivel e independientes de la plataforma. La aplicación servidor responde a las peticiones del cliente, hace las llamadas necesarias a la base de datos dentro de la base de datos oculta, y responde al programa cliente de la forma apropiada.

El ejemplo de casa de subastas basado en web de tres filas consiste en el servlet cliente, el servidor Enterprise JavaBeans (la aplicación servidor), y el servidor de la base de datos como se ve en la figura.

### Beans de Entidad y de Sesión

Existen dos tipos de Beans Enterprise: Beans de entidad y de sesión. Un Bean Enterprise que implementa una entidad de negocio es un Bean de Entidad, y un Bean Enterprise que implementa una tarea de negocio es un Bean de Sesión.

Típicamente, un Bean de entidad representa una fila de datos persistentes almacenados en una tabla de la base de datos. En el ejemplo de la casa de subastas, RegistrationBean es un Bean de entidad que representa los datos de un usuario registrado, y AuctionItemBean es un Bean de entidad que represena los datos de un ítem de la subasta. Los Beans de entidad son transacionales y de larga vida. Mientras que los datos permanezcan, el Bean de entidad puede acceder y actualizarlos. Esto no significa que tengamos un Bean ejecutándose por cada fila de la tabla. Si no que los Beans Enterprise se cargan y graban cuando es necesario.

Un Bean de sesión podría ejecutar una lectura o escritura en la base de datos, pero no es necesario. Un Bean de sesión podría invocar llamadas al JDBC por sí mismo o podría usar un Bean de entidad para hacer la llamada, en cuyo caso el Bean de sesión es un cliente del Bean de entidad. Un campo de Bean contiene el estado de la conversación y son temporales. Si el servidor o el cliente se bloquean, el Bean de sesión se vá. Frecuentemente se usan los Beans de sesión con uno o más Beans de entidad y para operaciones complejas con datos.

Beans de Sesión | Beans de Entidad
--- | ---
Campos que contienen el estado de la conversación | Representan datos de la base de datos
Manejan accesos a la base de datos por parte del cliente | Comparten accesos entre múltiples usuarios
La vida del cliente es la vida del Bean | Pesiste mientras existan los datos
Pueden perderse con la transación | Transacional
No sobrevive a las caídas del servidor | Sobrevive a las caídas del servidor
No maneja los datos de forma fina | Manejo de datos de forma delicada

### La Casa de Subastas Funciona

El diagrama muestra los Beans de Enterprise para la aplicación de la casa de subastas y su relación con el servidor de JavaBeans de Enterprise. El cliente invoca la lógica de negocio en cuatro Beans de Enterprise a través de sus interfaces home y remoto. El servidor JavaBeans de este ejemplo maneja los detalles de bajo nivel incluyendo las operaciones de lectura y escritura en la base de datos.

Los cuatro Beans del ejemplo son:

- AuctionItemBean un Bean de entidad que mantiene información sobre el ítem de la subasta.

- RegistrationBean un Bean de entidad que almacena información de registro de los usuarios.

- BidderBean un Bean de sesión que usa AuctionItemBean para recuperar una listra de los ítems de la subastas, sólo los nuevos ítems, ítems cerca del cierre, e ítems cuyo sumario corresponde con una cadena de busqueda en la base de datos. También comprueba la identidad del usuario y la password cuando alguien hace una puja, y almacena las nuevas pujas en la base de datos.

- SellerBean es un Bean de sesión que usa RegistrationBean para comprobar la identidad del usuario y la password cuando alguien postea un ítem para su subasta, y AuctionItemBean para añadir nuevos ítems a la base de datos de la subasta.

Como se ve en la figura superior, un Bean de entidad o de sesión realmente es una colección de clases e interfaces. Todos los Beans de entidad y de sesión consisten en un interfae remoto, un interface home, y la clase del Bean. El servidor busca el interface home del Bean que está ejecutándose en el servidor JavaBeans de Enterprise, lo usa para crear el interface remoto, e invoca a los métodos del Bean a través del interface remoto.

- Un Interface remoto de un Bean Enterprise decribe los métodos del Bean, o qué hace el Bean. Un programa cliente u otro Bean Enterprise llama a los métodos definidos en el interface remoto para invocar la lógica de negocios implementada por el Bean.

- Un interface home de un Bean de Enterprise describe cómo un programa cliente u otro Bean Enterprise crea, encuentra (sólo los Beans de entidad), y elimina ese Bean de Enterpise de su contenedor.

- El contenedor, mostrado en cyan en el gráfico, proporciona el interface entre el Bean Interface y las funcionalidades de bajo nivel específicas de la plataforma que soporta el Bean.

### Desarrollar y Ejecutar Aplicaciones

Las herramientas de desarrollo y un servidor de JavaBeans Enterprise es esencial para ejecutar aplicaciones con JavaBeans Enterprise. Las herramientas de desarrollo generan contenedores, que son clases que proporcionan un interface de implementaciones de bajo nivel en un servidor JavaBeans Enterprise dado. El servidor proporcionado puede incluir contenedores y herramientas de desarrollo para sus servidores y normalmente publicará los interfaces de bajo nivel para que otros vendedores pueden desarrollar contenedores y herramientas de desarrollo para sus servidores.

El ejemplo de casa de subastas usa el servidor JavaBeans y las herramientas de desarrollo creadas por BEA Weblogic. Visita su site para obtener una demo de 30 días.

Como todo está sujeto a las especificaciones, todos los Beans Enterprise son intercambiables con contenedores, herramientas de desarrollo, y servidores creados por otros vendedores. De hecho, podriamos escribir nuestro propio Bean Enterprise porque es posible, y algunas veces deseable, usar Beans Enterprise escritos por uno o más proveedores que ensamblaremos dentro de una aplicación de JavaBeans Enterprise.

### Cómo Funcionan las Aplicaciones Multi-Fila

El objetivo de una aplicación multi-fila es que el cliente pueda trabajar con los datos de una aplicación sin conocer en el momento de la construcción dónde se encuentran los datos. Para hacer posible este nivel de transparencia, los servicios ocultos en una arquitectura multi-fila usan servicios de búsqueda para localizar los objetos del servidor remoto (el objeto interface del Bean remoto), y los servicios de comunicación de datos para mover los datos desde el cliente, a través del objeto servidor remoto, hasta su destino final en el medio de almacenaje.

#### Servicio de Búsqueda

Para encontrar los objetos del servidor remoto en el momento de la ejecución, el programa cliente necesita una forma de buscarlos. Una de estas formas es usar el API Java Naming y Directory InterfaceTM (JNDI). JNDI es un interface común para interfaces existentes de nombres y directorios. Los contenedores de los JavaBeans de Enterprise usan JNDI como interface para el servicio de nombres del Remote Method Invocation (RMI).

Durante el desarrollo, el servicio JNDI registra el interface remoto con un nombre. Siempre que el programa cliente use el mismo servicio de nombres y pregunte por el interface remoto con su nombre registrado, podrá encontrarlo. El programa cliente llama al método lookup sobre un objeto javax.naming.Context para preguntar por el interface remoto con su nombre registrado. El objeto javax.naming.Context es donde se almacenan las uniones y es un objeto diferente del contexto del JavaBean de Enterprise, que se cubre más adelante..

#### Comunicación de Datos

Una vez que el programa cliente obtiene una referencia al objeto servidor remoto, hace llamadas a los métodos de este objeto. Como el programa cliente tiene una referencia al objeto servidor remoto, se usa una técnica llamada "envolver datos" para hacer que parezca que el objeto servidor remoto es local para el programa cliente.

La "ordenación de datos" es donde las llamadas a métodos del objeto servidor remoto se empaquetan con sus datos y se envían al objeto servidor remoto. El objeto servidor remoto desempaqueta (desordena) los métodos y los datos, y llama al Bean Enterprise. El resultado de la llamda al Bean es empaquetado de nuevo y pasado de vuelta al cliente a través del objeto servidor remoto, y son desempaquetados.

Los contenedores de JavaBeans Enterprise usan servicios RMI para ordenar los datos. Cuando se compila un Bean, se crean unos ficheros stub (talón) y skeleton (esqueleto). El fichero talón proporciona la configuración del empaquetado y desempaquetado de datos en el cliente, y el esqueleto proporciona la misma información para el servidor.

Los datos se pasan entre el programa cliente y el servidor usando serialización. La serialización es una forma de representar objetos JavaTM como bytes que pueden ser enviados a través de la red como un stream y pueden ser reconstuidos en el mismo estado en el que fueron enviados originalmente.

Ozito