Académique Documents
Professionnel Documents
Culture Documents
Ejb 3
Ejb 3
Plan
Introduction 3 types dEJB (Session, Entity, Message-Driven) Injection et JNDI Intercepteurs et callbacks Transactions (CMT, BMT) Scurit Persistance avec JPA
Introduction
Permet dviter au dveloppeur davoir se proccuper de tout ce qui a trait au systme :
Transactions Scurit Evolutivit Concurrence Communications Gestion des ressources Persistance Gestion des erreurs Etc.
3 types dEJB
Session
Stateless Stateful
Session
Sont conus pour encapsuler la logique mtier Les plus utiliss 2 types dEJB session :
Stateless Stateful
Lorsquun client appelle lEJB, une instance de ce dernier sert le client, puis, retourne dans le pool dEJB (cette dernire est donc prte a tre rutilise pour un autre client) A utiliser le plus souvent possible (par rapport aux Stateful) => cycle de vie
EJB 2 vs. 3
Pour les EJB session stateless, nous commencerons par prsenter leur utilisation avec les EJB 2, puis avec les 3 Le but est de montrer les amliorations et simplifications amenes avec la version 3 Cela permettra galement de mieux comprendre le principe de fonctionnement des EJB (par exemple, lutilisation du javax.rmi.PortableRemoteObject.nar row())
Par convention, et ce afin dviter des malentendus, les mthodes mtier ne doivent pas commencer par ejb
Lorsquun client appelle lEJB, une instance de ce dernier est cre, puis sert le client. Cette instance reste disponible pour les futurs appels de ce client uniquement. Cette instance sera dtruite la fin de la session (timeout ou appel une mthode portant lannotation @Remove) Sil y a trop dinstances dun EJB en mmoire, ces dernires peuvent tre sorties de la mmoire de travail. Elles passent ainsi en mode passif (= sauves sur disque => tous les attributs doivent tre srialisables = types implmentant linterface Serializable)
Srialisation
Le type des attributs et le type de retour de chaque mthode doivent tre Serializable (sauf dans le cas dune mthode dun EJB stateless local) Par prcaution, nous tcherons de veiller ce que tous les types que nous utilisons soient Serializable Le serialVersionUID permet de faire la distinction entre des objets de mme type, mais dune version diffrente Lorsque quun objet est reu, le destinataire vrifie que le serialVersionUID de lobjet reu correspond celui de la classe quil a charg. Sil diffre, une InvalidClassException est lance Ce mcanisme permet de sassurer que lmetteur et le destinataire travaillent avec la mme version de lobjet Cette solution a une faiblesse: lors dune modification, elle ncessite que toutes les applications qui utilisent cette classe doivent tre mis jour, alors que cela nest pas forcment ncessaire. En effet, dans le cas o on ajoute un nouvel attribut un objet, cela ne signifie pas forcment que toutes les applications ont lutilit de ce nouvel attribut => on donne une valeur arbitraire par dfaut au serialVersionUID et on ne la modifie pas
Local
EJB 2
Local
EJB 2
Local
EJB 2
META-INF/jboss.xml
Local
EJB 2
Local
EJB 2
META-INF/jboss.xml
Local
EJB 2
Local
EJB 3
Entity
Permet de grer la persistance comme le ferait Hibernate sur le concept de object-relational mapping (ORM) => illusion de travailler avec une base de donnes objet Le mapping ne se fait plus forcment dans un fichier XML (comme hibernate.cfg.xml), mais directement dans le code avec des annotations (@Id, @Column, etc.) Davantage de dtails dans le dernier chapitre de ce cours Persistance avec JPA
Message-Driven
Permet des applications de communiquer entre elles, en tant faiblement couples, et de manire asynchrones Ce concept est connu sous le nom de Message-oriented middleware (MOM) Les produits implmentant ce mcanisme sont nombreux comme IBM WebSphere MQ (anciennement MQSeries), JBoss Messaging (qui remplacera JBoss MQ), etc. PTP (point-to-point)
javax.jms.Queue
pub-sub (publish-subscribe)
javax.jms.Topic
Message-Driven
Nous devons configurer le produit qui implmente le mcanisme JMS. Ici, il sagit de JBoss MQ qui est intgr notre version de JBoss (4.0.5-GA) Le fichier de configuration doit tre dpos dans le rpertoire <jboss-install>/server/<configurationname>/deploy/jms, et son nom doit se terminer par service.xml
Message-Driven
EJB 3
Message-Driven
EJB 3
Message-Driven
EJB 3
Message-Driven
Il y a la possibilit de mettre un filtre sur les messages qui peuvent tre traits par un MDB. Cela permet de ne pas recevoir certains messages. Cette proprit est surtout intressante dans le cas dune Queue (PTP), car le message nest envoy qu un seul MDB. Dans le cas dun Topic (pubsub), cela permet surtout de ne pas avoir tester si le message reu peut tre trait par le MDB Pour davantage de prcisions sur la proprit messageSelector, nous vous renvoyons la page 131 du livre EJB 3 in Action , 2007, Manning
Injection et JNDI
Lannotation @Resource permet dinjecter un objet rfrenc (au sens large: DataSource, JMS, EJB, Context, etc.). Il est possible de spcifier le nom JNDI de lobjet pour lever une ambigut. Par exemple, dans le cas dune DataSource, sil y en a plusieurs dfinies sur le serveur, il faudra alors donner son nom JNDI (@Resource(name="jdbc/myDB")avec les EJB 2, dans le descripteur de dploiement, on utilisait la balise <res-ref-name>) Il est galement possible dinjecter des variables denvironnement (de type String, Character, Byte, Short, Integer, Long, Boolean, Double ou Float) qui ont t pralablement dclares dans le descripteur de dploiement :
Lors du dploiement, le conteneur rsout les rfrences JNDI et relie les ressources en question. Si une ressource nest pas trouve lors du dploiement, le conteneur lance une RuntimeException; lEJB est alors inutilisable
Intercepteurs
Lorsquune mthode mtier est appele, les intercepteurs permettent dexcuter des mthodes avant que la mthode mtier ne soit excute Les intercepteurs peuvent tre utiles dans plusieurs situations: pour mettre des logs sans avoir surcharger le code, pour grer la scurit sparment du code mtier, etc. Exemple pour vrifier le rle de lappelant :
Intercepteurs
EJB 3
Les intercepteurs peuvent tre dfini au niveau du descripteur de dploiement, de la classe, de la mthode (ordre dans lequel ils sont appels)
Callbacks
Les callbacks permettent dexcuter des mthodes lorsque certains vnements lis au cycle de vie de lEJB interviennent (cration, suppression, hibernation, rveil) Aprs la cration (@PostConstruct) (Stateless, Stateful, Message-Driven) Avant la suppression (@PreDestroy) (Stateless, Stateful, Message-Driven) Avant lhibernation (@PrePassivate) (Stateful) Aprs le rveil (@PostActivate) (Stateful)
Intercepteurs et callbacks
Session -> Stateless
Intercepteurs et callbacks
Session -> Stateful
Intercepteurs et callbacks
Entity
Intercepteurs et callbacks
Message-Driven
Transactions
ACID Atomicit Pour atteindre un but donn, une transaction est compose de plusieurs oprations qui sont indispensables => soit toutes les oprations sont effectues, soit aucune ! Cohrence Aprs quune transaction se soit ralise, le base de donnes ou le systme doit se trouver dans un tat cohrent Isolation Une transaction doit se raliser sans dpendre des autres transactions qui peuvent avoir lieu en mme temps Durabilit Lorsquune transaction sest termine, le rsultat de cette dernire est durable : que la transaction ait t annule ou quelle se soit termine correctement, les oprations quelle a effectu ne doivent pas disparatre Exemple : transfert bancaire
Transactions
JTA (Java Transaction API) fournit un API permettant de grer les transactions :
BMT (Bean-Managed Transactions) => @TransactionManagement(TransactionManagementTyp e.BEAN) CMT (Container-Managed Transactions) => @TransactionManagement(TransactionManagementTyp e.CONTAINER) Par dfaut, le conteneur gre les transactions
JPA (Java Persistance API) ne dpend pas du mode de gestion des transactions => ninflue que sur les EJB Session et les Message-Driven, et non sur les Entity
CMT
Le conteneur dmarre, valide ou annule la transaction. La transaction commence au dbut de lexcution de la mthode mtier appele et se termine la fin de cette dernire
Transaction @TransactionAttribute existante lors de l'appel ? REQUIRED (par dfaut) REQUIRED_NEW Non Oui Non Oui Non Oui Non Oui Non Oui Non Oui Rsultat Le conteneur cre une nouvelle transaction La mthode rejoint la transaction existante Le conteneur cre une nouvelle transaction Le conteneur cre une nouvelle transaction et la transaction existante est suspendue Aucune transaction n'est utilise La mthode rejoint la transaction existante Lve une javax.ejb.EJBTransactionRequiredException La mthode rejoint la transaction existante Aucune transaction n'est utilise La transaction existante est suspendue et la mthode est appele sans transaction Aucune transaction n'est utilise Lve une javax.ejb.EJBException
SUPPORTS MANDATORY
NOT_SUPPORTED
NEVER
CMT
On peut forcer le fait que la transaction soit annule (context.setRollBackOnly()) Les mthodes setRollbackOnly() et getRollbackOnly() ne peuvent tre appeles que depuis un EJB dont les transactions sont gres par le conteneur (CMT) et ayant comme attribut de transaction REQUIRED, REQUIRED_NEW ou MANDATORY Sinon une IllegalStateException est leve ! Si le conteneur dtecte une exception systme (principalement les RuntimeException) comme une ArrayIndexOutOfBoundsException ou une NullPointerException, la transaction sera automatiquement annule
CMT
Avec CMT, nous navons pas le contrle sur le moment o la transaction est dmarre, valide ou annule Il est possible dtre inform de ces vnements grce des callbacks LEJB doit implmenter linterface javax.ejb.SessionSynchronization
void afterBegin() Est appel juste aprs que le conteneur ait cr une nouvelle transaction et avant que la mthode mtier soit appele void beforeCompletion() Est appel lorsque la mthode mtier sest termine et juste avant que le conteneur termine la transaction void afterCompletion(boolean committed) Est appel aprs que la transaction soit termine. Le flag committed indique si la transaction a t valide (true) ou si elle a t annule (false)
BMT
On utilise la UserTransaction
@Resource private UserTransaction userTransaction; OU @Resource private SessionContext context; ... UserTransaction userTransaction = context.getUserTransaction();
userTransaction.begin(); ... userTransaction.commit(); OU userTransaction.rollback(); La UserTransaction ne peut tre utilise que dans le cas o les transactions sont gres par lEJB (BMT); dans le cas o cest le conteneur (CMT) une IllegalStateException est leve
Scurit
JAAS (Java Authentication and Authorization Service) est une API standard de Java permettant de grer les identifications et les droits associs (par rles) au niveau du client et du serveur d'application Principe de fonctionnement :
Dans un premier temps, JAAS authentifie (valide l'identit du client) Puis gre les autorisations (valide les droits d'accs pour un client authentifi) Les identits sont regroupes en rles et les autorisations accordes par rle
Ct client, la technique la plus simple, mais aussi la plus ancienne et la plus limite : le username (Context.SECURITY_PRINCIPAL) et le password (Context.SECURITY_CREDENTIAL) sont transmis avant le lookup au contexte JNDI
Scurit
Lauthentification est ralise par une application web qui ensuite appelle lEJB en lui passant le Principal
Scurit
Dans un premier temps, il faut configurer la scurit JAAS sur le serveur Pour nous simplifier la tche, nous utiliserons la mthode dauthentification SimpleServerLoginModule :
Si le mot de passe est null, alors lutilisateur est authentifi avec le rle guest Si le nom dutilisateur est gal au mot de passe, alors lutilisateur est authentifi avec les rles guest et user Sinon lauthentification choue
Pour cela, nous devons dfinir une politique de scurit dans le fichier <jbossinstall>/server/<configuration-name>/conf/loginconfig.xml
Scurit
Remarque : dans le cadre dune vraie application, nous aurions plutt utilis la mthode dauthentification DatabaseServerLoginModule qui effectue une requte dans une base de donnes qui contiendrait les noms dutilisateurs, les mots de passe, ainsi que les rles associs aux utilisateurs Dans les 2 exemples qui suivent, on dclare le domaine de scurit par lannotation @SecurityDomain(...) ATTENTION utiliser linterface org.jboss.annotation.security.SecurityDoma in et non org.jboss.aspects.security.SecurityDomain
Scurit
Avec les annotations
Scurit
Avec la mthode isCallerInRole(...)
Scurit
Pour pouvoir accder aux mthodes prcdemment scurises, il faut que lappelant soit correctement identifi avec JAAS Prenons le cas dune application web
Scurit
Dfinir le domaine de scurit : fichier <your-webapp>/WEB-INF/jboss-web.xml
Dfinir ce qui sera scuris, comment, et quelle sera la page dauthentification et la forme de celle-ci : fichier <yourweb-app>/WEF-INF/web.xml (contenu sur le slide suivant)
Scurit
Page JSP qui permet dappeler lauthentification JAAS : fichier <your-web-app>/WEB-INF/jsp/login.jsp
Scurit
Appel de lEJB depuis la Servlet :
many-to-many
=>
Au pralable une DataSource a t dclare sur le serveur (<jboss-install>/ server/ <configuration-name> /deploy)
ORM
@OneToOne Remarque: fonctionne trs bien dans une utilisation nave , mais cela devient problmatique lorsque lon veut utiliser des fonctionnalits plus intressantes, comme @PrimaryKeyJoinColumn
[http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_S equencing#Primary_Keys_through_OneToOne_Relationships]
@OneToMany @ManyToOne @ManyToMany
ORM
ORM
ORM
ORM
Inconvnients des annotations, surtout dans le cas de la persistance JPA :
Dgrade la lisibilit du code Perte de la sparation entre Entit et Mapping En cas de modification, ncessite de recompiler les classes modifies, au lieu de juste modifier les fichiers de mapping concerns
=> utiliser plutt dans le cas dun prototype Solution plus lgante : utilisation dun fichier de mapping XML (META-INF\orm.xml) (contenu sur les slides suivant)
orm.xml (1/2)
orm.xml (2/2)
Hritage
Avec JPA, il est galement possible davoir une notion dhritage entre les entits Le dveloppeur doit choisir la manire dont seront stockes les informations (@Inheritance(strategy= ...)):
une seule table (InheritanceType.SINGLE_TABLE) plusieurs tables lies (InheritanceType.JOINED) des tables indpendantes (InheritanceType.TABLE_PER_CLASS)
Pour davantage de prcisions, nous vous renvoyons la page 284 du livre EJB 3 in Action , 2007, Manning + http://en.wikibooks.org/wiki/Java_Persistence/Inheritance
Callbacks
Comme pour les EJB session et les Message-Driven, il existe des callbacks pour le Entity Avant / aprs la persistance dune Entity (@PrePersist / @PostPersist) Aprs avoir charg une Entity lors dune requte ou dun refresh (@PostLoad) Avant / aprs la mise jour dune Entity (@PreUpdate / @PostUpdate) Avant / aprs la suppression dune Entity (@PreRemove / @PostRemove)
Rfrences
EJB 3 in action, 2007, Manning JBoss in action, 2009, Manning
The J2EE 1.4 Tutorial, 2005, SUN [http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html] EJB 2, 2005, SUPINFO [http://www.labo-sun.com/resource-fr-essentiels835-0-java-j2ee-ejb-2-les-entreprise-java-bean-javabeans-.htm] EJB 3, 2006, SUPINFO [http://www.labo-sun.com/resource-fr-essentiels836-0-java-j2ee-ejb-3-les-entreprise-java-bean-version-3-javabeans-.htm] Java Persistence, WIKIBOOKS [http://en.wikibooks.org/wiki/Java_Persistence]
FIN
Merci pour votre attention !