Vous êtes sur la page 1sur 12

Plan du support

 Généralités
 Interfaces des EJB

EJB – Introduction à CDI  Types d’EJB


 Injection – Introduction à CDI
 Contexte des EJB
ITU - Université de Nice Sophia Antipolis
 Transactions dans les EJB
Richard Grin
 Exceptions dans les EJB
Version O 1.8 – 11/2/16
 Compléments

Richard Grin EJB page 2

Entreprise Java Beans - EJB


 Composant standard pour les objets métier des
serveurs d’application
 Classe annotée (ou déclarée dans le fichier de
Généralités configuration ejb-jar.xml)
@Stateless
public class ...

Richard Grin EJB page 3 Richard Grin EJB 4

Application multi-tiers - containers Services offerts par un container d’EJB


 Gestion du cycle de vie : création et suppression des
EJB ; gestion de pools
 Gestion de la sécurité : seuls les clients autorisés
peuvent appeler les méthodes des EJB
 Gestion des threads : création, appels asynchrones
de méthodes
 Gestion de la concurrence ; un seul thread peut
accéder à un EJB session avec ou sans état
 Gestion des transactions : démarrer et arrêter des
transactions
Richard Grin EJB page 5 Richard Grin EJB page 6

1
Avantages des EJB Intégration des EJB
dans une application Web JSF
 Le développeur peut se concentrer sur les
traitements « métier »  Les pages JSF (Java Server Faces) se chargent
de l’interface avec l’utilisateur
 Il n’a (presque) plus à s’occuper des problèmes
non fonctionnels liés aux transactions, à la  Elles sont épaulées par des classes Java, les
sécurité, à la concurrence,… backing beans
 Les EJB sont portables ; ils peuvent être utilisés  Les backing bean font appel à des EJB pour les
avec tous les serveurs d’application Java EE traitements « métier » et pour l’interface avec les
bases de données (entités persistantes si JPA)

Richard Grin EJB page 7 Richard Grin EJB page 8

Principe de fonctionnement des EJBs


 Un EJB « s’expose » à des clients (classes Java qui
l’utilisent) par des interfaces qui contiennent les
méthodes que les clients peuvent appeler
Interfaces des EJB  Les clients n’accèdent pas directement aux méthodes
de l’EJB
 Le container intercepte les messages pour fournir ses
services
 C’est un objet créé par le container qui recevra les
messages ; il délègue ensuite à l’EJB pour l’exécution
du code spécifique
Richard Grin EJB page 9 Richard Grin EJB page 10

Exemple – un EJB Exemple – un client


@Remote
public interface Hello { public class Client {
public String ditHello(String nom); @EJB L’EJB est déclaré du
} private Hello ejbHello; type de l’interface

public void m(){


@Stateless
public class HelloBean implements Hello { ...
public String ditHello(String nom){ String s = ejbHello.ditHello(unNom);
return "Hello, " + nom; ...
} }
} Même si la classe a d’autres méthodes publiques, }
elles ne seront pas utilisables par les clients de l’EJB
Richard Grin EJB page 11 Richard Grin EJB page 12

2
Interface « Remote » Interface locale
 L’interface doit être annotée avec @Remote pour
que ses méthodes soient utilisables à distance  Si l’interface n’est pas annotée par @Remote, elle
 Le passage des paramètres de type non primitif se est locale
fera en copiant les valeurs des objets  L’EJB n’est alors accessible que depuis la JVM
(sérialisation) où il s’exécute
 Meilleures performances car
 ne passe pas par le réseau

 les objets passés en paramètre et en retour


des méthodes sont passés par référence,
sans sérialisation
Richard Grin EJB page 13 Richard Grin EJB page 14

No-interface view
 Un EJB session peut ne pas implémenter
d’interface
 En ce cas, c’est comme si toutes les méthodes
public de l’EJB était exposées dans une Types d’EJB
interface locale
 @Stateless
public class HelloBean {
public String ditHello(String nom){
return "Hello, " + nom;
}
} La méthode ditHello peut être appelée par les clients de l’EJB
Richard Grin EJB page 15 Richard Grin EJB page 16

Types d’EJB Classe d’un EJB session


 EJB session  public, pas final ni abstract
 sans état  Un constructeur public sans paramètre
 avec état  Les arguments et les valeurs de retour des
 singleton méthodes « remote » doivent être des types RMI
 EJB dirigé par les messages (Message-Driven
(types primitifs ou sérialisables)
Bean, MDB) – pas étudié dans ce cours
Dans les exemples précédents d’EJB, pas
de constructeur public sans paramètre.
Erreur ?

Richard Grin EJB page 17 Richard Grin EJB page 18

3
Création d’un EJB session Exemple
 Créé par le container avec le constructeur sans @Stateless
public class EJB1 {
paramètre
@EJB
 Le constructeur n’est pas assuré que les
private EJB2 autreEJB;
injections de dépendances ont été faites
 Une méthode de l’EJB annotée par @PostConstruct
@PostConstruct permet d’initialiser le bean ; public void init(){
elle est appelée par le container juste après la // Initialisation qui utilise autreEJB
création du bean, quand toutes les injections ont ...
été faites }
}

Richard Grin EJB page 19 Richard Grin EJB page 20

Suppression d’un EJB session EJB session sans état (1)


 Une méthode annotée par @PreDestroy est  Pour exécuter une tâche avec une seule méthode
exécutée juste avant la suppression de l’EJB par  L’interaction avec le client commence par l’appel
le container d’une méthode et se termine avec la fin de la
 Elle permet de libérer les ressources acquises méthode
par l’EJB  Un bean session ne conserve aucune information
entre 2 appels de méthode  les informations
nécessaires au traitement doivent être passées en
paramètre des méthodes
 Exemple d’utilisation : afficher le solde du compte
du client numéro 1345567
Richard Grin EJB page 21 Richard Grin EJB page 22

EJB session sans état (2) EJB session avec état (1)
 Fait partie d’un pool dont les instances sont  Pour exécuter une tâche qui nécessite plusieurs
affectées aux clients au fur et à mesure des appels de méthode à des moments différents
besoins  Peut conserver des informations entre 2 appels
 Annoté avec @Stateless : de méthode
@Stateless  Correspond à une conversation entre un client et
public class HelloBean implements Hello { le serveur
public String ditHello(String nom){
 La conversation commence au moment où le
return "Hello, " + nom;
} client obtient une référence à l’EJB et se termine
} lorsque le client abandonne cette référence
 Ne peut être partagé entre 2 clients
Richard Grin EJB page 23 Richard Grin EJB page 24

4
EJB session avec état (2) Supprimer un EJB avec état
 Exemple : gestion d’un caddy qui contient les  Il est bon de supprimer un EJB avec état
produits achetés par un client pendant la session lorsqu’on n’en a plus besoin (sinon, il est
 Annoté avec @Stateful supprimé au bout d’un certain temps)
 Pour cela il faut invoquer une méthode annotée
par @Remove

Qui va supprimer l’EJB ?

Richard Grin EJB page 25 Richard Grin EJB page 26

Passivation d’un EJB session avec état Accès concurrents


 « 1 client – 1 EJB session avec état »  il peut
 Les accès concurrents à un EJB session avec ou
exister de nombreux beans à un moment donné
sans état sont mis en attente donc le développeur
 Pour faire de la place en mémoire le container peut n’a pas à s’occuper des problèmes liés aux accès
sérialiser l’EJB sur disque (passivation) et le concurrents
recréer en mémoire plus tard (activation) ; la classe
doit donc être sérialisable
 Les ressources non sérialisées utilisées par le
bean doivent être acquises à l’activation et fermées
à la passivation avec les méthodes annotées par
@PostActivate et @PrePassivate

Richard Grin EJB page 27 Richard Grin EJB page 28

EJB singleton Appel asynchrone d’une méthode


 Instancié une seule fois par container EJB
 Il est interdit à un EJB de créer des threads mais il
 Annoté avec @Singleton est possible d’annoter une méthode d’un bean
 Peut être instancié au déploiement de session par @Asynchronous
l’application (intéressant si long à initialiser)  La méthode sera exécutée en parallèle dans un
(@Startup) thread géré par le container
 En ce cas, si une méthode de ce singleton est  Intéressant pour les méthodes longues à exécuter
annotée par @PostConstruct, elle est exécutée comme les envois d’emails ou les impressions
au déploiement de l’application
 On peut indiquer le comportement pour les accès
concurrents (mis en attente par défaut)
Richard Grin EJB page 29 Richard Grin EJB page 30

5
Définition
 Au lieu de créer un objet, on peut demander à
l’environnement d’exécution (container) de le
fournir (de l’« injecter »)
Injection  Injection par annotation ou par une déclaration
dans un fichier XML

Richard Grin EJB page 31 Richard Grin EJB page 32

Injection CDI ou non Injection d’EJB


 La spécification EJB permet d’injecter des beans  @EJB injecte un EJB dans une classe gérée par
ou des ressources : un container :
@EJB et @Resource (il y a d’autres annotations) public class MaClasse {
@EJB
 La spécification CDI (Contexts and Dependency private InterfaceEJB monEjb;
Injection) permet aussi l’injection
 Elle offre plus de fonctionnalités ; en particulier
les objets injectés par CDI ont une portée
 Une seule annotation pour CDI : @Inject

Richard Grin EJB page 33 Richard Grin EJB page 34

Injection de ressource Injection avec CDI - @Inject


 @Resource pour injecter une source de données  @Inject
mais aussi pour d’autres types de ressources A a;
comme un serveur d’email fournit une instance d’une classe qui a le type A ;
 Exemple : A est une classe ou une interface Java
@Resource(name="jdbc/mabd")  Si une instance de A existe déjà (voir « portée »),
private DataSource source; l’instance existante est fournie au code
 On verra d’autres injections pour travailler avec  Sinon, une nouvelle instance est créée par le
des bases de données quand on étudiera JPA container et fournie au code
 Si plusieurs classes ou aucune classe n’a le type
A, il y aura une erreur
Richard Grin EJB page 35 Richard Grin CDI 36

6
Portée CDI Portées CDI
 Requête HTTP : @RequestScoped
 Un objet injecté a une portée (requête, session,…)
 Vue : @ViewScoped
qui définit la durée de vie de l’objet
 Session : @SessionScoped
 Par exemple, un objet injecté de portée requête
 Application : @ApplicationScoped
 est créé pendant le traitement d’une requête
HTTP d’un client, la 1ère fois qu’il y a injection  Conversation : @ConversationScoped ; la

 est détruit quand la réponse à la requête est


portée est explicitement définie par le code
(begin() pour commencer, end() pour finir)
envoyée au client
 Flot : @FlowScoped ; ensemble de pages JSF
 La portée est définie par une annotation de la
classe de l’objet injecté  Dépendant (portée par défaut) : @Dependent ;
une nouvelle instance est toujours injectée
Richard Grin EJB page 37 Richard Grin CDI 38

Qu’est-ce qui peut être injecté par CDI ? CDI - @Named


 Presque toutes les classes Java (pas une classe  Permet de donner un nom « EL » (Expression
interne non static) Language) de JSF au bean annoté
@Named
 La classe doit avoir un constructeur sans
@RequestScoped
paramètre (ou annoté par @Inject) public class Bean { … }
 Les pages JSF pourront ainsi utiliser une
référence au bean :
<h:inputText value="#{bean.nom} " />

Valeur de la propriété nom


du bean
Richard Grin CDI 39 Richard Grin CDI 40

Interface javax.ejb.EJBContext
 Interface d’un EJB avec le contexte extérieur
 Interface fille SessionContext pour les EJB
session
Contexte des EJB

Richard Grin EJB page 41 Richard Grin EJB page 42

7
Exemple d’utilisation
 Nom de l’utilisateur qui est actuellement connecté :
@Resource
private SessionContext context;

Transactions dans les EJB


...
public void m(...) {
String user =
context.getCallerPrincipal().getName();
...

Fonctionne si la façon standard a été utilisée


pour authentifier l’utilisateur

Richard Grin EJB page 43 Richard Grin EJB page 44

2 types CMT
 Les transactions peuvent être gérées  Le développeur indique ce que doit faire le
 par le container (CMT : Container Managed container avec les transactions au moment de
Transaction) l’appel d’une méthode
 par le bean (BMT)  Indiqué par une annotation ou dans un fichier XML

 Par défaut elles sont gérées par le container


 L’EJB gère les transactions lui-même s’il est
Appel de Que doit faire le
annoté par
container quand
@TransactionManagement(TransactionMan method-A method-B est
agementType.BEAN) appelée ?

Richard Grin EJB page 45 Richard Grin EJB page 46

CMT avec annotation Exemple


@TransactionAttribute(NOT_SUPPORTED)
 Annoter les classes ou les méthodes avec
@Stateful
@TransactionAttribute
public class Bean1 {
 Annotation sur une classe : valeur par défaut pour ...
les méthodes de la classe
@TransactionAttribute(REQUIRES_NEW)
public void methode1() {...}

public void methode3() {...}


}

Richard Grin EJB page 47 Richard Grin EJB page 48

8
NEVER NOT_SUPPORTED
 Si le client appelle la méthode avec une
 Toute transaction en cours est suspendue
transaction en cours, une exception est levée
pendant l’exécution de la méthode
 Pour une méthode qui ne comporte que des
Cas 1 : « select » pour des entités qui ne sont pas
modifiées (meilleures performances)

Cas 2 :

flèche noire : pas de transaction en cours, flèche bleue : une


transaction en cours (container indiqué en gris foncé)
Richard Grin EJB page 49 Richard Grin EJB page 50

SUPPORTS REQUIRED
 Le bean peut supporter une transaction s’il y en a  Une nouvelle transaction est créée par le container
une mais peut fonctionner sans si aucune n’est en cours ; si une transaction est
 Pour une méthode qui ne comporte que des
en cours, elle est utilisée par la méthode
« select », pour des entités éventuellement  Valeur par défaut
modifiées dans une des méthodes appelantes

flèche rouge : une nouvelle transaction créée par le container


Richard Grin EJB page 51 Richard Grin EJB page 52

REQUIRES_NEW MANDATORY
 Une nouvelle transaction est toujours créée par le  Une exception est levée si aucune transaction
container pour cette méthode n’est en cours au moment de l’appel de la
 Pour une méthode qui veut être sure que ses méthode
modifications sont validées ou non à la fin de son
exécution

Richard Grin EJB page 53 Richard Grin EJB page 54

9
Nouvelle transaction en CMT Appel d’une autre méthode de l’EJB
 C’est la méthode qui a démarré une transaction qui
 Attention, ce qu’on vient de voir nécessite
la termine
l’interception du container, par exemple pour
 Au retour de la méthode le container la termine démarrer une nouvelle transaction
 par un rollback  Si une méthode d’un EJB appelle une autre
— si une exception « système » ou une exception méthode du même EJB par « this », le container
« application, avec rollback » a été levée n’intervient pas !
— si la transaction a été marquée comme
annulée (setRollbackOnly)
 par un commit sinon

Richard Grin EJB page 55 Richard Grin EJB page 56

Marquer une transaction comme annulée BMT


 Si une méthode veut un rollback sans lever
 On choisit cette option quand on veut plus de
d’exception, elle marque la transaction en cours
précision ou de liberté dans la gestion des
comme annulée en appelant la méthode
transactions
setRollbackOnly()
de SessionContext (injecté par @Resource)  Par exemple, si on veut des délimitations de
transactions qui ne correspondent pas aux débuts
et fins de méthodes
 Transactions représentées par l’interface
UserTransaction (injectée par @Resource)

Richard Grin EJB page 57 Richard Grin EJB page 58

RemoteException
 Exception contrôlée par le compilateur (classe
fille de IOException) liée aux erreurs réseau
Exceptions dans les EJB

Richard Grin EJB page 59 Richard Grin EJB page 60

10
EJBException 2 types d’exception
 Exception « runtime » (pas contrôlée par le  Exception liée au fonctionnement de l’application ;
compilateur) dédiée aux problèmes sur les EJB un compte bancaire qui n’est pas suffisamment
approvisionné pendant un retrait d’argent
 Prévient qu’un problème inattendu n’a pas permis
 Exception système ;
l’exécution normale de la méthode
problème dans le fonctionnement du SGBD ou du
réseau ; absence d’une ressource indispensable
au traitement ;
EJBException en est une
 Traitées différemment par le container d’EJB

Richard Grin EJB page 61 Richard Grin EJB page 62

Exception d’application Exception système


 Le container laisse passer une exception  Le container attrape les exceptions système, et
d’application et ne fait rien de spécial  lance un rollback

 Il ne lance pas un rollback, sauf si l’exception est  met l’exception dans les log du serveur

annotée par  enveloppe l’exception dans une EJBException


@ApplicationException(rollback=true)  l’EJB est abandonné par le container
 Le client de la méthode qui a lancé l’exception
peut ainsi attraper l’exception et essayer de
réparer le problème

Richard Grin EJB page 63 Richard Grin EJB page 64

Répartition des exceptions


 Les exceptions contrôlées par le compilateur sont
des exceptions d’application
 Les exceptions non contrôlées et les Compléments
RemoteException sont des exceptions système,
sauf si elles sont annotées par
@javax.ejb.ApplicationException

Richard Grin EJB page 65 Richard Grin EJB page 66

11
 L’utilisation de java.io est interdite dans un EJB ;
cette restriction est levée dans EJB 3.2 (mais il
faut l’utiliser « avec précaution »)
 La sécurité est traitée dans un support à part

Richard Grin EJB page 67

12

Vous aimerez peut-être aussi