Session Beans y Entity Beans Avanzado Caso de estudio: Entity Bean

Anuncio
Session Beans y
Entity Beans
Avanzado
Ignacio Ramos Zapata
Departamento de Ingeniería Telemática
Universidad Carlos III de Madrid
[email protected]
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
Descargar