-
Les EJB de sessions avec état sont capables de maintenir une 'conversation' avec le client. En clair, si vous instanciez ce type d'Enterprise JavaBean dans une application, celle-ci accédera toujours à la même instance de l'EJB.
Afin d'illustrer ce comportement, nous allons réaliser dans ce chapitre un compteur dont voici les caractéristiques :
- Une propriété
valeur
- Une méthode
incremente()
- Une méthode
getValeur()
note : Le client devra pouvoir spécifier la valeur initiale du compteur.
Pour réaliser l'exemple de ce chapitre, créez, à la racine de "c:\java\dev", un répertoire "Compteur" dans lequel vous mettrez tous vos fichiers.
-
-
Notre interface distante va proposer deux méthodes : incremente() et getValeur().
CompteurSimple.java
|
1 2 3 4 5 6 7 8 9 10
11 12
|
package compteurs;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface CompteurSimple extends EJBObject {
public int getValeur() throws RemoteException;
public void incremente() throws RemoteException;
}
|
|
Java2html
|
-
Nous avons dit dans l'introduction de ce chapitre que le client de notre EJB pouvait spécifier la valeur d'initialisation du compteur. Ceci nous oblige à avoir deux constructeurs :
create() : Qui va initialiser notre compteur à zéro.
create(int valeur) : Qui va initialiser notre compteur avec la valeur passée en paramètre.
CompteurSimpleHome.java
|
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16
|
package compteurs;
import java.io.Serializable;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface CompteurSimpleHome extends EJBHome {
// Constructeur par défaut
CompteurSimple create() throws RemoteException, CreateException;
// Permet d'initialiser la valeur du compteur
CompteurSimple create(int valeur) throws RemoteException, CreateException;
}
|
|
Java2html
|
-
Etant donné que nous avons deux constructeurs déclarés : create() et create(int valeur) dans notre interface home, il nous faut déclarer et implémenter dans notre classe EJB : ejbCreate() et ejbCreate(int valeur).
Quand un client appellera une des méthodes create de l'interface home, JOnAS se chargera d'appeler la fonction ejbCreate() correspondante de l'EJB.
CompteurSimpleBean.java
|
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39
|
package compteurs;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.math.*;
import java.text.*;
import java.util.*;
public class CompteurSimpleBean implements SessionBean {
private int valeur;
// Valeur par défaut si l'utilisateur ne spécifie pas la valeur d'intitialisation
private static final int VALEUR_PAR_DEFAUT = 0;
public void incremente() {
valeur++;
}
public int getValeur() {
return valeur;
}
public void ejbCreate() {
this.valeur = VALEUR_PAR_DEFAUT;
}
public void ejbCreate(int valeur) {
this.valeur = valeur;
}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext sc) {}
}
|
|
Java2html
|
-
-
La seule chose qui va changer par rapport au descripteur de déploiement du précédent chapitre, ce sera la valeur de session-type qui devra être : Stateful.
| ejb-jar.xml |
|
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<description>Descripteur de déploiement du compteur</description>
<display-name>Compteur</display-name>
<enterprise-beans>
<session>
<description>Compteur simple</description>
<display-name>CompteurSimple</display-name>
<ejb-name>CompteurSimple</ejb-name>
<home>compteurs.CompteurSimpleHome</home>
<remote>compteurs.CompteurSimple</remote>
<ejb-class>compteurs.CompteurSimpleBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>CompteurSimple</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
|
-
| jonas-ejb-jar.xml |
|
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE jonas-ejb-jar PUBLIC "-//ObjectWeb//DTD JOnAS 2.4//EN" "http://www.objectweb.org/jonas/dtds/jonas-ejb-jar_2_4.dtd">
<jonas-ejb-jar>
<jonas-session>
<ejb-name>CompteurSimple</ejb-name>
<jndi-name>MyCompteurSimple</jndi-name>
</jonas-session>
</jonas-ejb-jar>
|
-
Aucune différence avec ce que l'on a vu dans le chapitre précédent. Voir le script à la fin de ce chapitre.
-
Aucune différence avec ce que l'on a vu dans le chapitre précédent. Voir le script à la fin de ce chapitre.
-
Nous allons faire ce que nous avons fait lors des exemples précédents à la différence que nous allons crée deux instances de l'EJB et que nous verrons comment évoluent leurs propriétés.
CompteurSimpleClient.java
|
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45
|
package compteurs;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.transaction.UserTransaction;
import javax.rmi.PortableRemoteObject;
public class CompteurSimpleClient {
public static void main(String args[]) {
try {
// Recherche de l'interface home de l'EJB
Context initialContext = new InitialContext();
Object objref = initialContext.lookup("MyCompteurSimple");
// Référence à l'interface locale de l'EJB
CompteurSimpleHome home = (CompteurSimpleHome)PortableRemoteObject.narrow(objref, CompteurSimpleHome.class);
// Compteur commencant à Zéro
CompteurSimple myCompteurSimple = home.create();
System.out.println("Création d'un compteur, valeur : " + myCompteurSimple.getValeur());
myCompteurSimple.incremente();
myCompteurSimple.incremente();
System.out.println("Après deux incrémentations, valeur : " + myCompteurSimple.getValeur());
System.out.println("-------------------");
// Compteur commencant à 10
CompteurSimple myCompteurSimple2 = home.create(10);
System.out.println("Création d'un compteur 10, valeur : " + myCompteurSimple2.getValeur());
myCompteurSimple2.incremente();
System.out.println("Après une incrémentation, valeur : " + myCompteurSimple2.getValeur());
} catch (Exception e) {
System.err.println("Erreur : " + e);
System.exit(2);
}
}
}
|
|
Java2html
|
-
Pour réaliser la compilation, le packaging et le déploiement, nous allons utiliser le script build.bat ( que vous trouverez dans les sources de ce chapitre ).
Ce script effectuera la compilation, le packaging, le déploiement de notre ejb ainsi que la compilation de notre client mais vous devrez ensuite éditer dans le fichier jonas.properties qui se trouve dans le répertoire "C:\java\plateforme\jonas\config" pour modifier la ligne jonas.service.ejb.descriptors et y ajouter compteurSimple.jar.
-
Déployons notre EJB et testons le avec notre application.
- cd c:\java\dev\compteur
- build
- jonas start
- cd C:\java\dev\build
- jclient compteurs.CompteurSimpleClient
Voici le résultat :
Création d'un compteur, valeur : 0
Après deux incrémentations, valeur : 2
-------------------
Création d'un compteur 10, valeur : 10
Après une incrémentation, valeur : 11
Après avoir récupéré une référence à notre interface home, on utilise cette référence pour créer deux instances de notre EJB : myCompteurSimple et myCompteurSimple2. La première utilise le constructeur par défaut et la seconde utilise utilise le deuxième constructeur en lui passant la valeur initiale du compteur.
On voit bien avec ce résultat que la valeur, qu'on modifie au cours des différents appels à nos méthodes, est gardée.
-
Comme nous l'avons vu dans l'exemple de ce chapitre, notre client crée un EJB et maintient un état conversationnel avec lui. L'Enterprise JavaBean est lié à notre client et lui est dédié tout le temps de son utilisation.
Un exemple classique d'utilisation de ce type d'EJB : le caddie virtuel que vous trouvez sur tous les sites de ecommerce. Ce caddie doit être lié à un client et à un seul mais il n'a pas besoin d'être stocké dans la base de données.
|
|