Un Ejb Stateless qui se comporte comme unEjb Stateful
Bonjour,
Comment se fait-il qu'un EJB Stateless se comporte comme un EJB Stateful ?
Normalement entre deux appels de méthodes, l'EJB stateless devrait perdre la mémoire !
Or le cumul se fait parfaitement.
Pire, le même EJB utilisé dans une servelet se comporte de la même façon, le cumul se fait là aussi !
Franchement j'ai du mal à comprendre !
Si quelqu'un pouvait éclairer ma lanterne, il serait le bienvenu !
Le contexte technique :
Jboss 5.1, Eclipse Hellios
Ci-dessous le code de l'EJB stateless et son utilisation dans un JFrame.
L'interface de l'EJB :
package pkgCumul;
import javax.ejb.Remote;
@Remote
public interface CumulerRemote {
public void addition();
public void soustraction();
public void produit();
public void division();
public float getCumul();
public void setNb1(float _nb1);
public float getNb1();
public void destroy();
}
Le bean :
package pkgCumul;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
@Stateless(mappedName="CumulerRemote")
public class Cumuler implements CumulerRemote {
private float _nb1, _cumul;
private void setCumul(float _cumul) {
this._cumul = _cumul;
}
public float getCumul() {
return _cumul;
}
public void setNb1(float _nb1) {
this._nb1 = _nb1;
}
public float getNb1() {
return _nb1;
}
public Cumuler() {
setCumul(0);
}
public void addition(){
setCumul(getCumul() + getNb1() );
}
public void soustraction(){
setCumul(getCumul() - getNb1() );
}
public void produit(){
setCumul(getCumul() * getNb1() );
}
public void division(){
setCumul(getCumul() / getNb1() );
}
@PreDestroy
public void destroy(){
setCumul(0);
}
}
L'instanciation au chargement de la fenêtre :
public void windowOpened(java.awt.event.WindowEvent e) {
try{
Context ctx = new InitialContext();
unCumul = (CumulerRemote)ctx.lookup("CumulerRemote");
}
catch(NamingException ne){
JOptionPane.showMessageDialog(null, "Erreur sur initialisation de l'EJB");
}
}
Sur le clic du bouton Cumuler :
public void actionPerformed(java.awt.event.ActionEvent e) {
Effectuer_Calcul();
}
La procédure utilisant l'EJB :
private void Effectuer_Calcul(){
float nb1;
nb1 = Float.parseFloat(txtNb1.getText());
int operation = cbOperation.getSelectedIndex();
unCumul.setNb1(nb1);
switch (operation){
case 0 : unCumul.addition();
break;
case 1 : unCumul.soustraction();
break;
case 2 : unCumul.produit();
break;
case 3 : unCumul.division();
break;
}
lCumul.setText(String.valueOf(unCumul.getCumul()));
}