modifi par Richard Grin (version 1.1, 21/11/11) Plan du cours Introduction gnrale EJB : Les fondamentaux Introduction aux Session Beans Introduction aux Entity Beans Introduction aux Message-Driven Beans Concepts avancs sur la persistance Relations avec les Entity Beans Gestion des transactions 2 Session Bean : rappel Un Session Bean reprsente une action, un verbe, une logique mtier, un algorithme, Un enchanement de tches Exemples Saisie d'une commande, Compression vido, Gestion d'un caddy, d'un catalogue de produits, Transactions bancaires 3 types de beans sessions Sans tat : traite les tches qui peuvent tre accomplies en un seul appel de mthode ; pas dtat maintenu entre 2 appels de mthode Exemple : afficher la liste des comptes bancaires dun client Avec tat : est associ un seul client ; maintient un tat entre plusieurs appels de mthodes ; pour les tches accomplies en plusieurs tapes Exemple : remplir son caddy avec des articles dont les caractristiques sont affiches sur des pages diffrentes 3 types de beans sessions Singleton : quand on veut tre assur quil ny a quune seule instance du bean pour tous les utilisateurs de lapplication Exemple : cache dune liste de pays (pour amliorer les performances) Stateless Session Beans Le client passe toutes les donnes ncessaires au traitement lors de l'appel de mthode Le container est responsable de la cration et de la destruction du Bean Il peut le dtruire juste aprs un appel de mthode, ou le garder en mmoire pendant un certain temps pour rutilisation. Une instance de Stateless Session Bean n'est pas propre un client donn, elle peut tre partage entre chaque appel de mthode Le serveur maintient un pool de beans sans tat Exemple de bean sans tat package fr.unice.ejb.conversion; import java.math.BigDecimal; import javax.ejb.*; @Stateless public class ConvertisseurBean { private BigDecimal tauxEuro = new BigDecimal("0.0093016"); public BigDecimal yenVersEuro(BigDecimal yen) { BigDecimal val = yen.multiply(tauxEuro); return val.setScale(2, BigDecimal.ROUND_UP); } } Interface locale Si on ne fournit pas dinterface spar ConverterBean, il aura automatiquement linterface compose de sa mthode publique et il ne pourra tre utilis que par les composants qui sont dans le mme serveur dapplication Ce qui correspondra au code du transparent suivant Interface locale et implmentation @Local public interface Convertisseur { public BigDecimal yenVersEuro(BigDecimal yen); } @Stateless public class ConvertisseurBean implements Convertisseur { ... } Donner une interface locale explicite permet de ne pas exposer aux clients toutes les mthodes publiques du bean
Interface distante et implmentation Pour que le bean session soit utilisable par un composant situ sur un serveur dapplication, il faut lui ajouter une interface distante : @Remote public interface ConvertisseurDistant { public BigDecimal yenVersEuro(BigDecimal yen); } @Stateless public class ConvertisseurBean implements Convertisseur { ... }
Stateful Session Beans Certaines conversations se droulent sous forment de requtes successives. Exemple : un client surfe sur un site de e- commerce, slectionne des produits, remplit son caddy D'une requte HTTP l'autre, il faut un moyen de conserver un tat (le caddy par ex.) Stateful Session Beans En rsum, un Stateful Session Bean est utile pour maintenir un tat pendant la dure de vie du client au cours d'appels de mthodes successifs. Au cours de transactions successives. Si un appel de mthode change l'tat du Bean, lors d'un autre appel de mthode l'tat sera disponible. Consquence : une instance de Stateful Session Bean par client. Exemple de bean avec tat @Stateful @StatefulTimeout(300000) // 5 minutes public class CaddyEJB { private List<Item> caddy = new ArrayList<Item>(); public void addItem(Item item) { ... } @Remove public void checkout() { caddy.clear(); } ... } Problme de ressource Le client entretient une conversation avec le bean, dont l'tat doit tre disponible lorsque ce mme client appelle une autre mthode. Problme si trop de clients utilisent ce type de Bean en mme temps. Ressources limites (connexions, mmoire, sockets) Mauvaise scalabilit du systme, L'tat peut occuper pas mal de mmoire Passivation / Activation Passivation : pour conomiser la mmoire, le serveur dapplication peut retirer temporairement de la mmoire centrale les beans sessions avec tat pour les placer sur le disque Activation : le bean sera remis en mmoire ds que possible quand les clients en auront besoin Pendant la passivation il est bon de librer les ressources utilises par le bean (connexions avec la BD par exemple) Au moment de lactivation, il faut alors rcuprer ces ressources Activation/Passivation callbacks Lorsqu'un bean va tre mis en passivation, le container peut lavertir (@PrePassivate) Il peut librer des ressources (connexions) Idem lorsque le bean vient d'tre activ (@PostActivate) Accs concurrents Le code des beans session na pas besoin dtre thread-safe puisque le container ne permettra jamais laccs par plusieurs requtes Ca nest pas ncessairement le cas pour les EJB singletons (configurable) ; on peut laisser le container grer la concurrence en donnant des annotations (@Lock ou @ConcurrencyManagement)