270 likes | 416 Views
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
E N D
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ónsin 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
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().
Ejercicio voluntario [EJBPERS] • Aplicación web que amplía la del ejercicio [DBPERS1] del capítulo de Persistencia utilizando transacciones