enterprise java beans. ejbs beans gestionados por un contenedor del servidor de aplicaciones para...
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 {@EJBprivate 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ónsin estado
package myPack;Import javax.ejb.Stateless;@Statelesspublic 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 unaaplicació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 EJBssin 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 EJBssin 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 EJBssin 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 deshacien-do 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