Download Enterprise JavaBeans

Document related concepts
no text concepts found
Transcript
Enterprise JavaBeans
Arquitectura de Componentes Java en el Servidor
Whitepaper – Mayo 1999
© Ideal Business
CONTENIDOS
¿Qué es EJB, y para qué se necesita?
3
¿Quién soporta EJB?
4
¿Qué es exactamente EJB?
5
¿Cómo se desarrollan, despliegan y gestionan las EJB?
12
¿Cómo se integra EJB con los sistemas externos?
14
¿Cuál es el futuro de EJB?
14
Conclusión
15
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
2
¿Qué es EJB, y para qué se necesita?
Desde el nacimiento de la WWW, han venido apareciendo nuevas tecnologías en todas las
direcciones. Ahora resulta casi imposible mantenerse al día de estas tecnologías, a la
velocidad a la que se introducen y evolucionan.
Por lo tanto, ¿por qué añadir EJB a esta lista de tecnologías? Quizás deba volver a incidirse
sobre por qué middleware en general o servidores de aplicación en particular, y después sea
interesante analizar las ventajas (e inconvenientes) de situar Java como base de la ‘capa
intermedia’.
El modelo de componentes de servidor Enterprise JavaBeans (EJB) define una arquitectura
estándar para servidores de aplicación Java. Los objetivos esenciales de EJB son:
•
•
•
Portabilidad a través de diferentes servidores de aplicación.
Reusabilidad de componentes.
Incremento de la productividad de los desarrolladores.
EJB satisface estos objetivos al automatizar un buen número de servicios de middleware,
como la gestión del ciclo de vida de los objetos, gestión de estado, transacciones, seguridad,
y persistencia de objetos. Én vez de escribir llamadas a un API propietario directamente en
los componentes de aplicación, EJB permite a los desarrolladores especificar requisitos del
middleware mediante opciones de tiempo de ejecución. Un servidor de aplicaciones basado
en EJB implementa automáticamente los servicios para su uso por las aplicaciones, de
manera muy transparente al desarrollador de componentes.
El modelo EJB es parte de la plataforma Enterprise Java de Sun Microsystems, un entorno
Java robusto que soporta sistemas de aplicación de misión crítica altamente distribuidos.
‘Pegamento’ entre clientes y servidores
En el frontal existen múltiples clientes y servidores (puestos/navegadores, PDAs, NCs,
NetPCs…). Como backend hay aún una mayor heterogeneidad en cuanto a plataformas y
fuentes de datos. El middleware Java de la especificación EJB conecta ambos mundos. En
otras palabras, la lógica de negocio puede implementarse como componentes reusables en
la capa intermedia, proporcionando acceso a cualqiuer tipo de cliente al backend.
Escalabilidad
La solución inicial (HTML + CGI) no es escalable, y las APIs propietarias como NSAPI o
ISAPI no mejoran sustancialmente la escalabilidad. La mayor parte de los servidores de
aplicación, por contra, se basan en tecnologías estándar y sí se diseñaron con la
escalabilidad en mente. Estos productos proporcionan características como ‘pooling’ de
recursos, tolerancia a fallos, seguridad, gestión de sistemas, etc.
‘Todo en uno’
Muchos servidores de aplicación son ‘todo en uno’, es decir, soportan los protocolos
necesarios para proporcionar un entorno completo de desarrollo de aplicaciones. Algunos
servidores de aplicación soportan HTTP, RMI, EJB, Servlets, JNDI, JDBC, y CORBA/IIOP.
Esto evita la necesidad de disponer de múltiples servidores (p.ej. un servidor web, un ORB y
unos componentes de servidor RMI dispersos).
Productividad
EJB incrementa la productividad de los desarrolladores dado que éstos no han de
preocuparse sobre programación a bajo nivel (tal como seguridad, pooling de conexiones,
gestión transaccional, control de estado, persistencia, o multithreading). Los desarrolladores
símplemente se concentran en describir la lógica de negocio, desarrollando la enterprise
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
3
bean como si sólo fuera a existir un único cliente. Teniendo en cuenta que en una aplicación
típica C/S más del 80% del código se dedica a temas ajenos a la lógica de negocio, resultan
evidentes las mejoras de productividad esperables del middleware, y en particular de EJB.
Arquitectura de componentes abiertos de servidor
En las últimas dos décadas, la mayor parte de los productos basados en servidor han venido
utilizando APIs propietarias, de manera que no ha sido posible disponer de componentes
‘plug&play’ más allá de los componentes provistos por cada fabricante particular. EJB cambia
este estado de cosas, proporcionando portabilidad a través de plataformas y vendedores.
Dado que EJB establece un estándar en tecnología de componentes de servidor, todos los
vendedores deben incorporar el conjunto de funcionalidades básicas en sus productos de
servidor, dejando eventualmente a terceras partes la producción de componentes reusables
como enterprise beans; así, puede usarse una bean para validación de tarjetas de crédito,
gestión de pedidos, cifrado y firma digital, etc.
Programación Orientada a Objetos en el Servidor
Gracias a los orígenes de Java como lenguaje orientado a objetos, y al modelo de
componentes EJB, las organizaciones pueden crear y utilizar componentes reusables que
aporten las características de la programación orientada a objetos (encapsulación,
polimorfismo, herencia) y sus potenciales beneficios (reusabilidad, posibilidad de establecer
interfaces bien definidos, independencia de plataforma e incluso de lenguaje de
programación, etc.), sin la curva de aprendizaje que requiere la tecnología de orientación a
objetos. Uno de los elementos esenciales de la tecnología de objetos es el empaquetamiento
de los datos y la lógica para su procesamiento en objetos. Además de estos elementos
esenciales, EJB permite utilizar contenedores (containers) y Entity Beans que pueden
traducir fuentes de datos en objetos. Esto elimina la duplicidad de código para acceder a
datos residentes en una base de datos y para acceder a los datos encapsulados por un
objeto.
Java en la capa intermedia
EJB ofrece todas las características de Java (portabilidad, seguridad, gestión automática de
memoria, servicios de directorio, serialización) a la capa intermedia.
Soporte de otros lenguajes y CORBA
EJB define explícitamente el soporte a otros lenguajes y CORBA porque el vendedor del
middleware (o servidor de aplicación) maneja los aspectos relacionados con el protocolo de
comunicaciones, y NO el programador de aplicaciones o de beans. En EJB el protocolo de
comunicación entre componentes es RMI (Remote Method Invocation); sin embargo, desde
la especificación EJB 1.0 se proporcionan interfaces con CORBA, y existen vendedores que
ofrecen soporte DCOM.
¿Quién soporta EJB?
Recordemos de nuevo que EJB no es un producto; es una especificación. Uno de los
objetivos esenciales de EJB es la portabilidad a través de plataformas y vendedores. Multitud
de vendedores soportan EJB 1.0, y EJB 1.1/2.0 están a punto de ver la luz. La siguienta tabla
muestra una lista parcial de vendedores que han asumido el estándar EJB.
Vendedor
BEA Systems
Bluestone
Gemstone
IBM
Information Builders
Inprise
Lotus
Producto
WebLogic Application Server
Sapphire/Web
Gemstone/J
Websphere
Parlay Application Server
Inprise Application Server
Notes/Domino
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
4
Netscape
Novera
Oracle
Persistence
Progress
Secant
Silverstream
Sun
Sybase
Valto Systems
Wall Data
Netscape Application Server (Kiva)
jBusiness
Oracle Application Server
Pow erTier for EJB
Aptivity, Webspeed
Extreme Enterprise Server for EJB
Silverstream Application Server
NetDynamics
Enterprise Application Server
Ejipt
Cyberprise Server
¿Qué es exactamente EJB?
EJB es parte de la iniciativa JPE (Java Platform for the Enterprise). Las JavaBeans
introdujeron una forma estándar de desarrollar y usar componentes Java en el lado del
cliente. De manera similar, EJB sirve como arquitectura de componentes Java en el lado del
servidor.
EJB permite que los desarrolladores de software construyan objetos de negocio de servidor
(o capa intermedia) reusables (‘enterprise beans’). Sin embargo, EJB lleva más lejos aún el
concepto de objetos reusables, proporcionando programación basada en atributos para
definir dinámicamente comportamiento transaccional, seguridad y modelo de ciclo de vida en
aplicaciones EJB. Por ejemplo, usando técnicas basadas en atributos, la misma entreprise
bean (en su forma binaria – esto es, fichero .class o JAR) puede ofrecer diferente
comportamiento transaccional en diferentes aplicaciones. Además, el método de persistencia
de una enterprise bean puede alterarse durante el despliegue , sin tener que recodificarla.
Una Entity Bean puede usar una base de datos relacional o CICS; el desarrollador de la bean
no necesita conocer estos ‘detalles’.
Para proporcionar una imagen más concreta de EJB, se examinarán sus objetivos,
características, roles y responsabilidades, y las restricciones de programación que impone.
Objetivos
La especificación EJB definen ciertos objetivos para los vendedores de middleware Java que
deseen implementar este estándar. Por citar algunos:
§
§
§
§
§
§
Arquitectura de componentes Java distribuidos estándar.
Portabilidad a través de plataformas y proveedores.
Incremento de productividad mediante simplicidad (el desarrollador no ha de preocuparse
sobre gestión de estados, multithreading, protocolos y conexiones de red, pooling de
recursos, etc.).
Compatibilidad con otros lenguajes de programación y CORBA.
Abarca desarrollo, despliegue y gestión.
Compatibilidad con inversiones existentes en infraestructuras de sistemas y plataformas.
Arquitectura
La arquitectura EJB pretende alcanzar los objetivos expuestos usando una capa de
infraestructura abstracta denominada ‘contenedor’ (container). Un contenedor proporciona un
entorno de ejecución consistente, y aisla al componente de las diferencias entre los
servidores de aplicación de diferentes proveedores. Como se aprecia en la figura, un
componente EJB (o simplemente, un enterprise bean) se despliega en un contenedor EJB,
dentro de un servidor EJB.
Una componente de aplicación (enterprise bean) se ejecuta dentro de un contenedor EJB,
que se ejecuta a su vez bajo un servidor de aplicación EJB. Cuando se despliega una
componente, se establecen requisitos de runtime usando objetos descriptores de despliegue.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
5
Basado en estos requisitos, el contenedor genera un objeto de contexto (usado por el
contenedor para gestionar el componente), un interfaz EJB home (usado por el cliente para
crear, buscar y destruir el objeto) y un interfaz de objeto EJB (usado por el cliente para
acceder a los métodos de negocio del componente, actuando como objeto proxy). Los
métodos de negocio pueden también personalizarse en tiempo de despliegue, estableciendo
valores en el objeto de entorno. Durante la ejecución, el contenedor EJB intercepta todas las
llamadas e invoca automáticamente los servicios de middleware.
Arquitectura EJB
Pooling de recursos
Tolerancia a fallos
Conectividad
Multithreading
Cache de datos
Control concurrencia
métodos
Servidor de Aplicaciones EJB
Proporciona gestión de recursos y servicios middleware
(gestión de recursos, transacciones, seguridad, persistencia)
Contenedor EJB
Invoca automáticamente servicios para la EB
basándose en requisitos definidos en los
descriptores de despliegue (ciclo de vida, gestión
de estados, transacciones, seguridad, persistencia)
Objeto EJB
métodos
(vista de cliente)
Enterprise
Bean
Cliente
create
lookup
destroy
Contexto
EJB home
(ID del bean)
create
lookup
destroy
Descriptores
de despliegue
Entorno
El servidor de EJB proporciona gestión de recursos y servicios middleware, como
multithreading, gestión de sesiones, pooling de conexiones a fuentes de datos, cache de
datos, gestión de estado, gestión de transacciones, control de concurrencia, seguridad, y
persistencia. La especificación EJB no define cómo se implementan estos servicios, de modo
que las mayores diferencias en productos de servidor de aplicación residen en la calidad de
estos servicios. El contenedor EJB oculta las diferencias entre diferentes servidores de
aplicación: cualquier servidor de aplicación Java puede convertirse en un servidor EJB si se
proporciona una implementación de contenedor EJB compatible con la especificación.
El contenedor EJB gestiona el enterprise bean, invocando los servicios middleware
necesarios. En tiempo de despliegue, se describen los parámetros de funcionamiento
relativos a estos servicios middleware, en unos objetos de descriptor de requisitos.
Basándose en estos objetos, el contenedor genera en tiempo de ejecución un objeto de
contexto que se usará para mantener parámetros de runtime, requisitos de servicio, e
información de estado para cada instancia de una componente. El contenedor genera
asimismo dos interfaces ‘envoltorio’ para el acceso desde el cliente. El interfaz EJB home
permite crear, localizar y destruir instancias de la componente, mientras que el interfaz de
objeto remoto EJB identifica una única instancia de componente, usándose por los clientes
para invocar los métodos de negocio del componente. En tiempo de ejecución el contenedor
intercepta todas las invocaciones realizadas por el cliente contra los dos interfaces (home
EJB y objeto remoto EJB), invocando automáticamente los servicios de middleware.
Características
Para satisfacer los objetivos arriba expuestos, EJB incorpora multitud de características que
hacen a esta arquitectura de componentes distribuidos tan atractiva. La tabla siguientes
proporciona una imagen de estas características (que se desarrollan en lo que sigue):
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
6
Característica
Modelo de Componentes
Persistencia de Objetos
Gestión Transaccional
Gestión de Excepciones
Seguridad
Servicio de Nombres y Directorio
Protocolo de red
Soporte para CORBA
Programación basada en atributos
Despliegue
§
§
§
§
§
§
§
§
§
§
§
§
§
§
§
§
§
Soportado a través de
Session Beans
Entity Beans
Entity Beans (EJB Containers)
JTS/JTA
javax.jts.UserTransaction
Extensiones propietarias
En cliente y en servidor
java.security
Métodos ligados a la seguridad en javax.ejb.EJBContext
Propiedades de descriptor de despliegue (ACLs de Java,
propiedades RunAs)
JNDI (Java Naming and Directory Interface)
RMI/JRMP
IIOP (a través del mapping CORBA)
(otros)
Mapping CORBA (ejb.idl)
Fichero descriptor de despliegue
Fichero JAR de la EJB
Tres tipos de enterprise beans
EJB define tres tipos de enterprise beans: beans de sesión sin estado (stateless session
beans), beans de sesión con estado (stateful session beans) y beans de entidad (entity
beans).
Beans de sesión sin estado – simples y ligeras (es decir, fáciles de desarrollar, con bajos
requisitos en tiempo de ejecución. Cualquier información de estado, en caso de que fuera
necesaria, se mantiene por el cliente, llevando a una escalabilidad teórica infinita. Dado que
este tipo de bean no mantiene estado, los beans de sesión no están ligados a un cliente
particular, de manera que cualquier instancia de un bean de esta clase puede usarse para
dar servicio a un cliente.
Beans de sesión con estado – Proporcionan una gestión de estado transparente en el lado
del servidor. Dado que el estado se mantiene en este tipo de EJB, el servidor de aplicación
maneja pares cliente-bean. En otras palabras, cada instancia de una cierta EJB se crea bajo
petición de un cliente concreto, y en principio es un recurso privado para ese cliente (aunque
puede compartirse entre clientes, usando el handle del bean). En esencia, una bean con
estado actúa como una extensión del cliente, con la salvedad de que cierta carga del cliente
se distribuye en el servidor de aplicaciones. Los datos de estado no sobreviven a una caida
del servidor, salvo que la implementación particular soporte persistencia frente a caidas del
servidor. Los beans con estado pueden acceder a recursos persistentes (como bases de
datos o ficheros) pero, a diferencia de los beans de entidad, no representan datos. Por
ejemplo, una bean con estado puede acceder a una base de datos via JDBC, o a través de
una bean de entidad.
Beans de entidad – Objetos persistentes, que representan una vista de objeto de una
determinada fuente de datos. Para entender mejor este concepto, puede imaginarse una
bean de entidad como una fila en una base de datos. Una bean de entidad puede crearse,
instanciarse como fila, y eliminarse – usando los métodos create(), findxxx y remove(),
de la misma manera que una fila en una base de datos puede INSERTarse, SELECTionarse
o borrarse (DELETE). Una bean de entidad vive en un contenedor EJB, proporcionado por el
proveedor del servidor de aplicaciones para varias fuentes de datos (Oracle, CICS, SAP/R3,
etc.); ¡el desarrollador de la bean de entidad no tiene que conocer los detalles de la fuente de
datos! Múltiples clientes pueden acceder a la misma bean de entidad concurrentemente – tal
concurrencia la gestiona el contenedor EJB.
Cada instancia de una bean de identidad se identifica a través de una única clave primaria.
Las beans de entidad pueden crearse bien creando un objeto (mediante un método
Create() de una factoría de objetos) o insertando directamente datos en la fuente de datos.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
7
Dado que el estado de la bean se mantiene en la fuente de datos, este tipo de beans pueden
recuperarse ante una caida del sistema.
La decisión de qué tipo de bean usar es un aspecto más de diseño que de desarrollo.
Algunas reglas:
1.
2.
Usar bean de entidad en vez de beans de sesión si no se desea embeber funciones de
base de datos (p.ej. JDBC) en las EJB, y además desean aprovecharse las
características de control automático de transacción, pooling de recursos, y persistencia
manejada por el contenedor EJB. Piénsese en una bean de sesión como una extensión
del cliente en el servidor, sin persistencia ‘per se’ (cuando el cliente o el servidor
finalizan, la bean deja de existir), mientras que una bean de entidad puede entenderse
como representación de datos persistentes.
Si se decide por una bean de sesión, escoger ‘con estado’ o ‘sin estado’ representa el
decidir cuánta carga se sitúa en el servidor y cuánta en el cliente. En otras palabras, si
se mantiene el estado en el servidor (bean con estado), el servidor tendrá mayor
sobrecarga, mientras que una bean sin estado supone que si hay que mantener
información de estado, tal información se sitúa en el cliente.
Pese a las diferencias, las beans de sesión y entidad comparten las siguientes
características:
•
•
•
•
•
•
Puede obtenerse un manejador o handle (java.ejb.Handle) usando el método
getHandle().
Editando sus propiedades de entorno, una bean puede personalizarse durante el
despliegue.
Las instancias de las EJB pueden crearse y gestionarse en tiempo de ejecución por el
servidor de aplicaciones.
Ciertos atributos de la EJB, como el modo transaccional y la seguridad, pueden
manipularse en tiempo de despliegue usando las herramientas de despliegue en servidor
de EJB.
Ambos tipos soportan semántica transaccional.
Ambos tipos pueden crearse y destruirse usando create() y remove().
La siguiente figura muestra las interrelaciones entre los distintos elementos de un servidor de
aplicaciones. Nótese lo siguiente: Un servidor puede tener múltiples contenedores (cada uno
de ellos correspondería típicamente a una fuente de datos). Un contenedor aloja múltiples
beans (de sesión y/o entidad). Una bean de entidad representa una fila de una fuente de
datos, pudiendo estar compartidas entre múltiples clientes, y permitiendo accesos
concurrentes. Los beans de sesión con estado están asociados a un único cliente, mientras
que los beans sin estado se instancian de un ‘pool’ en caso necesario.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
8
Relaciones entre EJBs
Capa de
Cliente
Cliente 1
Capa de
Negocio
Pool de
beans sin
estado
Capa de
Datos
Contenedor EJB
Oracle
Bean de entidad
Fila 1
Bean de entidad
Cliente 1
Cliente 3
Instancia 1 de
bean de sesión
Bean de entidad
con estado
Instancia 2 de
bean de sesión
con estado
contenedor EJB
basado en ficheros
contenedor EJB
MQSeries
Fila 2
Fila 3
contenedor EJB
CICS
Persistencia
Una de las características claves del modelo EJB es la persistencia, que puede implantarse a
nivel de bean de entidad o a nivel de contenedor.
En el primer caso, el desarrollador sobrecarga los métodos ejbLoad() y ejbStore(), para
almacenar la información residente en los atributos del bean de entidad en una fuente de
datos mediante, por ejemplo, JDBC. Este mecanismo es el más flexible (pues el
desarrollador define cómo se almacenan los datos) pero liga a nivel de código la bean con el
almacén de datos. Algunos proveedores están empezando a proporcionar herramientas de
traducción objeto-relacional a través de las cuales pueden definirse joins complejos, y
proporcionar accesos por programa a estas queries. Otra alternativa son las vistas de base
de datos, si bien muchas bases de datos no permiten la actualización de múltiples tablas
desde una vista.
Si la persistencia la proporciona el contenedor EJB, en general el proveedor incorpora una
herramienta de traducción objeto-relacional para enlazar atributos del bean con campos del
almacén de datos. Por citar un ejemplo, Persistence Software proporciona una herramienta,
PowerTier ObjectBuilder, para automatizar la traducción entre objetos bean (considerando
herencia, agregación y asociación) a tablas relacionales.
Aunque el proceso de traducción puede ser tedioso, las ventajas de esta aproximación
superan con creces los inconvenientes: Se genera automáticamente el código para mover los
datos entre los campos del bean y el almacén de datos. Además, un bean de entidad puede
hacerse persistente respecto a otra fuente de datos sin más que situarla en otro contenedor y
establecer el nuevo mapping. Además, el contenedor puede optimizar el acceso a datos
mediante mecanismos de cache a nivel de contenedor, haciendo innecesario acceder al
almacén de datos en cada petición. Los tipos de contenedores más habituales son los
relacionales (típicamente basados en drivers nativos o en JDBC), si bien existen
implantaciones para fuentes de datos no relacionales (3270, CICS, MQSeries, TXSeries,
Tuxedo, ficheros planos...).
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
9
Herramienta de mapping Objeto-Relacional de Persistence PowerTier
Gestión transaccional
EJB soporta transacciones planas, basadas en la especificación CORBA OTS (Object
Transaction Service) 1.1. Con esta facilidad, el desarrollador queda liberado de definir los
detalles de la transacción, tema especialmente complejo si se habla de transacciones
distribuidas, two-phase commit y otras lindezas.
Las transacciones en un entorno EJB pueden manejarse de dos maneras. En la primera, el
desarrollador puede contralar por programa el alcance de la transacción usando el interfaz
javax.jts.UserTransaction, en el cliente o en el bean. En la segunda posibilidad, el
servidor de aplicaciones gestiona los límites de la transacción usando atributos de
transacción durante el despliegue. Ni que decir tiene que esta segunda posibilidad es más
flexible, si bien la primera puede ser necesaria para aquellas transacciones complejas que no
puedan modelarse mediante las facilidades del servidor de aplicaciones.
Los valores del atributo de transacción definidos en EJB y qué tiene lugar cuando se invoca
una operación en una entreprise bean se muestran a continuación:
Valor del atributo de transacción
TX_NOT_SUPPORTED
TX_BEAN_MANAGED
TX_REQUIRED
TX_SUPPORTS
TX_REQUIRES_NEW
TX_MANDATORY
Cómo se invoca la enterprise bean
Sin ámbito transaccional
La bean puede usar el interfaz javax.jts.UserTransaction para
establecer los parámetros de la transacción. Este interfaz puede
obtenerse invocando el método
javax.ejb.SessionContext.getUserTransaction().
Si el cliente está asociado con un contexto de transacción, la
enterprise bean se invoca en el mismo contexto; en otro caso, el
contenedor inicia una nueva transacción antes de la invocación del
método, y la aplica (commit) tras el retorno del método.
Invocada en el ámbito transaccional del cliente, si se tiene uno. En
caso contrario, sin ámbito transaccional.
Como TX_REQUIRED, pero siempre se invoca una nueva
transacción, ignorando cualquier contexto.
Invocada en el ámbito de la transacción del cliente. Si el cliente no
tiene, se lanza excepción
javax.transaction.TransactionRequiredException.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
10
EJB permite asimismo definir el nivel de aislamiento de la transacción, concepto a través del
cual se proporciona visibilidad de los cambios efectuados por una transacción a otras. Los
valores válidos son:
TRANSACTION_READ_UNCOMMITED, TRANSACTION_READ_COMMITED,
TRANSACTION_REPEATABLE_READ y TRANSACTION_SERIALIZABLE.
JDBC 2.0 introduce una extensión estándar (paquete javax.sql) que incluye soporte a
transacciones distribuidas, además de mecanismos de pool de conexiones y conjuntos de
filas (rowsets). Java proporciona soporte de transacciones distribuidas mediante JTA (Java
Transaction API) y JTS (Java Transaction Service). Es posible, por ejemplo, asociar un driver
JDBC a un gestor de transacciones externo usando el interfaz estándar XA de The Open
Group (javax.sql.XADataSource, javax.sql.XAConnection).
Seguridad
EJB usa la clase java.security.Identity para describir a los usuarios y roles. Es
responsabilidad del servidor de aplicaciones (o del contenedor EJB) efectuar la traducción
con una identidad real (por ejemplo, el DN de un certificado X.509 usado para autenticar a un
usuario). Esta información la obtiene la instancia de la bean a través de los métodos
getCallerIdentity
e
isCallerInRole(Identity
ident) de la clase
javax.ejb.EJBContext.
EJB usa para la autorización el modelo de listas de control de accesos (ACLs) en el
descriptor de despliegue. EJB define atributos RunAsMode y RunAsIdentity, para definir la
identidad a asociar con la ejecución de métodos del enterprise bean y para llamadas a
gestores de recursos (como JDBC). Los valores válidos de RunAsMode son
SPECIFIED_IDENTITY, CLIENT_IDENTITY y SYSTEM_IDENTITY (cuenta privilegiada).
Servicio de directorio y protocolos de red
EJB usa JNDI (Java Naming and Directory Interface) como servicio de nombres. Mediante
JNDI, un cliente busca un interfaz home EJB. Es responsabilidad del contenedor mantener la
información necesaria para que JNDI pueda proporcionar la referencia al interfaz home del
bean.
La especificación EJB define RMI (Remote Method Invocation) y el protocolo asociado
(JRMP) como protocolo por defecto para invocación remota de métodos de objetos Java.
EJB proporciona también una traducción CORBA/IIOP, de manera que clientes CORBA
puedan invocar enterprise beans. Esencialmente esto se logra mediante ficheros IDL
proporcionados para las clases e interfaces estándar de EJB, combinados con ficheros IDL
ligados a enterprise beans.
No obstante, EJB puede usar cualquier protocolo (HTTP, DCOM, etc.). En cualquier caso, el
desarrollador no tiene que preocuparse por el protocolo, pues el proveedor se ocupa de los
detalles de conectividad.
Algunos ejemplos de conexión:
•
•
•
Un navegador puede descargar una página HTML que contenga un servlet simple. Este
servlet puede invocar métodos de los enterprise beans, via RMI, o actuar como un cliente
Java frente a enterprise beans.
Un applet, o una aplicación Java, pueden invocar directamente al enterprise bean.
Una aplicación CORBA o ActiveX/DCOM, usando una pasarela, pueden acceder al
enterprise bean.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
11
¿Cómo se desarrollan, despliegan y gestionan las EJB?
El ciclo de vida de una enterprise bean comprende los siguientes pasos:
•
•
•
•
Desarrollar el enterprise bean (clases de la bean, e interfaces home y remoto).
Desplegar el enterprise bean (descriptor de despliegue, fichero manifest, propiedades de
entorno, y JAR).
Ensamblar la aplicación (desplegar y probar la conectividad en todas las capas).
Gestionar las beans y los elementos relacionados.
Desarrollo
Para cada enterprise bean, deben desarrollarse tres piezas:
•
La clase propia de la bean (que encierra la lógica de negocio). La bean sobrecarga
métodos como ejbCreate(), o setSessionContext() –en el caso de una bean de
sesión. Básicamente, se implementa alguno de los interfaces definidos en el paquete
javax.ejb, como EntityBean o SessionBean. Ejemplo:
import javax.ejb.*;
import java.rmi.*;
public class BuscaPersonasBean implements SessionBean {
SessionContext sessionContext;
public void ejbCreate() throws CreateException, RemoteException {}
public void setSessionContext(SessionContext sc)
throws RemoteException {
sessionContext = sc;
}
// Métodos de negocio
public String obtenerNombre(int DNI) {
String Nombre = null;
// Obtiene el nombre de una fuente de datos
return Nombre;
}
}
•
Su interfaz home (lo que un cliente obtiene via JNDI, y que el cliente u otras enterprise
beans puede usar para crear instancias del objeto remoto, usado como manejador ‘proxy’
frente a la verdadera bean). Ejemplo:
import javax.ejb.*;
import java.rmi.*;
public interface BuscaPersonasHome extends EJBHome {
public BuscaPersonas create()
throws CreateException, RemoteException;
}
•
Su interfaz ‘objeto remoto’
import javax.ejb.*;
import java.rmi.*;
public interface BuscaPersonas extends EJBObject {
public String obtenerNombre(int DNI) throws RemoteException;
}
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
12
(Nótese la convención de nombres, añadiendo ‘Bean’ al nombre de la clase en la
implementación de la bean, y ‘Home’ al nombre de la clase en la definición del interfaz
home).
Una vez que el enterprise bean se despliega, ¿qué aspecto tendría un cliente Java? En
primer lugar, el cliente usaría JNDI para localizar el interfaz home del bean remoto. Usando
el método create() apropiado del interfaz home, obtendría una instancia del objeto remoto, y
usando sus métodos, invocar los métodos del bean. Por ejemplo:
// Inicializacion
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"persistence.jndi.TengahInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3://localhost:7001");
env.put(Context.SECURITY_PRINCIPAL, "system");
env.put(Context.SECURITY_CREDENTIALS, "xyz");
InitialContext ic = new InitialContext(env);
// Obtiene interfaces home y de objeto remoto
BuscaPersonasHome bph =
(BuscaPersonasHome)ic.lookup("statefulSession.BuscaPersonas");
BuscaPersonas bp = bph.create();
// Invoca el método remoto
System.out.println("Nombre = " + bp.obtenerNombre(123456789));
La siguiente tabla refleja los métodos, clases e interfaces relacionados con los enterprise
beans.
Tipo de Bean
•
Sesión
•
•
•
•
Entidad
•
•
•
Métodos, clases e interfaces
Métodos : ejbRemove, ejbActivate, ejbPassivate,
setSessionContext(SessionContext)
Clases: SessionContext, Handle, EJBObject, EJBHome
Interfaces: SessionBean
Métodos SessionContext: getEJBObject, getCallerIdentity(),
getEJBHome(), getEnvironment(), getRollbackOnly(),
getUserTransaction(), isCallerInRole(Identity), setRollbackOnly()
Métodos : ejbActivate(), ejbLoad(), ejbPassivate(), ejbRemove(),
ejbStore(), setEntityContext(EntityContext(),
unsetEntityContext().
Clases: Handle, EJBObject, EJBHome
Interfaces: EntityBean
Métodos EntityContext: getPrimaryKey(), getEJBObject,
getCallerIdentity(), getEJBHome(), getEnvironment(),
getRollbackOnly(), getUserTransaction(), isCallerInRole(Identity),
setRollbackOnly()
Despliegue
El despliegue es un proceso en cinco pasos:
1.
2.
3.
Creación de un fichero de descriptor de despliegue para cada enterprise bean,
típicamente usando una herramienta gráfica. En el caso de beans de entidad, debe
especificarse la propiedad containerManagedField para establecer la lista de campos
para los que el contenedor EJB debe generar llamadas de acceso.
Proporcionar un fichero manifest que liste todos los descriptores de despliegue.
Especificar aquellas propiedades de entorno que el bean precise en tiempo de ejecución.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
13
4.
5.
Empaquetar el descriptor de despliegue, fichero manifest y las clases asociadas al bean
(.class del propio bean, del interfaz home y del interfaz objeto remoto) en un fichero JAR.
Desplegar el bean usando la herramienta proporcionada por el software del servidor de
aplicaciones.
Gestión
Las principales diferencias en funcionalidad en los proveedores de servidores de aplicación
compatibles con EBJ residen en las herramientas y consola de gestión. Las funciones que se
contemplan suelen incluir:
•
•
•
•
•
La configuración de componentes, recursos, usuarios y grupos.
La monitorización en tiempo real de servidores de aplicación, componentes,
contenedores y clientes.
La capacidad de establecer controles de acceso para clientes, contenedores y
componentes.
La capacidad de definir el número de usuarios concurrentes que pueden ejecutar un
cliente o contenedor específico, y el número de instancias permitidas para cada usuario o
grupo.
Vista histórica y en tiempo real de eventos ligados a la operación del servidor.
¿Cómo se integra EJB con los sistemas externos?
Los proveedores de servidores de aplicación basados en EJB abordan el acceso a los datos
de diversas maneras. Algunos proporcionan drivers JDBC para acceso a bases de datos
relacionales. Otros se basan en drivers ODBC estándar y la pasarela JDBC-ODBC para el
acceso desde clases Java. En ciertos casos se hace uso de drivers nativos, que ofrecen
mayor funcionalidad y rendimiento (usando, por ejemplo, directamente OCI para acceso a
Oracle). La mayoría ofrece también acceso a CICS e IMS, VSAM, DB2, MQSeries, TN3270,
SAP, Peoplesoft, etc. En última instancia, siempre es posible disponer de APIs
proporcionadas por el fabricante del monitor de transacciones o base de datos, basadas en
JNI (Java Native Interface) típicamente desarrolladas en C/C++ y encapsulables en forma de
clases Java.
En cualquier caso, el acceso a fuentes de datos externas es uno de los elementos a tener
más en cuenta a la hora de seleccionar un producto de servidor de aplicación basado en
EJB.
¿Cuál es el futuro de EJB?
EJB es una tecnología novedosa y muy prometedora, dado el gran soporte que está
recibiendo por parte de la industria. Muchas características interesantes aparecerán en la
versión 2.0 de la especificación EJB. Además, en CORBA 3 se incluyen especificaciones
ligadas al mapping de objetos CORBA y enterprise beans. Éstas se tratarán com
componentes CORBA en productos ORB, sin grandes problemas dado que los modelos
CORBA y EJB son muy similares.
La siguiente tabla muestra el desarrollo de la especificación EJB en los próximos meses.
Nombre
Clave
Moscone
Planificación
Características
Revisión preliminar: Principios de 1999
Definicióm más detallada de la
Public review: mediados de 1999
especificación, e información de
Especificación Final: Hacia finales de 1999
despliegue en XML.
Además de las especificaciones, Sun producirá una
implantación de referencia y un conjunto de tests de
compatibilidad.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
14
Nombre
Clave
Javits
Planificación
6 a 9 meses tras la publicación de moscone
Milano
6 a 9 meses tras la publicación de Javits
Características
Conectores estándar para sistemas
externos de diversos tipos.
Definición completa de entidades
Los proveedores de ORB jugarán un importante papel en EJB dada la portabilidad inherente
entre CORBA y EJB. Se tenderá asimismo a incorporar en mayor medida el estándar JTA en
cuanto a soporte transaccional.
Conclusión
Cuando se introdujeron las JavaBeans en JDK 1.1, se convirtieron en el modelo de facto
para componentes GUI. Con EJB, ya se dispone del modelo de componentes Java para
servidor.
El hecho de disponer de la misma funcionalidad de base en todos los productos basados en
EJB permite proteger la inversión en middleware. Los proveedores de este tipo de soluciones
podrán concentrarse en las funcionalidades extra, como el soporte de fuentes de datos
backend de toda índole, así como características que aporten robustez y escalabilidad a la
solución, como tolerancia transparente a fallos a nivel de sesión, balance de cargas, y
agregación de servidores en clusters. Y pese a que existe un camino por recorrer, el
middleware Java es ya una realidad.
Enterprise JavaBeans: Arquitectura de Componentes Java en el Servidor
15