Différence entre @Stateless et @Singleton
Je suis ce tutoriel qui utilise également un EJB:
package exercise1;
import java.util.Random;
import javax.ejb.Stateless;
import javax.inject.Named;
@Stateless
public class MessageServerBean {
private int counter = 0;
public String getMessage(){
Random random = new Random();
random.nextInt(9999999);
int myRandomNumber = random.nextInt();
return "" + myRandomNumber;
}
public int getCounter(){
return counter++;
}
}
Voici un exemple de sortie:
Bonjour de Facelets
Le Message est: 84804258
Compteur: 26
Serveur de messages Bean est: exercise1.MessageServerBean@757b6193
Voici mon observation:
- Quand j'ai mis le bean
@Stateless
je reçois toujours le même ID de l'objet et le compteur incrémente toujours. - Quand j'ai mis le bean
@Stateful
- je obtenir une nouvelle instance à chaque fois que j'actualise la page. - Quand je l'ai mis à
@Singleton
- je obtenir les mêmes résultats que lorsque je l'ai mis à@Stateless
: même ID de l'objet, compteur d'incrémentation.
Donc, ce que je voudrais comprendre, c'est: quelle est la différence entre @Stateless
et @Singleton
des Ejb dans ce cas-là?
Vous devez vous connecter pour publier un commentaire.
Vous voyez la même sortie, car il n'est qu'un client qui accède au EJB à la fois. Le serveur d'application est en mesure de recycler les mêmes apatrides objet d'EJB pour chaque appel. Si vous essayez un accès simultané – plusieurs clients en même temps vous verrez de nouveaux apatrides instances figurant.
Noter que, selon la charge du serveur, même deux fois de suite les appels de méthode sont fabriqués par le même client peut se retrouver dans différents EJB stateless objets!
Pour un EJB singleton, il n'y aura pas de différence – il y a toujours qu'une instance par l'application, n'importe comment beaucoup de clients essayez d'y accéder.
@Stateless public class MyBean { @EJB MyBean bean; public void test() { System.out.println(this + ".test"); bean.test2(); } public void test2() { System.out.println(this + ".test2"); } }
Selon la La Documentation D'Oracle:
Singletons ne peut pas être passivé:
La documentation explique lors de l'utilisation de chaque type de haricot, et Singleton haricots sont les suivantes:
Ainsi, par votre exemple, il n'y a pas de différence entre les deux annotations.