JEE Enterprise Java Beans Sistemas Distribuidos Reny Alvarado. Caracas, Febrero 2007
Aspectos a tratar Java. JEE Java Platform, Enterprise Edition Modelo de Aplicación de JavaEE Arquitectura multicapas de JEE Contenedores JEE Enterprise Bean Tipos de Enterprise Bean Definir accesos de clientes con interfaces Contenido de un Enterprise Bean Convenciones de nombres para Enterprise Bean Ejemplo de aplicación.
Java Es un lenguaje de programación orientado a objetos. Fue dado a conocer en el año 1995 en la Conferencia de Diseño, Tecnología y Entretenimiento, en Monterrey.
Características de Java Seguridad Simplicidad Portable Distribuido Multi-hilo Arquitectura neutral Características Orientado a Objetos Robusto Interpretado Fuertemente tipificado Dinámico
La plataforma Java
Java Virtual Machine Es una aplicación que representa a un procesador genérico Aspectos en el cual corren los bytecodes de Java. Hace que Java sea independiente de plataforma. Especificación abstracta JVM Implementación Concreta Instancia en Tiempo de Ejecución.
Impacto de Java en la WWW
JEE Java Platform, Enterprise Edition Es una plataforma de programación para desarrollar y correr aplicaciones Java de arquitecturas multicapas distribuidas. Incluye varias APIs, tales como: JDBC, RMI, e mail, JMS, web services, XML, Enterprise JavaBeans, servlets, Java Server Pages, y la Java Persistence API entre otros.
Modelo de Aplicación de Java EE El modelo JEE comienza con el lenguaje de programación Java y la JVM. Soporta aplicaciones que implementan servicios empresariales. Los requerimientos de los clientes son tratados en la capa media del modelo, que es controlada por el departamento de tecnología de información de la empresa. La capa media corre en un hardware dedicado y tiene acceso a todos los recursos empresariales. Divide el trabajo en dos partes: la lógica del negocio y la presentación.
Arquitectura Multicapas de JEE Una capa es un concepto abstracto que define un grupo de tecnologías que proporcionan uno o más servicios a sus clientes. J2EE consiste de cuatro capas, cada una de las cuales se enfoca en proporcionar a una aplicación un tipo específico de funcionalidad.
Arquitectura Multicapas de JEE Capa Cliente Capa Web Capa de EJB Capa de sistemas de información empresarial Componente Componente Componente Componente Componente Componente Componente Componente
Procesamiento de peticiones en JEE Componente Capa Cliente Respuesta Capa Web Componente Petición del cliente Componente Componente Respuesta Capa de EJB Componente EJB Respuesta Capa de sistemas de información empresarial Componente Petición del cliente Petición del cliente RBMS
Ejemplo de una aplicación JEE
Contenedores JEE Normalmente, las aplicaciones multicapas son difíciles de escribir. La arquitectura independiente de plataformas y el hecho de que JEE esté basado en componentes facilitan la escritura de aplicaciones porque la lógica del negocio es organizada dentro de componentes reusables. JEE proporciona servicios en forma de contenedor para cada componente. Un contenedor es una interface entre un componente y una funcionalidad de una plataforma específica de bajo nivel que soporta ese componente.
Servicios contenedores Modelo de seguridad de Java EE: Permite configurar un componente para que sea accedido sólo por usuarios autorizados. Modelo de transacción de Java EE: Todos los métodos en una transacción son tratados como una unidad sencilla. Servicios de búsqueda de JNDI: Proporciona una interfaz unificada para servicios de múltiples nombres y directorios Modelo de conectividad remota de Java EE: Administra las comunicaciones de bajo nivel entre clientes y EJB s
Tipos de contenedores Servidor JEE: Proporciona EJB y contenedores web. Contenedor EJB: Administra la ejecución de EJB para aplicaciones JEE. Contenedor web: Administra la ejecución de páginas JSP y componentes servlets para aplicaciones JEE. Contenedor de aplicaciones cliente: Administra la ejecución de componentes de tipo aplicaciones cliente. Contenedor de applets: Administra la ejecución de applets.
Enterprise Bean Es un componente del lado del servidor, escrito en lenguaje de programación java, que encapsula la lógica de negocios de la aplicación. El contenedor EJB proporciona servicios como seguridad y transacciones a sus Enterprise Beans permitiendo al desarrollador la construcción y desarrollo rápido de los mismos.
Beneficios de Enterprise Beans El contenedor EJB le proporciona servicios del nivel del sistema y el desarrollador se concentra en resolver los problemas del negocio. Los clientes son más ligeros porque la lógica del negocio es contenida en los beans y no en el cliente. Así, el desarrollador del cliente no tiene el código que implementa la lógica del negocio o los accesos a la base de datos. Los beans son componentes portables.
Cuándo usar Enterprise Bean? La aplicación debe ser escalable. Las transacciones deben asegurar la integridad de los datos. La aplicación tendrá una variedad de clientes.
Tipos de Enterprise Bean Session Ejecuta una tarea para un cliente. Opcionalmente puede implementar un servicio web. Message Driven Actúa como un listener para tipos de mensajes particulares, tales como el API de Servicios de Mensajes de Java.
Qué es una Session Bean? Una Session Bean representa un componente sencillo dentro de un servidor de aplicación. Para accesar una aplicación que es desarrollada en el servidor, el cliente invoca los métodos de la Session Bean. Una Session Bean es similar a una sesión interactiva ya que no es compartida, tiene sólo un cliente y no es persistente. La sesión permanece mientras el cliente esté conectado con el servidor
Modos de administración de estado Stateful Session Bean Las variables de instancia representan el estado de una única sesión cliente bean. El estado es llamado estado conversacional porque el cliente interactúa con su bean. El estado es retenido mientras dure la sesión, cuando la sesión finaliza el estado desaparece. Stateless Session Bean No existe un estado conversacional entre el cliente y el bean. Cuando el cliente invoca un método del bean, las variables de instancia bean pueden contener un estado, pero sólo durante la duración de la invocación. Excepto durante la invocación de un método, todas las variables de instancia son equivalentes, permitiendo al contenedor EJB asignar una instancia a cualquier cliente.
Cuándo usar Session Bean? Session Bean Si en un momento dado, solo un cliente tiene acceso a una instancia bean. El estado de un bean no es persistente, existiendo solo por un período corto. El bean implementa un servicio web. Stateful Session Bean El estado del bean representa la interacción entre el bean y un cliente específico. El bean necesita mantener información del cliente a través de las invocaciones de métodos. El bean es un mediador entre el cliente y los otros componentes de la aplicación. Stateless Session Bean El estado del bean no tiene datos de un cliente específico. En una invocación de método simple, el bean ejecuta una tarea genérica para todos los clientes.
Qué es Message Driven Bean? Es un Enterprise Bean que permite a las aplicaciones Java EE procesar mensajes asincrónicamente. Los mensajes pueden ser enviados por cualquier componente JEE, una aplicación JMS o una aplicación que no usa la tecnología Java. Message Driven Bean pueden procesar mensajes JMS y otros tipos de mensajes. Se diferencia de un Session Bean en que el cliente no puede accesarlos por medio de interfaces.
Características de Message Driven Bean Son invocados asincrónicamente. No representan directamente datos compartidos en la base de datos, pero pueden acceder y modificar esos datos. Pueden ser transacciones completas. Pueden ser de corta duración.
Cuándo usar Message Driven Bean? Los Session Bean permiten enviar mensajes JMS y recibirlos sincrónicamente pero no asincrónicamente. Para recibir mensajes asincrónicamente use Message Driven Bean
Uso de los Message Driven Beans
Definir accesos de clientes con interfaces Sólo aplica a Session Bean ya que los Message Driven Bean no tienen interfaces que definen el acceso de los clientes. Un cliente puede accesar el Session Bean sólo a través de los métodos definidos en la interface de negocio del Bean. La interfaz del negocio define la vista de cliente de un Bean, los otros aspectos del Bean son ocultados al cliente. Las interfaces bien diseñadas simplifican el desarrollo y mantenimiento de aplicaciones JEE. Cuando se diseña una aplicación JEE se debe decidir el tipo de acceso permitido al cliente: remoto, local o servicio web.
Clientes Remotos Puede correr en otra máquina y otra JVM Puede ser un componente web, una aplicación cliente u otro Enterprise Bean. Para un cliente remoto la localización del Enterprise Bean es transparente.
Clientes locales Debe correr en la misma JVM a la que tiene acceso el Enterprise Bean. Puede ser un componente web u otro Enterprise Bean. Para un cliente local, la ubicación del Enterprise Bean no es transparente.
Clientes Locales vs. Clientes Remotos Acoplamiento fuerte o ligero de los beans relacionados. Tipos de clientes. Distribución de componentes. Rendimiento.
Clientes de Servicios Web Un cliente de servicio web puede accesar una aplicación JEE de dos maneras: El cliente puede accesar un servicio web creado con JAX WS. El cliente puede invocar los métodos del negocio utilizando un stateless session bean.
El contenido de un Enterprise Bean Para desarrollar un Enterprise Bean se depe proporcionar los siguientes archivos: Clase Enterprise Bean: Implementa los métodos definidos en la interfaz del negocio y algunos métodos callback del ciclo de vida. Interfaces del negocio: Clases de ayuda (Helper): La interfaz del negocio define los métodos implementados por la clase Enterprise Bean Otras clases necesitadas por la clase Enterprise Bean.
Estructura de un JAR Enterprise Bean
Convenciones de nombres para Enterprise Bean Enterprise beans están compuestos por múltiples partes, por ello es útil seguir las siguientes convenciones de nombres. Item Nombre Sintaxis <name>bean Ejemplo CuentaBean Clase <name>bean CuentaBean Interfaz del negocio <name> Cuenta
Cuando usar EJB: Transacciones de negocios multisistemas Funcionalidad distribuida Componentes portables Aplicaciones que necesiten comunicación asincrona Presencia de múltiples roles de seguridad
Cuando no usar EJB: Control por parte de la aplicación de la concurrencia. Rendimiento. Aplicaciones con poca lógica de negocio.
Ejemplo: Interfaz de Negocio package cart.ejb; import cart.util.bookexception; import java.util.list; import javax.ejb.remote; @Remote public interface Cart { public void initialize(string person) throws BookException; public void initialize( String person, String id) throws BookException; public void addbook(string title); public void removebook(string title) throws BookException; public List<String> getcontents(); public void remove(); }
Ejemplo: Stateful Session Bean package cart.ejb; } import cart.util.bookexception; import cart.util.idverifier; import java.util.arraylist; import java.util.list; import javax.ejb.remove; import javax.ejb.stateful; IdVerifier idchecker = new IdVerifier(); if (idchecker.validate(id)) { customerid = id; } else { throw new BookException("Invalid id: " + id); } contents = new ArrayList<String>(); @Stateful() public class CartBean implements Cart { List<String> contents; String customerid; String customername; public void initialize(string person) throws BookException { if (person == null) { throw new BookException("Null person not allowed."); } else { customername = person; } } public void addbook(string title) { contents.add(title); } public void removebook(string title) throws BookException { boolean result = contents.remove(title); if (result == false) { throw new BookException("\"" + title + "\" not in cart."); } customerid = "0"; contents = new ArrayList<String>(); } } public List<String> getcontents() { return contents; } public void initialize( String person, String id) throws BookException { if (person == null) { throw new BookException("Null person not allowed."); } else { customername = person; @Remove() public void remove() { contents = null; } }
Ejemplo: Stateless Session Bean package com.sun.tutorial.javaee.ejb.helloservice; import javax.ejb.stateless; import javax.jws.webmethod; import javax.jws.webservice; @Stateless @WebService public class HelloServiceBean { private String message = "Hello, "; public void HelloServiceBean() { } } @WebMethod public String sayhello(string name) { return message + name + "."; }
Ejemplo: Message Driven Bean import javax.ejb.messagedriven; import javax.ejb.messagedrivencontext; import javax.ejb.activationconfigproperty; import javax.jms.messagelistener; import javax.jms.message; import javax.jms.textmessage; import javax.jms.jmsexception; import javax.annotation.resource; import java.util.logging.logger; public void onmessage(message inmessage) { TextMessage msg = null; try { if (inmessage instanceof TextMessage) { msg = (TextMessage) inmessage; logger.info("message BEAN: Message received: " + msg.gettext()); } else { logger.warning( "Message of wrong type: " + inmessage.getclass().getname()); } } catch (JMSException e) { e.printstacktrace(); mdc.setrollbackonly(); } catch (Throwable te) { te.printstacktrace(); } @MessageDriven(mappedName = "jms/queue") public class SimpleMessageBean implements MessageListener { static final Logger logger = Logger.getLogger("SimpleMessageBean"); @Resource private MessageDrivenContext mdc; public SimpleMessageBean() { } } }
Gracias Reny Alvarado