Download EJB

Document related concepts
no text concepts found
Transcript
Enterprise Java Beans
EJBs
• Beans gestionados por un contenedor del
servidor de aplicaciones para gestionar el
acceso a recursos (bases de datos, colas
de mensajes, ficheros, etc) y proporcionar
servicios (seguridad, transacciones,
mensajería, nombres) de forma
sistemática y optimizada
• La utilización de EJB simplifica el
desarrollo de aplicaciones web y permite
construir aplicaciones escalables
Tipos de EJBs
• Las EJBs pueden ser de sesión o dirigidas
por mensajes.
– Las EJBs de sesión ejecutan métodos de
forma síncrona, pudiendo devolver valores
– Las EJBs dirigidas a mensajes añaden un
mensaje a una cola indicando tareas
pendientes de ejecutar, que se llevan a cabo
de forma asíncrona
Tipos de EJBs, II
• Las EJBs de sesión pueden ser con
estado, sin estado o únicas (singleton)
– Las EJBs con estado las utiliza un único
cliente para ejecutar sus métodos y
mantienen sus atributos entre llamadas
– Las EJBs sin estado pueden ser utilizadas
consecutivamente por clientes arbitrarios
cada vez que ejecutan un método. Pueden
mantener sus atributos entre llamadas
– Las EJBs únicas tienen una sola instancia
para toda la aplicación
Especificación de EJBs
• Las EJBs se pueden inyectar en otros
objetos gestionados por el servidor, como
los servlets, utilizando la anotación @EJB
• El objeto en el que se inyecta la EJB se
llama cliente
• Las EJBs pueden ejecutarse en el módulo
del cliente o en módulos específicos, que
pueden incluso estar en ordenadores
diferentes del del cliente
Ejemplo de anotación de
inyección en un servlet
public class MiServ extends HttpServlet {
@EJB
private MiEJB miEJBRef;
protected void doGet(…) {
…
miEJBRef.miMetodo();
… }
}
Especificación de EJBs
• Las EJBs sin estado se definen mediante
la anotación @Stateless en su clase
• Las EJBs con estado se definen mediante
la anotación @Stateful en su clase
• Las EJBs únicas se definen mediante la
anotación @Singleton en su clase
Ejemplo de EJB de sesión
sin estado
package myPack;
Import javax.ejb.Stateless;
@Stateless
public class MyEJB implements
MyEJBLocal {
public String myMethod(String myName) {
return “Hello “ + myName;
}
}
Contextos y EJBs
• Las EJBs únicas corresponden al contexto
de aplicación, pues hay garantías de que
hay una sola por cada aplicación y el
contenedor correspondiente la inyecta en
su momento dentro del ciclo de vida del
objeto gestionado que lo solicita
• Solamente se deben utilizar si se van a
utilizar para ejecutar métodos, pues en
caso contrario son innecesariamente
ineficientes
Contextos y EJBs
• Clientes dentro de diferentes sesiones de
una aplicación web pueden acceder a la
misma EJB de sesión no únicas, por lo
que estas EJBs no corresponden al
contexto de sesión
• Diferentes componentes web pueden
acceder a diferentes EJBs de sesión no
únicas de la misma clase al ejecutar la
misma instrucción, por lo que las EJBs no
corresponden al contexto de aplicación
Contextos y EJBs, II
• Lo anterior es cierto también para las
componentes dirigidas por mensajes
• Como consecuencia de lo anterior, las
EJBs de sesión nunca corresponden a
una sesión de la aplicación
Reutilización y escalabilidad de
EJBs
• Los módulos que forman las aplicaciones
Java EE, que dan lugar a ficheros jar que
se incluyen en el fichero ear de las
aplicaciones correspondientes, permiten la
reutilización de código
• Las aplicaciones web pueden incluir
módulos específicos EJB, en cuyo caso se
llaman aplicaciones Enterprise
Estructura de una
aplicación Enterprise
Reutilización y escalabilidad de
EJBs, II
• Cuando una aplicación Enterprise utiliza
un módulo EJB, el módulo Web de la
aplicación incluye una interfaz
implementada por las clases de las EJBs
que utiliza.
• La interfaz utilizada por los objetos de un
módulo que acceden a EJBs que están en
otro módulo se llama interfaz de negocios,
y lleva una anotación especial
Reutilización y escalabilidad de
EJBs, III
• Una aplicación puede acceder a un módulo
EJB que está en otra máquina java
(normalmente, en otro servidor)
• La interfaz utilizada por los objetos de un
módulo que acceden a EJBs que están en
la misma máquina Java se llama interfaz
local y se define con la anotación @local
EJB: Clientes remotos
• En el caso de EJBs que están en la
máquinas Java diferentes se utiliza la
anotación @Remote
• Las llamadas a métodos de EJBs remotas
pasan los atributos por copia en lugar de
por valor, y los valores devueltos también
se copian
Características recientes de
Java EE
• La utilización de EJBs sin definir
explícitamente una interfaz ha sido
incorporada recientemente a Java EE
(especificación Java Beans 3.1, dentro de
Java EE 6)
• La utilización de anotaciones ha sido
incorporada recientemente a Java (Java
SE 5) y a Java EE (Java EE 5)
Utilización de EJBs
sin anotaciones
• Java EE permite inyectar elementos mediante
un servicio de búsqueda basado en nombres
(JNDI, Java Naming and Directory Interface).
En lugar de
@EJB private MiEJB miEJBRef;
se utiliza
Context ctx = new InitialContext();
MiEJB miEJBRef =
(MiEJB) ctx.lookup("java:global/env/audit");
Utilización de EJBs
sin anotaciones, II
• Cuando se utiliza JNDI para acceder a
EJBs (u otros objetos inyectables) hay que
especificar la creación de los objetos en
un fichero XML de configuración, llamado
ejb-jar.xml.
Utilización de EJBs
sin anotaciones, III
<?xml version="1.0"?> <!DOCTYPE ejb-jar ….dtd">
<ejb-jar> <enterprise-beans> <session>
<display-name>Bean HolaMundo</display-name>
<ejb-name>HolaMundo</ejb-name>
<home>com.saludo.HolaMundoHome</home>
<remote>com.saludo.HolaMundoRemote</remote>
<ejb-class>com.saludo.HolaMundoBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session> </enterprise-beans> </ejb-jar>
Transacciones en Java EE
• Java EE permite definir transacciones de
SQL, según se describieron al estudiar la
API de Persistencia, o de software.
• Una transacción de software corresponde
a la ejecución de un método de una EJB.
• Si se lanza una excepción durante una
transacción de software, se ejecutan
acciones de recuperación del error.
Transacciones en JEE, II
• Por defecto cualquier método de cualquier
EJB comienza una transacción si no hay
una comenzada.
• Por defecto las transacciones terminan con
éxito cuando se termina de ejecutar el
método que las comienza sin excepciones.
• Al terminar con éxito una transacción los
EntityManagers involucrados llaman al
método flush() y ejecutan un COMMIT.
Transacciones en JEE, III
• Las transacciones se terminan deshaciendo los cambios realizados desde su
comienzo si se lanza una excepción antes
de su terminación natural.
• Cuando se termina una transacción
debido a una excepción los EntityManager
involucrados ejecutan un ROLLBACK en
el SGBD.
Transacciones en JEE, IV
• Cuando se termina cualquier transacción
todas las entidades persistentes
involucradas pasan al estado Detached (el
EntityManager correspondiente ejecuta el
método close sobre ellas).
• La excepción
IncompleteConversationalState, si se
recoge, no termina la transacción que se
está ejecutando.
Transacciones en JEE, V
• JEE permite la definición programática de
transacciones mediante la clase
inyectable UserTransaction, que tiene
métodos begin(), commit() y rollback().
Ciclo de vida de entidades
Ejercicio voluntario [EJBPERS]
• Aplicación web que amplía la del ejercicio
[DBPERS1] del capítulo de Persistencia
utilizando transacciones