web-dev-qa-db-fra.com

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
Le compteur est: 26
Le bean de serveur de messages est: exercice1.MessageServerBean@757b6193


Voici mon observation:

  • Lorsque j'ai défini le bean sur @Stateless J'obtiens toujours le même ID d'objet et le compteur incrémente toujours.
  • Lorsque j'ai défini le bean sur @Stateful J'obtiens une nouvelle instance chaque fois que je rafraîchis la page.
  • Lorsque je l'ai défini sur @Singleton J'obtiens les mêmes résultats que lorsque je l'ai défini sur @Stateless: même ID d'objet, incrémentation du compteur.

Donc, ce que j'aimerais vraiment comprendre, c'est: quelle est la différence entre @Stateless et @Singleton EJB dans ce cas précis?

30
godzillante

Vous voyez la même sortie car il n'y a qu'un seul client accédant à l'EJB à la fois. Le serveur d'applications peut recycler le même objet EJB sans état pour chaque appel. Si vous essayez un accès simultané - plusieurs clients en même temps - vous verrez apparaître de nouvelles instances sans état.

Notez que, selon la charge du serveur, même deux appels de méthode consécutifs effectués par le même client peuvent se retrouver dans des objets EJB sans état différents!

Pour un EJB singleton, il n'y aura aucune différence - il n'y a toujours qu'une seule instance par application, quel que soit le nombre de clients qui tentent d'y accéder.

40
gcvt

Selon le Oracle Documentation:

Les beans session singleton offrent des fonctionnalités similaires aux beans session sans état, mais diffèrent d'eux en ce qu'il n'y a qu'un seul bean session singleton par application, par opposition à un pool de beans session sans état, chacun pouvant répondre à une demande du client. Comme les beans session sans état, les beans session singleton peuvent implémenter des points de terminaison de service Web.

Singletons ne peut pas être passivé:

Comme un bean session sans état, un bean session singleton n'est jamais passivé et ne comporte que deux étapes, inexistantes et prêtes pour l'invocation de méthodes métier (...)

La documentation explique quand utiliser chaque type de bean , et les beans Singleton ont les éléments suivants:

Un seul bean entreprise doit être accessible simultanément par plusieurs threads.

L'application a besoin d'un bean entreprise pour effectuer des tâches au démarrage et à l'arrêt de l'application.

Donc, pour votre exemple, il n'y a pas de différence entre les deux annotations.

35
kauedg