Session Beans y Entity Beans Avanzado Ignacio Ramos Zapata Departamento de Ingeniería Telemática Universidad Carlos III de Madrid irzapata@it.uc3m.es Caso de estudio: Entity Bean Ÿ Ciclo de vida Ÿ Ejemplos Ÿ J2EE SDK 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 2 1 Ciclo de vida de un Session EJB 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 3 Métodos del ciclo de vida Ÿ Se implementan en la clase Bean Ÿ Llevan el prefijo ejb ejbCreate, ejbActivate, etc. y además setSessionContext Ÿ Ningún otro método debe empezar por ‘ejb’, Ÿ Algunos métodos del ciclo de vida se declaran en la interfaz Home Ÿ Para session beans, solo los métodos create aparecen en la interfaz home Ÿ En la interfaz home no se usa el prefijo ‘ejb’ i.e., el método se llama ‘create’ Ÿ Lo métodos del ciclo de vida son invocados por el contenedor a lo largo de la vida del bean 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 4 2 Método ejbCreate en Stateful Session Beans Ÿ Los stateful session bean puede tener varios métodos ejbCreate Ÿ Los métodos tienen 0 o más parámetros Ÿ Pueden ser llamados ejbCreate(...) o ejbCreatexxx(...), para Ÿ usar nombres más descriptivos e.g., ejbCreateByName(String name) Ÿ Deben ser public void Ÿ Deben lanzar javax.ejb.CreateException si la creación falla. Ÿ Deben recogerse en la interfaz Home (local o remota) por un método con idénticos parámetros llamadado ‘create’ o ‘createXXX’ – Devuelven la interfaz componente del tipo apropiado – Para interfaces home remotos throws java.rmi.RemoteException – e.g., public createByName(String name) throws ... 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 5 Métodos ejbCreate en Stateless Session Beans Ÿ Para stateless session beans, solo puede haber un único método ejbCreate Ÿ Se llama ‘ejbCreate’ Ÿ No acepta parámetros Ÿ Se refleja en la interfaz home 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 6 3 Nacimiento de un Session Bean - Secuencia Ÿ 1. El cliente obtiene el interafaz home via un lookup JNDI Ÿ 2. El cliente invoca home.create(...) Ÿ 3. Los EJB object, session context y EJB instance son creados por Ÿ el contenedor Ÿ Ÿ 4. El EJB instance se dota del session context 5. La variante del ejbCreate es invocada en el EJB instance Ÿ 6. El método create devuelve el stub que usa el cliente. Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 2005 7 El EJB Session Context Ÿ Durante la creación el EJB instance es dotado con un objeto Session Context – Una instancia de javax.ejb.SessionContext Ÿ setSessionContext guarda una copia de dicho contexto Ÿ El context object contiene: – Información relacionada con la seguridad • getCallerPrinciple, isCallerInRole – Información y métodos relacionados con las transacciones • getUserTransaction, get/setRollbackOnly – Información del objeto que implementa la interfaz home • getEJBHome, getEJBLocalHome – Información del objeto que implementa la interfaz de componete o EJB Object • getEJBObject, getEJBLocalObject – No se puede retornar this en la implementación del bean 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 8 4 The EJB Session Context (cont.) Ÿ Los EJBs contienen los siguientes métodos y atributos para el manejo del contexto de la sesión: – Atributo SessionContext – Método setSessionContext que sirve para que la instancia del bean se guarde el contexto – Método getSessionContext Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 2005 9 Activación y Pasivación (stateful) Ÿ Durante el ciclo de vida del bean, el contenedor puede tomar la Ÿ decisión de pasivarlo Ÿ Normalmente para liberar memoria Ÿ El contenedor invoca ejbPassivate() antes de pasivarlo Ÿ En este método el bean debe: – Liberar recursos • Ficheros abiertos, conexiones a bases de datos , etc. – Hacer null los campos que no se quieren serializar (cache, etc.) Ÿ Si el cliente quiere acceder a un bean que se ha pasivado el Ÿ contenedor lo activa primero. Ÿ El bean se notifica con ejbActivate() justo después de haberse Ÿ serializado y recuperado a memoria – Una oportunidad de recuperar los recursos que necesite. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 10 5 Un último método del ciclo de vida Ÿ ejbRemove() se llama cuando el contenedor destruye una instancia del bean Ÿ Se usa para liberar recursos Ÿ Normalmente está vacío. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 11 El ciclo de vida de los Stateless Session EJBs Ÿ Los Session EJBs si estado no necesitan activación y pasivación – El contenedor sencillamente destruye instancias cuando necesita memoria y las vuelve a crear cuando las necesita – Sin embarto, se deben definir ejbActivate y ejbPassivate en el XBean (métodos vacíos) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 12 6 Ciclo de vida de un Entity Bean 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 13 El Bean Pool Ÿ El contenedor de EJBs mantiene un pool con los beans disponibles Ÿ Los beans en el pool no se asocian con una fila específica de una tabla de la base de datos Ÿ Cuando un bean entra en el estado ready, se le dota de identidad – Quizás una que tuvo antes (si fue pasivado) – Quizás una diferente Ÿ Cuando se requiere una instancia del bean, el contenedor seleccionará del pool de beans en vez de crear una nueva instancia 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 14 7 Creación y Destrucción de un Bean Ÿ setEntityContext se llama solo una vez – Incluso si cambia la identidad; el objeto del contexto se modificará diréctamente por el contenedor Ÿ unsetEntityContext se llama solo una vez – Cuando la instancia se borra Ÿ Se usan estos métodos para inicializar y finalizar los atributos que no dependen de la identidad del bean. Ÿ e.g., Encontrar una conexión por JNDI Ÿ Usar ejbCreate/ejbActivate y ejbRemove/ejbPassivate para inicializar o finalizar los atributos que si dependen de la identidad del bean. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 15 Métodos del ciclo de vida Ÿ Como con los Session Beans, cada método ejbCreate se refleja en la interfaz Home Ÿ Además, para cada método ejbCreate hay un método correspondiente ejbPostCreate – PostCreate se invoca después de que el bean tenga un EJB object y esté representado en almacenamiento persistente – Permite pasar referencias a otros EJBs • e.g., “relationships” Ÿ Otros métodos del ciclo de vida incluyen ejbActivate, ejbPassivate, ejbLoad, ejbStore, ejbFindByPrimaryKey y ejbRemove Ÿ La semantica exacta varía entre la gestión de la persistencia CMP y BMP 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 16 8 Secuencia en la creación de un BMP 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 17 Gestionando el almacenamiento en BMP EJBs Ÿ Cada bean representa una fila en una tabla de una base de datos relacional. Ÿ El método ejbCreate añade una fila a la tabla Ÿ El ejbRemove borra la fila representada por la instancia del bean Ÿ ejbLoad carga el valor de las variables de la instancia del bean con los correspondientes de su fila en la base de datos – Se puede encontrar la clave primaria invocando getPrimaryKey en la referencia al EntityContext Ÿ ejbStore debe actualizar la fila en la base de datos con el contenido de las variables de la instancia del bean Ÿ Si se usa JDBC es recomendable hacer pooling de conexiones 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 18 9 El papel de ejbLoad y ejbStore en BMP EJBs Ÿ Conceptualmente, ejbLoad se llama antes de cada método de negocio – Para que el método trabaje con valores actualizados Ÿ De igual manera, ejbStore se llama después de cada método de negocio – Almacenando persistentemente los cambios en variables del EJB Ÿ Como resultado los beans sobreviven a caidas del servidor Ÿ Para mejorar la eficiencia – Práctica común: caché con ‘dirty’ flag Ÿ Notar que según la especificación, el contenedor puede invocar ejbLoad y ejbStore arbitrariamente, y no tiene por qué ceñirse a antes y después de cada método de negocio. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 19 Activación y Pasivación Ÿ Las instancias del Bean se gestionan en un pool Ÿ Como os comentaba antes, una vez creada una instancia del bean puede almacenar filas distintas en activaciones distintas Ÿ Ahorra costes de inicialización Ÿ Cuando se devuelve un bean al pool (se desacia de una fila), se pasiva Ÿ Cuando volvemos a asociar una fila al bean lo activamos Ÿ La activación y pasivación no intercambian los datos con la base de datos Ÿ Se usa ejbPassivate/ejbActivate para liberar y recuperar recursos 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 20 10 Secuencia de Activación y Pasivación en BMPs 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 21 Métodos “Finder” Ÿ Dada la interfaz home, un cliente puede crear nuevas entidades EJBs usando los métodos create – Recordar que cada método create en la interfaz home tiene un correspondiente ejbCreate y ejbPostCreate en la clase bean Ÿ ¿Pero y si queremos localizar bean existentes? Ÿ La interfaz home tiene también métodos finder. – Se llaman findxxx – Deben retornar o bien java.util.Collection, una interfaz de tipo de componente – Lanzan FinderException (y RemoteException para homesremotos ) Ÿ Siempre se ha de definir: findByPrimaryKey(keytype) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 22 11 Métodos “Finder” en las clases BMP Bean Ÿ Para cada método findXXX en la interfaz home, el correspondiente método ejbFindXXX debe ser implementado Ÿ Se requiere siempre ejbFindByPrimaryKey Ÿ Los métodos “Finder” pueden devolver una sola fila de la tabla – Esto incluye el ejbFindByPrimaryKey – El valor retornado debe ser la clave primaria del registro encontrado • que es el parámetro a ejbFindByPrimaryKey’s – Lanza FinderException si no se encuentra ningún registro Ÿ Los métodos “Finder” pueden devolver una colección de registros – La declaración del método define un valor de retorno de tipo java.util.Collection – Se retorna una colección de claves primarias – Se devuelve una colección vacía si no se encuentra ningún registro 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 23 Borrando una fila Ÿ El último método del ciclo de vida, ejbRemove, debe incorporar el código para borrar la fila correspondiente de la base de datos Ÿ Puede lanzar javax.ejb.RemoveException si el proceso de borrado falla. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 24 12 Ciclo de vida en CMP Entity Beans Ÿ Cada CMP entity bean debe incluir los mismos métodos del ciclo de vida que los BMP beans Ÿ Sin embargo, la semántica es ligeramente distinta: – ejbLoad se llama justo después de que los datos sean cargados de la base de datos • Permite calcular otros valores no almacenados en la base de datos • No debe intentar cargar los datos – ejbStore se llama tras almacenar los datos en la BD • No debe guardar los datos – ejbRemove se llama antes de borrar una fila • No debe borrar la fila – Normalmente están vacíos. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 25 Métodos “Finder” en CMP Entity Beans Ÿ Los métodos “Finder” se definen en la interfaz home Ÿ Sin embargo, no hay métodos ejbFindxxx en la implementación del bean Ÿ Cada método finder tiene asociado una secuencia (en el deployment descriptor) con una consulta EJB QL Ÿ La query debe retornar una fila (como mucho) si el finder se define para devolver un bean Ÿ La query debe retornar cero o varias fila si el finder se define para devolver una collection Ÿ EJB QL es una modificación subconjunto de SQL 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 26 13 Ejercicio Ÿ Cread un entity bean CMP con los siguientes interfaces remotos: package com.titan.customer; import java.rmi.RemoteException; public interface CustomerRemote extends javax.ejb.EJBObject { public String getLastName() throws RemoteException; public void setLastName(String lname) throws RemoteException; public String getFirstName() throws RemoteException; public void setFirstName(String fname) throws RemoteException; } 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 27 Ejercicio package com.titan.customer; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.FinderException; public interface CustomerHomeRemote extends javax.ejb.EJBHome { public CustomerRemote create(Integer id) throws CreateException, RemoteException; public CustomerRemote findByPrimaryKey(Integer id) throws FinderException, RemoteException; } 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 28 14 Atributos persistentes (Entity bean CMP) Ÿ Ya vimos ejemplos: public abstract void setShipId(int ship); public abstract int getShipId( ); <cmp-field><field-name>shipId</field-name></cmp-field> Ÿ Los atributos persistentes pueden ser de tipo java primitivo o serializable 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 29 Dependent Value Classes Ÿ Proporcionan un mecanismo para mapear tipos de Java complejos a columnas en DB – los atributos se inicializan en el constructor y ya no se pueden modificar – Proporcionan métodos get y set para los atributos que agrupan – así, el cliente no cae en el error de modificar directamente los atributos del objeto devuelto (que sólo es una copia de lo que hay en la BD): las modificaciones hay que hacerlas llamando a los métodos del objeto remoto 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 30 15 Ejemplo de uso Ÿ Definir una clase Name que agrupe el nombre y apellido del Customer Ÿ Modificar el interfaz remoto: – public Name getName() throws RemoteException; – public void setName(Name name) throws RemoteException; Ÿ Añadir esos métodos al CustomerBean 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 31 Atributos de relación Ÿ Además de los atributos persitentes, los entity beans pueden tener atributos de relación que muestran la relación del bean con otros entity beans Ÿ Definir beans de baja granularidad, y relacionarlos: – como definir tablas pequeñas en la BD y relacionarlas 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 32 16 Ejemplo: AddressBean CREATE TABLE ADDRESS ( ID INT PRIMARY KEY NOT NULL, STREET CHAR(40), CITY CHAR(20), STATE CHAR(2), ZIP CHAR(10) ) Ÿ La definición de un entity bean correspondiente a esta tabla queda como ejercicio 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 33 Ejemplo: relación CustomerBean, AddressBean Ÿ En el código de CustomerBean, se añade: public abstract AddressLocal getHomeAddress(); public abstract void setHomeAddress(AddressLocal address); Ÿ La tabla de CustomerBean también se modifica CREATE TABLE CUSTOMER ( ID INT PRIMARY KEY NOT NULL, LAST_NAME CHAR(20), FIRST_NAME CHAR(20), ADDRESS_ID INT ) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 34 17 Empaquetamiento de EJBs Ÿ Una aplicación J2EE se empaqueta en un archivo Enterprise Archive (EAR). – Un archivo EAR es un archivo Java Archive (JAR) con extensión ear. Ÿ Se usa una herramienta de despliegue “Deployment Tool” como la del J2EE SDK para crear el archivo EAR – Descriptor de despliegue – Clases de los EJBs (interfaces e implementación) – Todos los JARs y/o WARs usados por la implementación del EJB 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 35 Deployment Tool 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 36 18 Creación de un EJB (I) Ÿ En el deploytool, seleccionar File -> New-> Application. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 37 Creación de un EJB (II) Ÿ New Enterprise Bean Wizard Ÿ Crea el descritor de despliegue del bean Ÿ Empaqueta el descriptor de despliegue y los .class del bean en un archivo EJB JAR. Ÿ Inserta el EJB JAR en el archivo de la aplicación .ear Ÿ El descriptor de despliegue se puede ver en: Tools->Descriptor Viewer. 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 38 19 Creación de un EJB (III) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 39 Creación de un EJB (IV) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 40 20 Creación de un EJB (V) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 41 Creación de un EJB (VI) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 42 21 Creación de un EJB (VII) 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 43 Ejercicio: Travel Agent modificado Ÿ El nuevo ejemplo de TravelAgent va a usar: – 4 entity beans: Cabin, Cruise, Reservation (usa los interfaces locales) y Customer (se pasa como argumento al create, usa interfaz remoto) – 1 stateless session bean: ProcessPayment: usa el interfaz remoto – Una clase (dependent value class) TicketDO Ÿ Nos basta con tener los interfaces de los beans que va a usar Ÿ Código de ejemplos: Ÿ http://www.oreilly.com/catalog/entjbeans3/workbooks/index.html Ÿ Ir a ex_12_2 de “J2EE™ 1.3 SDK Workbook and Examples” 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 44 22 TravelAgent: interfaz remoto public interface TravelAgentRemote extends javax.ejb.EJBObject { public void setCruiseID(Integer cruise) throws RemoteException, FinderException; public void setCabinID(Integer cabin) throws RemoteException, FinderException; public TicketDO bookPassage(CreditCardDO card, double price) throws RemoteException, IncompleteConversationalState; } Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 2005 45 TravelAgent: interfaz home public interface TravelAgentHomeRemote extends javax.ejb.EJBHome { public TravelAgentRemote create(CustomerRemote cust) throws RemoteException, CreateException; } 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 46 23 TravelAgent: funcionalidad Ÿ setCruiseID – busca el Cruise indicado y actualiza su atributo Ÿ setCabinIP – busca la Cabin indicada y actualiza su atributo Ÿ bookPassage – crea una Reservation – crea un ProcessPayment – hace un pago mediante ProcessPayment con la tarjeta de crédito – genera un ticket con la información necesaria 2005 Software de Comunicaciones (c) UC3M Natividad Martínez, Ignacio Ramos Zapata 47 24