Enterprise Java Bean 3 (EJB 3)

Anuncio
DEPARTAMENTO DE SISTEMAS
Enterprise Java Bean 3
(EJB 3)
Arquitectura de software
Agenda
DEPARTAMENTO DE SISTEMAS
•  Introducción
•  EJB 3
o 
o 
o 
Características
Beneficios
Arquitectura EJB 3
•  Session Bean
o 
o 
o 
Stateless Session Bean
Stateful Session Bean
Localización Session Bean
•  Desarrollo por Componentes
Introducción
DEPARTAMENTO DE SISTEMAS
Introducción
DEPARTAMENTO DE SISTEMAS
•  Recordar Contenedor EJB 3
o 
o 
o 
o 
o 
o 
Soporta concurrencia
Provee pools para administrar varias instancias de componentes,
Balanceo de carga y clustering
Provee (JNDI), para acceder a los EJB o a otros recursos
Soporta Java RMI-IIOP (Remote Method Invocation run over Internet
Inter-Orb Protocol), el cual permite el acceso remoto de un cliente a un
session bean
Soporta mensajería que proveen los message-driven beans
Tomado de: EJB 3 in action
Agenda
DEPARTAMENTO DE SISTEMAS
•  Introducción
•  EJB 3
o 
o 
o 
Características
Beneficios
Arquitectura EJB 3
•  Session Bean
o 
o 
o 
Stateless Session Bean
Stateful Session Bean
Localización Session Bean
•  Desarrollo por Componentes
EJB
DEPARTAMENTO DE SISTEMAS
“Enterprise JavaBeans is an architecture for componentbased transaction-oriented enterprise
applications.” (JSR 220: Enterprise
JavaBeansTM,Version 3.0)
“Un enterprise bean es un componente de lado del
servidor que encapsula la lógica del negocio de una
aplicación”.(Java EE 5Tutorial)
“Es una plataforma para construir aplicaciones de
negocios portables, reutilizables y escalables usando
lenguaje de programación JAVA” (EJB 3 In action,
Debu Panda)
Características
DEPARTAMENTO DE SISTEMAS
• 
Contienen lógica de negocio, que opera sobre los datos de la empresa.
• 
Las instancias de un enterprise bean son administradas en tiempo de
ejecución por un contenedor.
• 
Los servicios como transacción y seguridad, pueden ser especificados
junto con la lógica del negocio de la clase enterprise bean en la forma
de anotaciones, o en un descriptor de despliegue XML.
• 
El acceso del cliente es mediado por el contenedor en el cual el
enterprise bean es desplegado. Este acceso es transparente para el
cliente.
• 
El contenedor asegura que los beans y sus clientes pueden ser
desplegados en múltiples ambientes de ejecución sin re-compilación.
El estándar EJB 3 es desarrollado por Java Community Process(JCP).
• 
Beneficios
DEPARTAMENTO DE SISTEMAS
• 
Simplifican desarrollo, el contenedor EJB es responsable
de la administración de transacciones y autorizaciones de
seguridad.
• 
La lógica del negocio reside en los enterprise beans y no
en el lado del cliente, permitiendo que el desarrollo del lado
del cliente esté desacoplado de la lógica del negocio.
• 
Los enterprise bean son componentes portables,
reutilizables y pueden ser desplegados en servidores que
usen los estándares del API JEE.
• 
Pueden residir en diferentes servidores y pueden ser
invocados por un cliente remoto.
Beneficios
DEPARTAMENTO DE SISTEMAS
•  Se deben utilizar en los siguientes casos:
o 
Aplicaciones que deben ser escalables, esto implica
distribución de componentes a través de múltiples
máquinas.
o 
Aseguramiento de integridad de los datos de las
transacciones. Los enterprise beans soportan
transacciones y el mecanismo que administra el
acceso concurrente de objetos compartidos.
o 
Muti-usuarios locales y remotos.
Arquitectura EJB 3
DEPARTAMENTO DE SISTEMAS
•  Ofrece estándares para aplicaciones de negocios
basadas en componentes, orientadas a objetos y
distribuidas.
Tomado de: EJB 3 in action
DEPARTAMENTO DE SISTEMAS
•  Tipos de componentes EJB 3
o 
o 
o 
Session beans
Message-driven beans
Entity bean
Tomado de: EJB 3 in action
Estructura Enterprise Java Bean
DEPARTAMENTO DE SISTEMAS
• 
• 
Una aplicación EJB debe contener:
o  Componentes enterprise bean
o  Interfaces las cuales definen los métodos que
implementan las componentes enterprise bean
o  Clases helper: clases utilitarias requeridas por los
enterprise bean
Se empaqueta en un archivo EJB.jar, son portables y pueden
ser empaquetados en un archivo EAR.
Tomado del libro JavaEE Tutorial
Agenda
DEPARTAMENTO DE SISTEMAS
•  Introducción
•  EJB 3
o 
o 
o 
Características
Beneficios
Arquitectura EJB 3
•  Session Bean
o 
o 
o 
Stateless Session Bean
Stateful Session Bean
Localización Session Bean
•  Desarrollo por Componentes
Session Bean
DEPARTAMENTO DE SISTEMAS
•  Que son los componentes session bean?
“Son una tecnología EJB que permiten encapsular procesos
de negocio” (EJB 3 developer guide)
Cliente
Web, local
o remoto
Contenedor EJB 3
Interfaz
Clase Bean
Provee todas las
definiciones de los
métodos
Provee
implementaciones
de los métodos
Implementa
Local
Remota
Session Bean
DEPARTAMENTO DE SISTEMAS
•  Características:
o 
o 
o 
o 
o 
o 
Vida corta, si el servidor falla la sesión se pierde
No manejan persistencia
No es compartido entre clientes
Pueden actualizar y crear entidades, estas últimas son
persistentes
Un cliente (WEB como JSP o servlet y un cliente
aplicación standalone) interactúa con un session bean a
través de la invocación de sus métodos (esta invocación
se llama sesión)
Un componente session bean es un POJO anotado.
Tomado de: EJB 3 in action
Session Bean
DEPARTAMENTO DE SISTEMAS
•  Un session bean está compuesto por una o más
interfaces y una clase de implementación.
•  Un cliente puede acceder a un session bean
solamente a través de métodos definidos en la
interfaz del bean.
•  La interfaz de define la vista al cliente de un bean.
•  Un Session Bean puede ser invocado a través de
RMI a través de una interfaz:
o 
Remota
o 
Local
Session Bean
DEPARTAMENTO DE SISTEMAS
•  Un cliente remoto invoca una interfaz
remota de un session bean
Tomado del libro EJB 3 Developer Guide
Session Bean
DEPARTAMENTO DE SISTEMAS
•  El cliente remoto puede ejecutarse en una máquina
diferente y una JVM diferente al enterprise bean
que accede.
•  Un cliente remoto puede ser un componente web,
una aplicación cliente u otro enterprise bean.
•  Para el cliente remoto la ubicación del enterprise
bean es transparente
•  La interfaz remota define el ciclo de vida de los
métodos que son especificados en el enterprise
bean.
Session Bean
DEPARTAMENTO DE SISTEMAS
•  Definición de un session bean con interfaz
remota.
o 
Definir la interfaz anotada con @Remote
o 
Definir la clase que implementa la interfaz
Estado
Opcional
Session Bean
DEPARTAMENTO DE SISTEMAS
•  Un cliente local puede invocar un session
bean a través de una interfaz local. En este
caso el cliente reside en la misma instancia
del session bean.
Tomado del libro EJB 3 Developer Guide
Session Bean
DEPARTAMENTO DE SISTEMAS
•  El cliente local debe correr en la misma JVM
que los enterprise bean que accede
•  El cliente local puede ser un componente
web u otro enterprise bean.
•  La interfaz local define el ciclo de vida de
los métodos del bean.
•  La interfaz por defecto es local
Session Bean
DEPARTAMENTO DE SISTEMAS
•  Definición de un session bean con interfaz
local.
o 
Definir la interfaz anotada con @Local
o 
Definir la clase que implementa la interfaz
Session Bean
DEPARTAMENTO DE SISTEMAS
•  El estado de un objeto se compone de los valores
de sus variables de instancia.
•  Las instancias de las variables representan el
estado de una única sesión cliente-bean.
•  El estado de la interacción del cliente con el bean
es llamado estado conversacional.
•  Modos de estado de administración
o 
o 
Stateful
Stateless
Stateful Session Bean
DEPARTAMENTO DE SISTEMAS
• 
• 
• 
El estado se mantiene durante la sesión del cliente con el
bean.
La instancia es reservada para el cliente y cada una almacena
la información del cliente.
La sesión finaliza si el cliente remueve el bean o finaliza su
sesión.
Adicionar artículos
Realizar compra
Agregar información
adicional compra
Stateful Session Bean
DEPARTAMENTO DE SISTEMAS
• 
Definición Stateful session bean
Ciclo de vida bean con estado
DEPARTAMENTO DE SISTEMAS
El método remove es el único
que es invocado directamente
por el cliente
El contendor decide
desactivar el bean
El cliente inicia el
ciclo de vida
obteniendo una
referencia al bean de
sesión -stateful
1.
2.
El cliente invoca
algún método del
negocio durante la
desactivación
Stateless Session Bean
DEPARTAMENTO DE SISTEMAS
• 
No mantiene un estado conversacional con el cliente.
o 
• 
Cuando un cliente invoca los métodos de un stateless bean, las variables
de instancia del bean pueden contener un estado específico del cliente,
pero sólo por la duración de la invocación. Cuando el método finaliza, el
estado del cliente específico no debería mantenerse.
Las instancias pueden estar compartidas por los clientes. El contenedor
tiene un pool de instancias, cuando el cliente invoca un método se asigna
una instancia, cuando la libere es retornada al pool.
DEPARTAMENTO DE SISTEMAS
• 
• 
Ofrecen mejor escalabilidad para aplicaciones con gran cantidad de
clientes
Puede implementar un web service, pero no otros tipos de enterprise
beans.
Ciclo de vida bean sin estado
DEPARTAMENTO DE SISTEMAS
El cliente inicia el
ciclo de vida
obteniendo una
referencia al bean de
sesión -stateful
1.
Callback Session Bean
DEPARTAMENTO DE SISTEMAS
•  Los métodos Callback son métodos del bean (no
expuestos en la interfaz) que el contenedor llama para
notificar la transición del ciclo de vida de un bean
Cuando el evento ocurre el contenedor invoca al método
callback correspondiente y los métodos pueden ser
utilizados para mejorar rendimiento
Estos métodos son marcados con anotaciones como
@PostContruct and @PreDestroy y para los stateful
session bean se agregan @PrePassivate and
@PostActivate.
Session Beans
DEPARTAMENTO DE SISTEMAS
 
Los métodos Callback:
 
Deben ser públicos, sin retorno (void), y sin parámetros.
 
Utilizan las siguientes anotaciones
 
@PostConstruct: invocado sobre una instancia recientemente creada después
de la inyección (o JNDI lookup) de todas las dependencias y antes de la
invocación del primer método (javax.annotation.PostConstruct)
 
@PreDestroy: invocado luego de que un método anotado con @Remove ha
terminado y antes de que el contenedor elimine la instancia del bean
(javax.annotation.PreDestroy)
 
@PrePassivate: invocado antes de que el contenedor desactive (passivave) el
bean, el contenedor elimina temporalmente el bean y lo salva en memoria
secundaria (javax.ejb.PrePassivate)
 
@PostActivate: invocado después de que el contenedor mueve el bean de
memoria secundaria a estado activo (active) (javax.ejb.PostActivate)
Localización Enterprise Bean
DEPARTAMENTO DE SISTEMAS
Tomado: EJB 3 in action
•  Con JNDI es responsabilidad del cliente hacer la localización y obtener la
referencia al objeto.
•  Con EJB 3, usted puede utilizar la inyección de dependencia, dejando que
el contenedor se responsabilice de inyectar un objeto basado sobre la
declaración de la independencia.
JNDI
DEPARTAMENTO DE SISTEMAS
 
Acceso desde un componente a otros componentes o recursos
(e.g., bases de datos)
 
Un servlet puede invocar métodos remotos de un enterprise bean
que consulta información de una bd
 
JNDI es un servicio de nombres que permite a un componente
localizar otros componentes o recursos
 
Habilita a las aplicaciones para acceder múltiples servicios de
nombres y de directorios. Por ejemplo servicios como LDAP,
NDS,DNS, y NIS.
 
Ofrece los métodos de
 
 
 
Asociar un nombre con un objeto (binding)
Buscar un objeto (lookup)
El uso de JNDI en aplicaciones Java EE permite almacenar o
consultar cualquier objeto de java: acceso a sistemas y
aplicaciones Legado
JNDI
DEPARTAMENTO DE SISTEMAS
 
Un administrador crea un recurso en un namespace de JNDI
 
En el servidor de aplicaciones se pueden crear recursos con la consola de
administración o el comando asadmin
 
Las aplicaciones utilizan anotaciones para acceder a los recursos. Cuando
una aplicación utiliza la “inyección” del recurso, el servidor de aplicaciones
invoca el API JNDI (@Resource)
 
La aplicación puede hacer llamados directos del API JNDI
 
Un recurso y su nombre JNDI son ligados por el servicio de nombres
 
Un recurso nuevo es creado en JNDI con la asociación del nombre del
recurso en el namespace de JNDI (bind del recurso)
 
Namespace: conjunto de todos los nombres de un servicio de nombres
JNDI - Ejemplo
DEPARTAMENTO DE SISTEMAS
 
Acceso a una base de datos con el API JDBC: recurso JDBC con información
sobre
 
 
 
Servidor de BD
Nombre de la BD
Protocolo de red utilizado para la comunicación
 
Un objeto DataSource es una fábrica de conexiones de una fuente de datos
específica. El método getConnection retorna una conexión física a la fuente de
datos
 
Si el objeto DataSource es registrado con JNDI, una aplicación puede utilizar el
API JNDI (lookup) para obtener el objeto y posteriormente conectarse a la
fuente de datos
 
Las aplicaciones utilizando el API de persistencia especifican la fuente de
datos en el archivo persistence.xml
<jta-data-source>jdbc/MyOrderDB</jta-data-source>
 
Este punto es el único que referencia algo sobre el objeto JDBC
JNDI
DEPARTAMENTO DE SISTEMAS
• 
Los servicios de nombres de Java EE proveen ambientes de nombres JNDI a
las aplicaciones cliente, enterprise beans, y componente web
• 
Un naming environment permite personalizar a un componente sin acceder o
cambiar el código fuente de los componentes
• 
Un contenedor implementa el ambiente de los componentes como un contexto
de nombres
• 
Contexto es un objeto cuyo estado tiene asociados un conjunto de relaciones
entre nombres y objetos (bindings)
• 
Un contexto tiene asociado una convención de nombres
• 
Contexto inicial es el punto de partida para hacer las operaciones
• 
En JNDI todas las operaciones son realizadas en un contexto
JNDI
DEPARTAMENTO DE SISTEMAS
 
Un componente Java EE puede localizar su contexto de nombres con JNDI
 
Un componente puede crear un objeto javax.naming.InitialContext y buscar
su contexto bajo el nombre de java:comp/env.
 
Un componente Java EE puede acceder nombres provistos por el sistema
(named system-provided) y objetos definidos por los usuarios (user-defined
objects)
 
Nombres de objetos provistos por el sistema (e.g., objetos JTA) son
almacenados en el contexto java:comp/env
 
Según el tipo de objeto a definir por el usuario el subcontexto para
registrarlo varía
 
 
Enterprise beans: java:comp/env/ejb
JDBC DataSource: java:comp/env/jdbc
JNDI
DEPARTAMENTO DE SISTEMAS
 
Ejemplo con propiedades del ambiente
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, args[2]); //rmi://localhost:1099
Context ctxt = new InitialContext(env);
Compute comp = (Compute) ctxt.lookup(name);
 
Ejemplo con archivo de configuración de las propiedades
Context initial = new InitialContext();
Object objref = initial.lookup("java:comp/env/ejb/SimpleConverter”);
Archivo build.xml
<target name="run" depends="buildjar">
<java fork="true" classname="client.ComputePi">
<classpath path="${build}" />
<classpath path="${compute}" />
…
<sysproperty key="java.naming.factory.initial"
value="com.sun.jndi.rmi.registry.RegistryContextFactory" />
<sysproperty key="java.naming.provider.url" value="rmi://${hostname}:${port}" />
</java>
</target>
JNDI
DEPARTAMENTO DE SISTEMAS
 
Las propiedades del ambiente JNDI se deben configurar de
acuerdo con las características del proveedor del servicio que
se va a utilizar
 
Las propiedades se clasifican en:
  Estándares (java.naming……): java.naming.factory.initial
  Específicas del servicio (java.naming.service……):
java.naming.corba.orb
  Característica específica (java.naming.feature….):
java.naming.security.sasl
  Especificas del proveedor: com.sun.jndi.ldap.trace.ber
JNDI
DEPARTAMENTO DE SISTEMAS
 
java.naming.factory.initial
 
 
 
nombre de la clase de la fábrica del contexto inicial
La clase debe implementar la interface
InitialContextFactory
Ejemplo valores:
 
 
com.sun.jndi.ldap.LdapCtxFactory
com.sun.jndi.rmi.registry.RegistryContextFactory
JNDI
DEPARTAMENTO DE SISTEMAS
 
java.naming.provider.url
 
 
El URL para configurar el proveedor del servicio
definido en la propiedad "java.naming.factory.initial"
Ejemplo valores:
 
 
ldap://localhost:389/o=JNDITutorial
rmi://localhost:1099
Localización Enterprise Bean
DEPARTAMENTO DE SISTEMAS
•  La localización se puede realizar definiendo
explícitamente la búsqueda con JNDI.
Localización Enterprise Bean
DEPARTAMENTO DE SISTEMAS
@EJB
private HelloUser helloUser;
void hello() {
helloUser.saludo(“Pepito");
}
Inyección
@Stateless
public class HelloUserBean implement HelloUser {
public void saludo(String nombre) {
System.out.println("Hola " + nombre + " bienvenido a EJB 3!");
}
}
• 
• 
• 
Un cliente de aplicación JEE para referir la instancia de un
enterprise bean lo puede realizar a través de la anotación
estática @EJB.
El contenedor EJB es el que inyecta en cada objeto los objetos
según las anotaciones que incluya.
EJB3 permite reemplazar los descriptores XML por
anotaciones en el código
Localización Enterprise Bean
DEPARTAMENTO DE SISTEMAS
Inyección
JNDI
DEPARTAMENTO DE SISTEMAS
•  @EJB
o 
o 
Declaración del atributo
Método Setter
•  Atributos Opcionales
o 
beanName
 
 
o 
beanInterface
 
o 
Nombre de la clase
Ejb-name si el EJB tiene un descriptor XML
Interface local o remota
mappedName
 
Nombre JNDI
JNDI
DEPARTAMENTO DE SISTEMAS
Partes de un @Resource
 
 
 
 
 
 
name: nombre del recurso en JNDI
type: el tipo (Java) del recurso
authenticationType: tipo de autenticación para utilizar el recurso
shareable: indica si el recurso puede ser compartido
mappedName: nombre específico de la implementación que indica que el recurso
puede ser mapeado a
description: descripción del recurso
Ejemplos de estilos de inyección: atributos, métodos y clases
  Atributos:
public class SomeClass { @Resource(name="customerDB")
private javax.sql.DataSource myDB; ... }
  Métodos
public class SomeClass { private javax.sql.DataSource myDB; ...
@Resource(name="customerDB")
private void setMyDB(javax.sql.DataSource ds) { myDB = ds; }
  Clases
@Resource(name="myMessageQueue", type="javax.jms.ConnectionFactory")
public class SomeMessageBean { …}
Session Beans - Anotaciones
DEPARTAMENTO DE SISTEMAS
 
Interface
 
 
 
@Remote: indica que se trata de una interfaz de negocio remota
@Local: acceso al bean de forma local únicamente
Clase
 
@stateless similar a @stateful /* bean de sesión con estado */
  Indica que el bean de sesión es sin estado
  Dependiendo del contenedor
 
 
 
Se crea el stub del bean
Registra en JNDI el bean con el nombre lógico "java:comp/env/ejb/
nombreBean“ o con un nombre dado en la anotación
@EJB
  Aplica para interfaces remotas únicamente
  Genera el lookup del bean de sesión en JNDI con el nombre "java:comp/
env/ejb/nombreBean“
  En serviciosCliente.java
@EJB(name = "co.com.uniandes.ejemplo.servicios.IServiciosProducto")
private IServiciosProducto serviciosProducto;
 
@Resource
  Inyección de recursos
  @Resource(name="jdbc/sqetestDB",type=javax.sql.DataSource.class)
public javax.sql.DataSource myTestDB;
Bibliografía
DEPARTAMENTO DE SISTEMAS
•  EJB 3 in action. Panda Debu, Rahman Reza, Lane
Derek. Manning. 2007.
•  EJB 3 Developer Guide. Sikora, Michael. 2008.
•  JSR 220: Enterprise JavaBeansTM,Version 3.0.
Sun Microsystems.
•  The Java™ EE 5 Tutorial Third Edition. For Sun
Java System Application Server Platform Edition 9.
Eric Jendrock. 2006.
Descargar