Les session beans

Transcription

Les session beans
Intérêt 1/2
• Un entity bean modélise une seule entité, et a une granularité fine ;
• Un ensemble d’entity bean ⇔ au modèle statique issue du diagramme des classes
d’un modèle objet ;
• Les session beans servent à modéliser l’aspect dynamique, ils permettent de faire :
• du suivi de session pour un client ;
Les session beans
• de faire interagir plusieurs entity bean ;
• d’offrir des services à un client par accès direct à la base de données (exp. :
obtenir une liste de produits pour un caddie virtuel).
client
Session bean
Entity bean
Base de
donnée
Benoît Charroux - Session Beans - Mars 00 - 2
1
Intérêt 2/2
• Les Session Beans sont utiles pour décharger le client :
• de l’écriture de code supplémentaire ;
• de modifications éventuelles dans le code de gestion des beans ;
• d’un trafic réseau supplémentaire car :
Stateless / Statefull
session bean
• le serveur prend à sa charge une partie du code du client ;
• le nombre de connections au serveur diminuent ;
• le nombre de stubs pour un client diminuent ;
• leurs états ne sont pas sauvegardés.
Benoît Charroux - Session Beans - Mars 00 - 3
2
Les Session Beans avec ou sans état
Statefull
Les Session Beans avec état
Stateless
MonSessionBean
MonSessionBean
Attribut
methode
methode
ejbCreate( Arg arg )
ejbCreate()
Un session bean avec état
Un session bean sans état
• Un session bean avec état :
• est une extension d’un client (sa durée de vie est celle du client) ;
• effectue un tâche pour un unique client en maintient un état conversationnel
Pas d’argument
comme la
méthode create
entre deux appels de méthodes ;
• a souvent besoin d’être initialisé ;
• est souvent utilisé pour faire du suivi de session pour un client.
Fait pour assurer le suivi
de la session d’un client.
Collection de méthodes
indépendantes assurant des
services pour un client.
Benoît Charroux - Session Beans - Mars 00 - 5
Benoît Charroux - Session Beans - Mars 00 - 6
3
Les Session Beans sans état
• un session bean sans état :
• a un ensemble de méthodes qui utilisent leurs seuls paramètres pour produire
un résultat (ils peuvent aussi utiliser leurs SessionContexts) ;
• peut être utilisé par plusieurs clients ;
• sa durée de vie peut dépasser celle d’un client : un client peut conserver une
connexion avec un objet EJB mais l’instance du bean peut servir plusieurs
clients ;
Développer un stateless
session bean
• peut avoir des variables d’instance par exemple pour déterminer le nombre
de fois où il a été appelé ou pour le débogage (cet état n’est jamais visible
pour le client car il ne sait jamais s’il a affaire à la même instance) ;
• il consomme peu de ressource.
Benoît Charroux - Session Beans - Mars 00 - 7
4
Développer un session bean 1/2
Les interfaces locales et distantes 2/2
-DYDLR6HULDOL]DEOH
• La classe qui définit un session bean doit :
-DYD[HME(QWHUSULVH%HDQ
• L’interface locale est utilisée par le client pour récupérer une référence sur un objet
EJB distant (sur le serveur) :
• la méthode create() retourne au client une référence distance et un stub.
• implémenter l’interface SessionBean ;
• être déclarée public ;
• ne peut pas être définie abstract ou final ;
• implémenter une ou plusieurs méthodes ejbCreate ;
• a un constructeur public sans paramètres ;
• ne doit pas définir une méthode finalize.
-DYDUPL5HPRWH
-DYD[HME6HVVLRQ%HDQ
HME$FWLYDWH
-DYD[HME(-%2EMHFW
-DYD[HME(-%+RPH
0RQ,QWHUIDFH'LVWDQWH
0RQ,QWHUIDFH/RFDOH
PHWKRGH
0RQ,QWHUIDFH'LVWDQWH
FUHDWH$UJDUJ
HME3DVVLYDWH
HME5HPRYH
VHW6HVVLRQ&RQWH[W
MonSessionBean
methode
ejbCreate( Arg arg )
Benoît Charroux - Session Beans - Mars 00 - 9
Fonctionnalités du
composant
Cycle de vie du
composant : création,
recherche, suppression.
Benoît Charroux - Session Beans - Mars 00 - 10
5
Exemple d’un bean créant une oeuvre diffusée à plusieurs exemplaires
public class MediathequeEJB implements SessionBean {
public void addOeuvre( String titre, String auteur, int nbExemplaires ) throws ...{
try {
Context initial = new InitialContext();
Object objref = initial.lookup( "Oeuvre" );
OeuvreHome homeOeuvre = ...narrow( ... ) ;
Oeuvre oeuvre = homeOeuvre.create( titre, auteur ) ;
objref = initial.lookup( "Exemplaire" );
ExemplaireHome homeExemplaire = ...narrow( ... ) ;
Exemplaire exemplaire ;
for( int i=0; i<nbExemplaires; i++ ){
exemplaire = homeExemplaire.create( titre, auteur, i ) ;
oeuvre.addExemplaire( exemplaire ) ;
}
}catch( DuplicateKeyException e ){
throw new OeuvreException( "oeuvre deja presente" ) ;
}catch( Exception e ){
throw new EJBException( e.toString() ) ;
}
}
Benoît Charroux - Session Beans - Mars 00 - 11
Les interfaces locales et distantes
• L’interface local :
public interface MediathequeHome extends EJBHome {
Mediatheque create() throws RemoteException, CreateException ;
}
• L’interface distante :
public interface Mediatheque extends EJBObject {
public void addOeuvre( String titre, String auteur, int nbExemplaires )
throws RemoteException, OeuvreException ;
}
• Exemple d’utilisation :
Context initial = new InitialContext();
Object objref = initial.lookup( "Mediatheque" );
MediathequeHome home = (MediathequeHome)PortableRemoteObject.narrow(
objref, MediathequeHome.class ) ;
Mediatheque mediatheque = home.create() ;
mediatheque.addOeuvre( "Don Juan", "Mozart", 3 ) ;
Benoît Charroux - Session Beans - Mars 00 - 12
6
Exemple d’un bean récupérant la liste des adhérents 1/2
public class UtilitairesEJB implements SessionBean {
Développer un
stateless session bean
accédant directement
à une base de données
public Vector getAdherents(){
try{
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/MediaDB");
Connection con = ds.getConnection();
String requete = "SELECT ALL * FROM \"AdherentEJBTable\"" ;
Statement stmt = con.createStatement() ;
ResultSet result = stmt.executeQuery( requete ) ;
Vector adherents = new Vector() ;
while( result.next() ){
adherents.addElement( result.getString("nom") ) ;
}
stmt.close() ;
con.close() ;
return adherents ;
} catch( Exception e ){
throw new EJBException( e.getMessage() ) ;
}
}
Benoît Charroux - Session Beans - Mars 00 - 14
7
Exemple d’un bean récupérant la liste des adhérents 2/2
Les interfaces locales et distantes
• L’interface local :
public class UtilitairesEJB implements SessionBean {
// …
public interface UtilitairesHome extends EJBHome {
Utilitaires create() throws RemoteException, CreateException ;
}
• L’interface distante :
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext sc) {}
public UtilitairesEJB() {}
}
Benoît Charroux - Session Beans - Mars 00 - 15
public interface Utilitaires extends EJBObject {
public Vector getAdherents() throws RemoteException ;
}
• Exemple d’utilisation :
Context initial = new InitialContext();
Object objref = initial.lookup( "Utilitaires" );
UtilitairesHome home = (UtilitairesHome)PortableRemoteObject.narrow ...
Utilitaires utilitaires = home.create() ;
Vector adherents = utilitaires.getAdherents() ;
for( int i=0; i<adherents.size(); i++ ){
System.out.println((String)adherents.elementAt(i));
}
Benoît Charroux - Session Beans - Mars 00 - 16
8
Le déploiement d’un sesssion bean (avec deploytool de j2ee) 1/2
Déployer un
stateless session bean
accédant à
une base de données
Benoît Charroux - Session Beans - Mars 00 - 18
9
Le déploiement d’un entity bean (avec deploytool de j2ee) 2/2
Le cycle de vie des
session beans
Benoît Charroux - Session Beans - Mars 00 - 19
10
L’utilisation d’un stateless session bean
Le cycle de vie d’un session Bean
• Le cycle de vie d’un session bean est géré par le conteneur et non pas par l’application.
Cycle de vie d’un stateless session bean
Benoît Charroux - Session Beans - Mars 00 - 21
Benoît Charroux - Session Beans - Mars 00 - 22
11
Le cycle de vie d’un session Bean
Création et suppression d’un stateful session bean
Cycle de vie d’un stateful session bean
Benoît Charroux - Session Beans - Mars 00 - 23
Benoît Charroux - Session Beans - Mars 00 - 24
12
Activation d’un stateful session bean
Utilitaires
Benoît Charroux - Session Beans - Mars 00 - 25
13
Obtenir une référence sur un session bean
• this ne peut pas être utilisée car le bean est distant ;
Accéder à une variable d’environnement
• Les variables d’environnement sont utiles pour adapter un composant sans
avoir à toucher au code :
• utiliser getEJBObject() :
public class EJB implements SessionBean{
Context initial = new InitialContext() ;
SessionContext context ;
public void setSessionContext( SessionContext context ){
this.context = context ;
Context env = (Context)initial.lookup( "java:comp/env" ) ;
Double var = (Double)env.lookup( "remise" ) ;
}
public void methode( Bean bean ){
bean.f( context.getEJBObject() ) ;
}
}
Benoît Charroux - Session Beans - Mars 00 - 27
Benoît Charroux - Session Beans - Mars 00 - 28
14