1
EJBs (aspectos avanzados)
Mario Muñoz OrganeroMario Muñoz OrganeroDepartamento de Ingeniería Telemáticahttp://www.it.uc3m.es/mario
Índice del tema
Desarrollo de un cliente EJBDesarrollo de un cliente EJBTransaccionesEJB Query LanguageExcepciones en EJBsSeguridad en EJBs
Servidores de información 2Mario Muñoz Organero.
2
Desarrollando clientes EJB
Tipos de clientes
Web server (running servlets, JSPs)Acts as EJB client EJB server Database/legacy server
RMI/IIOP JDBC
(over
TCP/IP?)
Servidores de información 4Mario Muñoz Organero.
Home userRuns Internet Browser
Bank clerk, running a Java app (usingSwing, etc.) that acts as an EJB client
3
¿Quién puede actuar de cliente de los EJBs?Otros EJBsOtros EJBsServletsAplicaciones Java
Se requiere el arranque de servicios como el JNDI, o un setupcuidadoso (classpath, versión de la JVM, etc.)
Applets JavaSi se dan los permisos apropiados
Servidores de información 5Mario Muñoz Organero.
Si se dan los permisos apropiados
Clientes no JavaLos EJBs son compatibles con CORBA
Comportamiento de un cliente
Servidores de información 6Mario Muñoz Organero.
4
Código de ejemplo. Paso 1: JNDI Lookup
// Obtener un contexto inicial:
Hashtable properties = new Hashtable();
properties.put(INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
properties.put(PROVIDER_URL, "iiop://");
InitialContext iCtx = new InitialContext(properties);
// o mediante la propiedad java.naming.factory.initial
Servidores de información 7Mario Muñoz Organero.
// Lookup, y hacer narrow al objecto:
Object homeRef = iCtx.lookup("AccountHome"); //nombre JNDI
AccountHome home = (AccountHome)
PortableRemoteObject.narrow(homeRef,AccountHome.class);
Código de ejemplo. Paso 2: usando el interfaz Home
// Usar la interfaz Home para crear nuevos EJBs:p
Account acc1 = home.create(“Mario", “UC3M");
// O usar los métodos finder para encontrar EJBsexistentes:
Account acc2 = home.findByPrimaryKey(12345);
Collection fatAccounts =
Servidores de información 8Mario Muñoz Organero.
home.findClientsByMinimalBalance(100000);
5
Código de ejemplo. Paso 3: Usando la referencias EJB
// Sencillamente invocar los métodos de negocio:g
acc1.setBalance(acc1.getBalance() - 100);
acc2.setBalance(acc2.getBalance() + 97); // Commisión...
for (Iterator i = facAccounts.iterator(); i.hasNext(); ) {
Account fatAccount = (Account) i.next();
fatAccount.setMaxCredit(1000000);
}
Servidores de información 9Mario Muñoz Organero.
}
Recordar las “Exceptions”...
Los finders pueden lanzar FinderExceptionLos finders pueden lanzar FinderExceptionLos métodos create pueden lanzar CreateExceptionLos métodos de negocio pueden lanzar excepcionesparticularesCualquiera de los métodos puede lanzarRemoteException
Servidores de información 10Mario Muñoz Organero.
Hay que usar pues bloques try/catch
6
El patron de Home Factory
El primer paso en los clientes de EJB es hacer un JNDI lookupp p pUn patrón común: crear una home factoryUso:
ClientHome = (ClientHome)HomeFactory.lookup("JNDI_Name", "ClientHome");
La clase factory proporciona un único método estatico -- lookupHace un narrow de la búsqueda en el JNDI y devuelve un Object alque se le debe hacer un downcast
Servidores de información 11Mario Muñoz Organero.
que se le debe hacer un downcastEl segundo parámetro es el nombre de la clase, usado para elnarrowing
Usando “Class.forName(name)"
Internamente, la factory contiene el objeto InitialContext
Puede también proporcionar un API para obtenerlo
El patrón Session Facade
Usado para minimizar:Usado para minimizar:El acoplamiento entre clientes y Entity beansEl riesgo de que los clientes hagan mal uso de los métodos denegocioRetardos en la redLos puntos de cambio si se modifica la lógica de negocio
La idea: crear un Session EJB que proporciona los
Servidores de información 12Mario Muñoz Organero.
q p pmétodos de acceso para los clientes
Los clientes solo interactúan con los session bean(s)Los Entity EJBs proporcionan (solo) un interfaz local
Los Session EJB acceden a los entity EJBs localmente
7
Otras prácticas recomendadas
Evitar llamar a los métodos de los EJBEvitar llamar a los métodos de los EJBdirectamente desde los JSP
La necesidad de capturar excepciones remotascomplicaría el código JSPUsar wrappers (beans o etiquetas personalizadas)
Evitar “poner a fuego” la “properties JNDI”
Servidores de información 13Mario Muñoz Organero.
p g p pPor ejemplo, guardar los valores de las propiedadesdel hashtable en un fichero
Transacciones
8
¿Qué son las transacciones?
Una transacción es un conjunto de operaciones que cambia unj p qconjunto de datos de forma atómica (consistencia).Conjunto de operaciones indivisible
Agrupación de operaciones sencillasSi una de algo falla se deshace la transacción
Éxito: Se hace un "commit"Fallo: se deshace con un "roll back"
El efecto de la transacción que falla mantiene los datos invariantes
Servidores de información 15Mario Muñoz Organero.
El efecto de la transacción que falla mantiene los datos invariantes.Una transacción exitosa es persistente
Ejemplo: transferencia bancaria
Definiciones
Objeto Transaccional : Un objecto que se usaObjeto Transaccional : Un objecto que se usa(invocación de sus métodos) dentro de unatransacción
Solo se asocia con una transacción a la vezLos EJBs pueden ser objetos transaccionales
Cliente Transaccional : Programa que invocamétodos en objetos transaccionales
Servidores de información 16Mario Muñoz Organero.
métodos en objetos transaccionales.Gestor de Transacciones: Programa quecoordina la realización de la transacción
9
El Contexto de la Transacción
Una sola transacción puede involucrar aUna sola transacción puede involucrar amúltiples objetos y operaciones.Un contexto de transacción representa latransacción compartida por los participantesPor defecto, se propaga automáticamente entreobjetos transaccionales (EJBs)
Servidores de información 17Mario Muñoz Organero.
objetos transaccionales (EJBs).
JTA: el API Java para Transacciones
Servidores de información 18Mario Muñoz Organero.
10
Delimitación de transacciones dentro de los EJBsSi se usa container-managed transaction demarcation (CMT) no hayg ( ) yque programar nadaEl contenedor de EJB gestiona las transacciones automáticamente
Interacción con bases de datosComienzo y fin de transaccionesCreación y propagación del contexto de la transacción.Incluso con two-phase commit (2PC)El programador solo especifica el comportamiento transaccional de los
Servidores de información 19Mario Muñoz Organero.
El programador solo especifica el comportamiento transaccional de losmétodos que desee
No se programa – se edita el deployment descriptor (XML)
Además se soporta: bean-managed transaction demarcation (BMT)y client-managed transaction demarcation.
Valores del atributo de transaccionesCuando se usa CMT los beans (o mejor dichoCuando se usa CMT, los beans (o mejor dicho,los métodos dentro de los beans) tienen un“transaction attribute”Tiene uno de estos 6 valores posibles:
NotSupported
Supports
Servidores de información 20Mario Muñoz Organero.
Supports
Required
RequiresNew
Mandatory
Never
11
Valores : Supports y NotSupportedSupports:Supports:
Si el que invoca el método (cliente, u otro método)tiene un contexto de transacción, se propaga al beanSi no, no se usa un contexto de transacciónSe usa esto para situaciones en las que “da igual”
NotSupported:
Servidores de información 21Mario Muñoz Organero.
pp
Si el que invoca el método tiene un contexto detransacción éste se suspende durante la invocaciónal métodoSi no, no se usa un contexto de transacción
Valores : Required y RequiresNewRequired:Required:
Si el que invoca el método tiene un contexto de transacción sele propaga al beanSi no, el contenedor crea uno nuevoI.e., el método siempre se ejecuta en un contexto detransacción, pero no crea uno si ya existe uno.Este es el valor por defecto
Servidores de información 22Mario Muñoz Organero.
RequiresNew:En cualquier caso se crea un contexto de transacción nuevopara la invocación del métodoSe usa para meter el método en una transacción pero cuandono se quiere que el fallo del método tenga repercusiones fuera.
12
Valores : Mandatory y Never
Mandatory:ySi el que invoca el método tiene un contexto de transacción se lepropaga al beanSi no, se lanza una excepción
TransactionRequiredException oTransactionRequiredLocalException
Se usa cuando se quiere que el invocador tenga un contexto detransacción
Ne er
Servidores de información 23Mario Muñoz Organero.
Never:Si el que invoca el método tiene un contexto de transacción se lanzauna excepción
RemoteException o EJBException
En otro caso el método se ejecuta sin transacciónSe usa para recursos no transaccionales
Ejemplo en el DD<ejb-jar>
…<assembly-descriptor>assembly descriptor<container-transaction>
<method><ejb-name>AccountExpl</ejb-name><method-name>*</method-name>
</method><trans-attribute>Required</trans-attribute>
</container-transaction><container-transaction>
<method>
Servidores de información 24Mario Muñoz Organero.
<ejb-name>AccountImpl</ejb-name><method-name>*</method-name>
</method><trans-attribute>Required</trans-attribute>
</container-transaction></assembly-descriptor>
</ejb-jar>
13
Abortando una Transacción
Con CMT no se pueden crear transaccionesCon CMT no se pueden crear transaccionespero si abortarlas.Si un método de negocio quiere abortar unatransacción debe invocar setRollBackOnlyen su objeto de contexto EJB
Lo que normalmente se hace antes de enviar unaexcepción
Servidores de información 25Mario Muñoz Organero.
excepciónSe usa getRollBackOnly para ver si latransacción ha sido abortada
Transacciones “Bean-Managed”
Solo disponibles para session y message-driven EJBsp p y gUn método de negocio puede usar JTA para crear un objetoUserTransaction y usarlo como su contexto de transacción(ejecutar getUserTransaction() del EJBContext)
Métodos de UserTransaction: begin, commit, rollback,setRollbackOnly
El bean que crea la transacción será el responsable de hacer elcommit o el rollback
Servidores de información 26Mario Muñoz Organero.
En stateless session beans, el método que inicia la transacción debeacabarla
Una instancia que inicia una transacción debe acabarla antes decomenzar otra.
14
La interfaz SessionSynchronizationLos stateful session EJBs (solamente) si usan transacciones( )gestionadas por el contenedor pueden solicitar notificaciones deeventos de transacción
Le permite al bean mantener una caché que podrá sincronizar con unabase de datos
Para ello el bean solo tiene que implementarSessionSynchronization
Hay 3 métodos en la interfaz:
Servidores de información 27Mario Muñoz Organero.
yafterBegin
beforeCompletion
Se puede abortar la transacción con setRollbackOnly en el contexto dela sesión
afterCompleteion(boolean)
El parametro indica commit (true) o rollback
Prácticas recomendadas con transaccionesSe prefiere el control de transacciones por elSe prefiere el control de transacciones por elcontenedorSe prefiere usar Required, RequiresNew yMandatory sobre las otras opciones
Supports, NotSupported y Never no siempre seimplementan
Servidores de información 28Mario Muñoz Organero.
p
15
EJB Query Language
Qué es EJB QL
Un lenguaje de consultas usado con CMPUn lenguaje de consultas usado con CMPPara los métodos “finder”
Tecnicamente, un subconjunto modificado deSQLMás portable que SQL
Soportado por todos los servidores J2EE
Servidores de información 30Mario Muñoz Organero.
Soportado por todos los servidores J2EENormalemente se compila a un lenguaje nativodel servidor de aplicaciones.
16
Una Query EJB QL
EJB QL solo incorpora queries SELECTEJB QL solo incorpora queries SELECTCada query tiene 3 partes:
SELECT
FROM
WHERE (opcional)
La query puede tener parametros
Servidores de información 31Mario Muñoz Organero.
La query puede tener parametrosLos pasados al método “finder”
EJB QL: Ejemplo 1
SELECT DISTINCT Object(c) FROM Customer cSELECT DISTINCT Object(c) FROM Customer c
Encuentra a todos los clientesRetorna una collectionNo retorna duplicados (por el DISTINCT)"Object" es requerido para las variables en la parte del SELECT"Customer c" declara la variable de identificación "c" de tipo"Customer"
Servidores de información 32Mario Muñoz Organero.
17
EJB QL Ejemplo 2
SELECT DISTINCT Object(c) FROM CustomerSELECT DISTINCT Object(c) FROM Customerc, IN (c.accounts) a WHERE a.balance <0.0
Retorna todos los clientes con al menos un descubierto encuenta."IN (c.accounts) a" sigue a la “container-managedrelationship” accounts de los Customer
Servidores de información 33Mario Muñoz Organero.
"WHERE a.balance < 0.0" tiene la misma semántica que enSQL WHERE limitando los resultados devueltos
EJB QL Ejemplo 3
SELECT DISTINCT Object(c) FROM Customer cSELECT DISTINCT Object(c) FROM Customer cWHERE (c.address.country = ?1) AND(c.address.city = ?2)
Esta query acepta 2 parámetrosAparecen como "?1" y "?2" en el código
Se pueden usar para implementar un método finder con 2argumentos
Servidores de información 34Mario Muñoz Organero.
Retorna los clientes de un determinado pais y ciudad
18
Ejemplo DD<entity>
<description>Una descripción</description><ejb-name>AccountImpl2</ejb-name><home>eb.AccountHome</home>home eb.AccountHome /home<remote>eb.Account</remote><ejb-class>eb.AccountImpl2Bean</ejb-class><persistence-type>Container</persistence-type><prim-key-class>java.lang.Integer</prim-key-class><reentrant>False</reentrant><cmp-field>
<field-name>accno</field-name></cmp-field><cmp-field>
<field-name>customer</field-name></cmp-field><primkey-field>accno</primkey-field>
Servidores de información 35Mario Muñoz Organero.
<query><query-method>
<method-name>findByNumber</method-name><method-params>
<method-param>int</method-param></method-params>
</query-method><ejb-ql>SELECT OBJECT(o) FROM accountsample o WHERE o.accno = ?1</ejb-ql>
</query></entity>
Métodos Select
Son similares a los finders:Son similares a los finders:En la clase del entity bean, deben empezar con "ejbSelect"En CMP entity beans, se definen abstractos
Y se proporcionan las secuencias EJB QL en el deploymentdescriptor
En BMP entity beans, se implementan manualmenteRetornan interfaces de componente del bean o una collection
Servidores de información 36Mario Muñoz Organero.
Al contrario que los finders, los métodos select no sereflejan en la interfaz Home
Son para el propio uso del bean
19
Excepciones en los EJBs
Tipos de excepciones
En J2SE hay 2 tipos de excepciones:En J2SE hay 2 tipos de excepciones:Runtime exceptionChecked exceptions
Para los EJBs se suele hacer otra distinción:Application exceptions
Relacionadas con la lógica de negocio
Servidores de información 38Mario Muñoz Organero.
Relacionadas con la lógica de negocio
System exceptionsQue representan problemas en la ejecución del sistema
20
Excepciones de aplicación
Excepciones para reportar problemas en la ejecución deExcepciones para reportar problemas en la ejecución dela lógica de negocio
e.g., public void withdraw(float amount) throwsOverdraftException
Es tarea del cliente recuperar o reportar estaexcepciones.
“El cliente" aquí no significa la aplicación cliente sino cualquiera
Servidores de información 39Mario Muñoz Organero.
q g p qque haya realizado la invocación del método del EJB que lanzala excepción.
La excepciones de aplicación tienen que ser subclasesde Exception, pero no subclases deRuntimeException (i.e., deben ser “checked”)
Excepciones de aplicación (cont.)
Si se lanza una excepción de aplicación y no seSi se lanza una excepción de aplicación, y no secaptura en el servidor, se manda al cliente
Como ocurre con RMI “regular”, el clientesencillamente invoca el método y obtiene unaexcepción como resultado (de forma transparente).
Servidores de información 40Mario Muñoz Organero.
CreateException, FinderException yRemoveException son ejemplos deexcepciones de aplicación.
21
Excepciones de sistema
Usadas para reportar problemas a nivel de sistemaUsadas para reportar problemas a nivel de sistemaFallo al buscar el contexto JNDIFallo al obtener una conexión a una base de datosProblemas de comunicación... etc.
Los clientes no capturan estas excepcionesSi ocurre una excepción de sistema el bean debería:
Servidores de información 41Mario Muñoz Organero.
Si ocurre una excepción de sistema el bean debería:Si son “Runtime exceptions”: propagar la excepción alcontenedorTodas las otras clases: envolverlas en una nuevaEJBException y relanzarlas
El patrón "Generic Application Exception"Un patrón común sugiere definir una superclase para todas la excepcionesp g p p pde aplicación
"MyAppException" o como se quieraTodos los métodos de negocio deben ser declarados como "throwsMyAppException" en la clase bean y en la interfaz de componente
Incluso si no van a lanzar excepcionesDe esta manera, los clientes tienen que meter la llamada a los métodos denegocio en un bloque try/catch
Si los beans evolucionan y lanzan nuevas excepción el código de cliente ya está
Servidores de información 42Mario Muñoz Organero.
Si los beans evolucionan y lanzan nuevas excepción el código de cliente ya estápreparado con su bloque try/catch
Aunque se añadirá la parte necesaria para tratar la nueva excepción
En la práctica, hace que las excepciones de aplicación se traten comoexcepciones en tiempo de ejecución.
22
Seguridad en EJBs
Objetivos de seguridad
La portabilidad no se debe ver afectadapTransparencia, Aislamiento y Abstracción
Los desarrolladores de los beans no tienen por qué conocer nada sobrela seguridadLos desarrolladores de aplicaciones pueden manejar la seguridad sinmodificar el código de los beans
ExtensibilidadFlexibilidad
Servidores de información 44Mario Muñoz Organero.
FlexibilidadLos mecanismos de seguridad no deben imponer políticas de seguridad
Independencia de implementaciónInteroperabilidad
Entre servidores, entre vendedores …
23
Terminología de seguridad en J2EEUn principal es todo aquello que puede ser autenticadop p q q p
Por ejemplo un usuario o un servidorCada principal tiene asociados unos atributos de seguridad (securityattributes)
Usados para saber a qué recursos puede acceder el principalUn principal se identifica presentando credenciales (credentials)
Una credencial contiene o referencia atributos de seguridadLas credenciales se adquieren por autenticación
Servidores de información 45Mario Muñoz Organero.
Las credenciales se adquieren por autenticaciónLas credenciales también pueden ser adquiridas por delegación de otroprincipal.
Seguridad “Container-Based”
La seguiridad para los componentes (EJBs) se proporciona por elg p p ( ) p p pcontenedor en el que se ejecutan.Seguridad declarativa: definida en los “deployment descriptors”
Incluye la definición de roles de seguridad, reglas de control de accesoy requisitos de autenticación.Se mapean por el desarrollador de la aplicación a un entorno deejecución concreto
Seguridad programática: Uso explícito de los APIs de seguridad por
Servidores de información 46Mario Muñoz Organero.
parte del código de los componentesProporciona flexibilidad
e.g., el mismo método puede comportarse de forma distinta en función delprincipal
Principales métodos: getCallerPrincipal y isCallerInRole,definidos en EJBContext.
24
Autenticación en J2EE
J2EE no dicta un método de autenticaciónJ2EE no dicta un método de autenticaciónCada implementación debe proporcionar susherramientas de autenticaciónSoluciones típicas lo hacen por HTTP, HTTPS (HTTPsobre SSL), y basadas en formulariosTambién hay soluciones de autenticación no basadas enW b
Servidores de información 47Mario Muñoz Organero.
WebUna implementación podría por ejemplo basarse en lasherramientas del sistema operativo
e.g., login en Unix o WinNT
Responsabilidades en la seguridad de los EJB
Servidores de información 48Mario Muñoz Organero.
25
Responsabilidades en la seguridad de los EJB
Servidores de información 49Mario Muñoz Organero.
El papel del proveedor del Bean
Los mecanismos de seguridad no deberían ser implementadosg pdentro de los EJBsLas políticas de seguridad no deberían estar codificadas “a fuego”
La misma aplicación, cuando se despliega sobre diferentes entornospuede requerir diferentes políticas.
Conclusión: El proveedor de un bean no debería involucrarse en laseguridad.El proveedor del bean se debería limitar a ofrecer referencias a
Servidores de información 50Mario Muñoz Organero.
El proveedor del bean se debería limitar a ofrecer referencias aroles para la provisión de seguridad (e.g., que roles se asumendefinidos) a través de los descriptores de despliegue
26
APIs disponibles para el proveedor del BeangetCallerPrincipal retorna el “nombre” del principalg p p p
Util para generar logs por ejemplo, o como base para el acceso a unabase de datos…No se debería asumir la existencia de ciertos nombres.
i.e., evitar código como if (principal.equals("root")) ...
isCallerInRole(String roleName) premite al proveedor delbean codificar comportamientos distintos para un mismo método enfunción del role de seguridad del principal.
Servidores de información 51Mario Muñoz Organero.
Es mejor proporcionar diferentes métodos y usar las declaraciones enel descriptor de despliegue para especificar si un role puede o noacceder al método.
Referencias a Roles
El proveedor del bean no puede asumir la existencia de rolesp p“estandar” (e.g., "superusuario", "administrador", etc.)Por lo tanto, el proveedor del bean usará referencias a roles
La definición aparece en el descriptor de despliegue (dentro de ladescripción del bean)Por ejemplo:<security-role-ref>
<description>Security role for customers</description>
l / l f
Servidores de información 52Mario Muñoz Organero.
<role-name>customer</role-ref>
<role-link> Nombre del role en el contenedor </role-link>
</security-role-ref>
Las referencias son mapeadas a los roles disponibles por elensamblador de la aplicación.
27
El ensamblador de la aplicación
Encargado de añadir el assembly-descriptor alEncargado de añadir el assembly descriptor aldescriptor de despliegue.Define los roles de seguridad
A veces es la misma persona que el proveedor del bean
Mapea roles de seguiridad con referencias a roles(definidos por el proveedor del bean)E ifi l i d l ti b l
Servidores de información 53Mario Muñoz Organero.
Especifica los permisos que cada role tiene sobre losmétodos de los EJBs
A veces se deja esta misión al encargado de desplegarla aplicación.
Roles de seguridad
En el DD:En el DD:
<assembly-descriptor><!-- Identifies those security roles defined for an EJB module.--><security-role><!-- Describes a security role. --><description> Administrator role for bean. </description><!-- Identifies a logical role name that this EJB module uses. --><role-name> Nombre del role en el contenedor </role-name>
Servidores de información 54Mario Muñoz Organero.
</security-role></assembly-descriptor>
28
Permisos de los métodos.
El que ensambla la aplicación (o el que la despliega) puede especificar quéét d d i d é lmétodos pueden ser invocados por qué roles.
Por ejemplo (dentro del assembly-descriptor):
<method-permissions><role-name>client</role-name><method>
<ejb-name>Account</ejb-name><method-name>getBalance</method-name>
</method>... more methods ...
</method-permissions>
Servidores de información 55Mario Muñoz Organero.
</method permissions><method-permissions>
<role-name>clerk</role-name><method>
<ejb-name>Account</ejb-name><method-name>*</method-name>
</method>
</method-permissions>
Asociando roles con principales
El que despliega la aplicación usará unaEl que despliega la aplicación usará unasemántica propia del contenedor.Por ejemplo, en WebLogic se tiene en el ficheroweblogic.xml algo así:
<security-role-assignment>l ll d i / l
Servidores de información 56Mario Muñoz Organero.
<role-name>PayrollAdmin</role-name><principal-name>Tanya</principal-name><principal-name>Fred</principal-name><principal-name>system</principal-name>
</security-role-assignment>
29
Identidades de seguridad
Cuando se invoca un método de un EJB se hace usandoCuando se invoca un método de un EJB se hace usandouna identidad de seguridad
Un principal y uno o más roles
Normalmente, cuando un método de un EJB m1 invocaotro método m2, m2 se invoca con la misma identidadSi embargo, se puede especificar que un método seinvoca siempre con una identidad determinada
Servidores de información 57Mario Muñoz Organero.
invoca siempre con una identidad determinadaSolo aplica a llamadas entre métodos de un bean