Entreprise Java Beans
Transcription
Entreprise Java Beans
Java Enterprise Edition
EJB3 / Troisième partie
Matthieu EXBRAYAT
Master 2 RIA
Université Louis Pasteur
1
Plan
Cycle
de vie et callbacks
Intercepteurs
Transactions et sécurité
Timers
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
2
Cycle de vie
Les
EJB sont gérés par le containers
Création,
Quels
Quelle
destruction, etc.
sont les états possibles?
prise a-t-on sur les transitions ?
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
3
Cycle de vie : Session Stateless
Does not exist
Class.newInstance()
@PreDestroy
Injections
@PostConstruct
Method-ready
pool
Méthode métier
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
4
Notion de callback
Des opérations peuvent être nécessaires lors des
transitions
Dans les versions antérieures
Une méthode par type de transition
Imposée et souvent vide
Avec les EJB3 (grâce à Java 5)
Utilisation de tags
callback
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Organisation d’un callback
@TypeCallBack
methodeDeCallBack() { …}
Le nom de la méthode est choisi par le développeur
Elle est de type void, et sans paramètre, ne lève
d’exceptions contrôlées (nécessitant un try/catch)
Invocation par le container lors du changement d’état
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Callbacks du Session Stateless
@PostConstruct
Initialisation
du bean, ne relevant pas du « new », ni
des ressources injectables
Exemple
: socket, accès fichier, etc.
@PreDestroy
Permet
essentiellement de nettoyer ce qui a été
ouvert dans le PostConstruct
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Pooling : exécution de méthode
Stub
Objet EJB
Contexte
Client
Instances
du bean
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Pool
Pooling : invocation terminée
Stub
Objet EJB
Client
Pool
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Cycle de vie : Session stateful
Exception système
Does not exist
timeout
Class.newInstance()
@PreDestroy
timeout
Injections
@PostConstruct
@PrePassivate
Method-ready
Méthode métier
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
@PostActivate
Passivé
Passivation
Pooling impossible
Comment gérer les ressources ?
Solution : stocker en mémoire secondaire (LRU)
Passivation
Stocke l’état conversationnel en mémoire secondaire et déréférence
l’instance
Activation
Recrée l’instance (et ses attributs) et reconnecte à l’objet EJB
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Etat conversationnel
Contexte
Transaction
EM
et EMFactory
Références
aux ressources et EJB
(Attributs)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Etat prêt
Stub
Objet EJB
Contexte
Client
Instance
du bean
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Etat passivé
Stub
Objet EJB
Client
État conversationnel
(et attributs)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Timeout et exceptions système
Timeout
déclarés au déploiement
Dépend du serveur d’application
Pas de timeout en cours de transaction
@PreDestroy pas obligatoire
Exceptions système
Pas de @PreDestroy
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Cycle de vie : entity
En EJB3, lié aux interactions avec l’EM
@PrePersist
@PostPersist
@PostLoad (chargement et refresh)
@PreUpdate
@PostUpdate
@PreRemove
@PostRemove
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Cycle de vie : MDB
Does not exist
Class.newInstance()
@PreDestroy
Injections
@PostConstruct
Method-ready
pool
Méthode métier
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
17
Plan
Cycle
de vie et callbacks
Intercepteurs
Transactions et sécurité
Timers
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
18
Intercepteurs
Les intercepteurs permettent d’effectuer des actions lors de
l’appel de diverses méthodes.
Permettent d’enrichir la gestion des beans au niveau du
container
Appel global ou ciblé sur certaines méthodes
A quoi ça peut bien servir ? ...
Exemples ?
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Intercepteurs
Ils peuvent être définis dans des classes séparées
@Interceptors({« classe1 », « classe2 »…})
Invocation dans cet ordre
@Interceptor (« classe1 »)
Ou directement dans la classe
@AroundInvoke
Exécution de la méthode : proceed
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Exemple
@Stateful
public class CalculatorBean implements Calculator {
/ / Bean methods that are to be intercepted by "log()"
/ / ... ...
@AroundInvoke
public Object log (InvocationContext ctx)
throws Exception {
String className = ctx.getBean().getClass().getName();
String methodName = ctx.getMethod().getName();
String target = className + "." + methodName + "()";
long start = System.currentTimeMillis();
System.out.println ("Invoking " + target);
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
try {
return ctx.proceed();
} catch(Exception e) {
throw e;
} finally {
System.out.println("Exiting " + target);
cal.setTrace(cal.getTrace() + "Exiting " + target);
long time = System.currentTimeMillis() - start;
System.out.println("This method takes " + time + "ms to execute");
}
}
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Méthodes du contexte d'invocation
public interface InvocationContext {
public Object getBean();
// Le bean qui est intercepté
public java.lang.reflect .Method getMethod();
public Object [] getParameters();
// La méthode interceptée (reflection)
// Les paramètres de la méthode
public void setParameters(Object [] params);
// Modif des paramètres
public EJBContext getEJBContext ();
// Contexte de l’EJB
public java.util.Map getContextData();
// permet de passer des infos
// entre méthodes d’interception (chaine d’interception)
public Object proceed() throws Exception;
// Exécution de la méthode interceptée
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Entity Listeners
Pas
d'intercepteurs pour entities.
Classes
listeners associées aux callbacks
Méthodes
void avec entity en paramètre
@EntityListeners
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Exemple (listener)
public class Logger {
@PostPersist void postInsert(Object entity) {
System.out.println(« Entity inséré : »+entity.getClass().getName();
}
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Exemple (entity)
@Entity
@Listeners({Logger.class})
public class MaClasse {
...
@PostPersist void afterInsert() {
...
}
}
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Plan
Cycle
de vie et callbacks
Intercepteurs
Transactions et sécurité
Timers
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
27
Les Transactions / Définition
Une transaction est une série d’opération qui s’exécute dans une
même unité de travail
Cette unité de travail respecte les principes suivants:
Atomicité : toutes les ressources impliquées dans une transaction sont
« committées », ou aucune ne l’est
Cohérence : soit la transaction réussit et les données sont valides à la fin, soit elle
échoue et les données retrouvent leur état – valide – initial
Isolation : tout changement d’état dans une transaction non encore « committée »
est invisible de l’extérieur de la transaction
Durabilité : les données « committées » le sont de telle façon que si le système
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
crashait, elles seraient restaurées au redémarrage
Les Transactions JTA
Une transaction JTA (Java Transaction API) est gérée
par la plate-forme J2EE
Elle peut inclure de multiples composants (servlets, JSP,
EJB, bases de données, etc) et propager le contexte
transactionnel de l’un à l’autre
L’avantage est que cette propagation est complètement
transparente au programmeur
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Les Transactions / JTA et JTS
JTA est une API permettant l’accès à une gestion
transactionnel indépendamment de l’implémentation
JTS spécifie l’implémentation de JTA et de l’OTS 1.1 de
l’OMG. Il propage les transactions via IIOP
Les composants ne doivent pas interagir avec JTS mais
utiliser JTA et l’interface
javax.transaction.UserTransaction
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Les Transactions JTA / Interface UserTransaction
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Les Transactions / Interface Status
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Les Transactions / Types de transactions
Par programmation (bean managed)
C’est le développeur qui est responsable de la transaction
dans le bean (begin, commit, rollback…)
Déclarative (Container-Managed Transaction)
C’est le container qui est responsable de la transaction
C’ est le mode obligatoire pour les Entity Bean
Initialisée par le client
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
C’est le code client qui est responsable de la transaction
Les Transactions / Transaction par programmation
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
BMT
@TransactionManagement(TransactionManagerType.BEAN)
@Resource SessionContext ejbContext;
ejbContext.getUserTransaction();
ut.begin() / commit() / rollback()
Stateless : dans une méthode
Statefull : peut être sur plusieurs (attribut)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Les Transactions / Transaction déclarative
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Transaction initialisée par le client
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Container-Managed Transactions
Pour chaque méthode métier du bean (ou pour la classe
entière), il faut spécifier un attribut de transaction
Cet attribut précise le comportement transactionnel du bean
Six valeurs possibles:
Required
Mandatory
RequiresNew
Supports
NotSupported
Never
Cette spécification se fait par annotation (ou DD)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Concrètement...
Quand
commence une transaction ?
Quand
se finit-elle ?
Commit
ou rollback ?
Annotation
Par
: @TransactionAttribute(TYPE)
classe et/ou par méthode
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
CMT
Required:
Le bean s’exécute toujours dans une transaction
Si une transaction est en cours, alors elle est utilisée, sinon une nouvelle
démarre
Cet valeur d’attribut correspond à un fonctionnement logique dans la
plupart des cas
RequiresNew
Le container créé une nouvelle transaction à chaque fois que le bean est
appelé
Si une transaction est en cours, alors le conteneur:
1. suspend cette transaction
2. en démarre une nouvelle
3. appelle la méthode
4. reprend la transaction originale après exécution
Si aucune transaction n’est en cours, alors le conteneur en démarre une
nouvelle
A utiliser si la méthode doit être exécutée dans un contexte transactionnel
EJB et Java EEdistinct
– Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
CMT
Supports:
Si une transaction est en cours, alors le conteneur l’utilise, sinon exécute
l’appel sans en démarrer de nouvelle
A utiliser avec précaution
Mandatory
Si une transaction est en cours, alors le conteneur l’utilise, sinon lance
une javax.ejb.TransactionRequiredException ou
javax.ejb.TransactionRequiredLocalException
A utiliser si la méthode doit être exécutée dans le contexte transactionnel
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
du client
Container-Managed Transactions
NotSupported:
Si une transaction est en cours, alors le conteneur la suspend, appelle la méthode
hors transaction et reprend la transaction du client
Si aucune transaction n’est en cours, alors la méthode est exécutée hors
transaction
A utiliser si la méthode n’a pas besoin de contexte transactionnel
Peut augmenter les performances
Never
Si une transaction est en cours, alors le conteneur lance une
EJB et Java EE java.rmi.RemoteException,
– Matthieu EXBRAYAT – Master 2 RIA / ULPsinon
2007
il exécute la méthode hors transaction
Attributs autorisés suivant type d’EJB
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Sécurité sous J2EE
Trois
Authentification
Pas spécifié, mais faisable
Contrôle d’accès
niveaux de sécurité pour 1 appli :
Fourni par J2EE (identités, rôles…)
Communications sécurisées
Hors spéc, mais courant (ssl, https)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Identité de sécurité
Un
client qui se connecte au serveur d’EJB est
associé à une identité de sécurité pour la durée
de la session.
Une identité de sécurité = objet
java.security.Principal
La gestion des identités incombe au serveur
d’application
Rôle = groupe d’une ou plusieurs identités
Accès aux ejb (et méthodes) suivant rôle de
sécurité.
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Contrôle d’accès basé sur les rôles
Les droits d’accès sont gérés au niveau des annotations
(ou descripteurs de déploiement)
En entrée :security-role + method-permission : liste
des rôles reconnus et droits d’accès suivant ces rôles
En sortie : runAs : permet de redéfinir l’identité «
interne » de l’appelant (ou plus exactement de l’EJB).
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Annotations bean
@SecurityDomain
Mode
de contrôle des rôles
Exemple
: other = users.properties + roles.properties
@RolesReferenced
Liste
des rôles utilisés dans l'EJB
@RunAs
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Comment le client s’identifie-t-il ?
Client
« lourd » :
Identification lors du lookup
On transfère des propriétés : login et mot de passe
Client
« léger »:
L’identification se fait lors de l’accès au servlet (par
exemple)
Spécifier ce qui est protégé (permet authentification), et qui
y a accès (permet contrôle)
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Identification via jndi
Properties prop=new Properties();
prop.put(Context.SECURITY_PRINCIPAL,login);
prop.put(Context.SECURITY_CREDENTIALS,passwd);
javax.naming.Context jndiContext=new javax.naming.InitialContext(prop);
…jndiContext.lookup(« …. »);
Lors du lookup, les informations d’identification sont transférées
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Identification depuis un client web
On
définit les rôles et la méthode
d’authentification au niveau du descripteur de
déploiement web.xml
Contrôle :
Dans jboss, plusieurs méthodes existent
Fichier login/password
Base de données
Annuaire ldap
…
Le plus simple (pour tester) :
Fichiers users.properties et roles.properties dans [/
…]/jboss…/server/…/conf
Par exemple dans jboss…/server/default/conf
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Exemple de fichiers simples d’authentification
users.properties
user1=passwd1
user2=passwd2
roles.properties
user1=admin
user2=guest
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Plan
Cycle
de vie et callbacks
Intercepteurs
Transactions et sécurité
Timers
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007
Timers... en bref
Il
existe un service Timer
Il
permet de définir une tâche à exécuter à
une date précise (timeOut)
Pour
en savoir plus : cf doc EJB3.0
Pour
des tâches répétitives ?
EJB et Java EE – Matthieu EXBRAYAT – Master 2 RIA / ULP 2007