miércoles, 12 de agosto de 2009

Introducción a Jboss Seam

Seam es un "application framework", mismo spring, para aplicaciones empresariales Java que está inspirado en los siguientes principios:

Un tipo de "componente"
Seam define un modelo de componentes uniforme para toda la lógica de negocio de tu aplicación. Un componente Seam puede ser stateful(con estado), y este estado asociado con cualquiera de uno de los varios predefinidos contextos, incluyendo long-running, persistencia, procesos de negocio y el contexto conversacional, el cual es preservado a través de multiples solicitudes(request) en una interacción de usuario.

En seam no hay distinción entre los componentes de la capa de presentación y los componentes de la lógica de negocio. A diferencia de los componentes Java EE, los componentes Seam pueden simultaneamente acceder al estado asociado con la solicitud web(request) y el estado de los recursos transaccionales(sin la necesidad de propagar el estado de la solicitud web manualmente mediante parámetros de métodos).

Tú pódrías objetar que hacer una aplicación en capas conforme a la plataforma J2EE es un "buen mecanismo", bueno nada te detiene de crear una arquitectura equivalente en capas usando Seam, la diferencia es que tienes que llegar a la arquitectura de tu aplicación y decidir cuales son las capas y como trabajan juntas.

JSF integrado con EJB3
Jsf y Ejb son dos de las mejores nuevas características de Java EE5. Ejb3 es una "marca"(mismo pepsi ó coca-cola) en el modelo de componentes para lógica de persistencia y de negocio del lado del servidor; mientras tanto, Jsf es un gran modelo de componentes para la capa de presentación. Desafortunadamente, ningún modelo de componentes es capaz de resolver todos los problemas en una aplicación por sí sola. En cambio, Jsf y Ejb3 trabajan mejor usadas juntas, pero la especificación Java EE5 no proporciona una manera para integrar estos dos modelos de componentes. Afortunadamente, los creadores de ambos modelos visionaron esta situación y proporcionaron puntos de extensión standarizados para permitir justamente la extensión e integración con otros frameworks.

Seam unifica el modelo de componentes de Jsf y Ejb3, eliminando el código de acoplamiento, y dejando al desarrollador que piense en del problema del negocio.

Es posible escribir aplicaciones Seam donde "todo" es un Ejb, Esto puede ser una sorpresa si estás acostumbrado a pensar en un Ejb como un objeto pesado, como vemos, la versión Ejb3 a cambiado completamente la naturaleza de Ejb desde el punto de vista del desarrollador. Un Ejb es un objeto ligero, es decir, nada más complejo que un JavaBean con anotaciones. Seam incluso alienta el uso de beans de sesion como escuchadores de acciones("action listeners") Jsf.

Sobre el otro lado, si tu prefieres no adoptar Ejb3 en este momento, pues simplemente no lo hagas. Virtualmente cualquier clase Java puede ser un componente Seam, y Seam proporciona toda la funcionalidad que tu esperas de un contenedor "ligero", y más, para cualquier componente, ó Ejb en otros casos.

Ajax Integrado.
Seam soporta las mejores soluciones Ajax de fuente abierta basada en Jsf: JBoss Richfaces y ICEFaces. Estas soluciones te permiten agregar capacidad Ajax a tu interface de usuario sin la necesidad de escribir ninguna linea de código javascript.

Alternativamente, Seam proporciona un capa remota de JavaScript que permite llamar a componentes asincrónicamente desde JavaScript del lado del cliente sin la necesidad de una capa intermedia, puedes incluso suscribirte a "topics JMS" del lado del servidor y recibir mensajes via "Ajax push".

Ninguno de estos enfoques funcionaría bien sino fuera por las capacidades de Seam en lo que se refiere a concurrencia y a gestion del estado, lo cual asegura que muchas solicitudes concurrentes asincrónicas Ajax son controladas en forma segura y eficientemente sobre el lado del servidor.

Proceso de negocio como una construcción de primera clase.
Opcionalmente, Seam proprciona gestión de procesos de negocio transparente vía jBPM, no podrás creer cuán fácil es implementar flujos de trabajo complejos, colaboración y gestión de tareas usando jBPM y Seam. Seam incluso permite definir flujos de página en la capa de presentación usando el mismo lenguaje(jPDL) que jPBM usa para definición de procesos de negocio.

Jsf, proporciona un enriquecido modelo de eventos para la capa de presentación, Seam implementa este modelo exponiendo eventos relacionados a procesos de negocio jBPM's vía exactamente el mismo mecanismo de manipulación de eventos, proporcionando un modelo de eventos uniforme para el modelo de componentes uniforme de Seam.

Gestión de estados declarativo.
Todos estamos acostumbrados al concepto de gestión de transacciones declarativas y seguridad declarativa desde los primeros días de Ejb, Ejb3 incluso introduce gestión del contexto de persistencia en forma declarativa. Los siguientes son tres ejemplos de un amplio problema de gestión de estados que es asociado con un contexto particular, mientras nos aseguramos que todas las necesidades de limpieza ocurren cuando un contexto finaliza, Seam toma el concepto de gestión de estados en forma declarativa en forma más profunda y aplica esto al estado de la aplicación.

Tradicionalmente, las aplicaciones J2EE implementan gestión del estado manualmente, obteniendo y colocando atributos de sesión y de solicitud(request), este enfoque de gestión del estado es la fuente de muchos bugs y fugas de memoria, cuando la aplicación falla en la limpieza de atributos de sesión, ó cuando la data asociada con diferentes flujos de trabajo colisionan en una aplicación de multiples ventanas(cuando el usuarioabre varias ventanas del navegador para usar su sesión).

Seam tiene el potencial para enteramente eliminar esta clase de bugs.

La gestión de estados de la aplicación en forma declarativa es hecha posible por la riqueza del modelo contextual definido por Seam. Seam extiende el modelo contextual definido por la especificación servlet(request,session,application) con dos nuevos contextos: conversacional(conversation) y procesos de negocio(business process), que son más significativos
desde el punto de vista de la lógica de negocio. Tú estarás maravillado de cuántas cosas pueden ser más fáciles una vez que nos iniciamos usando conversaciones(conversations).

¿Alguna vez has sufrido tratando con "lazy association fetching"(sacar consultas de base de datos y ejecutarlas conforme lleguen) en una solución ORM como Hibernate o JPA?.
Usando los contextos de persistencia de Seam en un alcance conversacional raramente
veremos una excepción del tipo LazyInitializationException.

¿Has tenido problemas con el botón F5(el botón de actualización)?,
¿Con el botón de flechita atrás(cuando el usuario quiere ver la página anterior)?,
¿Con envios de formularios duplicados?
¿Con propagación de mensajes a través de un post y luego una redirección?

La gestión conversacional de Seam resuelve estos problemas sin la necesidad de pensar en ellos.


Biyección
La noción del control invertido o inyección de dependencias existe tanto en Jsf como Ejb3, asi como tambien en numerosos asimismos llamados "contenedores ligeros".

Muchos de estos contenedores enfatizan la inyección de componentes que implementan servicios sin estado. Incluso cuando la inyección de componentes con estado es soportada(como con Jsf), es virtualmente menos usado para controlar el estado de la aplicación porque el alcance del componente con estado no puede ser definido con sufiente flexibilidad, y porque componente pertenecientes a amplios alcanes no pueden ser inyectados dentro de componentes pertenecientes a alcances más limitados.

Biyección difiere del control invertido en que es dinámico y bidireccional, podriamos pensar en esto como un mecanismo de alias para variables contextuales(nombres en alguno de los contextos enlazados al hilo de ejecución actual) a atributos de el componente. La biyección permite auto ensamblaje de componentes con estado por el contenedor, esto incluso permite a un componente asegurar y facilmente manipular el valor de una variable contextual, simplemente asignandola a un atributo del componente.

Preferir anotaciones a XML
Tradicionalmente, la comunidad java a estado en una confusión profunda acerca precisamente de que tipo de metainformación debe estar como configuración. J2EE y populares contenedores ligeros han proporcionado descriptores de despliegue basados en XML tanto para cosas que son verdaderamente configurables entre diferentes despliegues del sistema, y para cualquier otro tipo de declaración la cual no puede ser fácilmente expresada en java. Las anotaciones de Java 5 cambian todo esto.

Ejb3 adopta las anotaciones y la "configuración por excepcion" como la más fácil manera para proporcionar información a el contenedor en una forma declarativa. Seam extiende la anotaciones proporcionadas por Ejb3 con un conjunto de anotaciones para gestión del estado en forma declarativa y demarcación del contexto tambien en forma declarativa. Esto permite eliminar las declaraciones de beans gestionados en Jsf(managed beans) y reduce el XML requerido a justamente la información que verdaderamente pertenece a XML(las reglas de navegación Jsf).


No hay comentarios.:

Publicar un comentario

Es bueno comunicarnos, comenta!!.