Diferencia entre @ Stateless y @Singleton


Estoy siguiendo este tutorial que también usa 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++;
    }    
}

Aquí hay un ejemplo de salida:


Hola desde Facelets
El mensaje es: 84804258
El contador es: 26
El Bean del servidor de mensajes es: exercise1.MessageServerBean @ 757b6193


Aquí está mi observación:

  • Cuando establezco el bean como @Stateless siempre obtengo el mismo ID de objeto y contador siempre incrementa.
  • Cuando establezco el bean como @Stateful obtengo una nueva instancia cada hora de actualizar la página.
  • Cuando lo establezco en @Singleton obtengo los mismos resultados que cuando lo establezco en @Stateless: mismo ID de objeto, contador incremental.

Entonces, lo que realmente me gustaría entender es: ¿cuál es la diferencia entre @Stateless y @Singleton EJBs en este mismo caso?

 23
Author: BalusC, 2013-01-22

2 answers

Está viendo la misma salida porque solo hay un cliente accediendo al EJB a la vez. El servidor de aplicaciones puede reciclar el mismo objeto EJB sin estado para cada llamada. Si prueba un acceso simultáneo (varios clientes al mismo tiempo), verá que aparecen nuevas instancias sin estado.

Tenga en cuenta que, dependiendo de la carga del servidor, incluso dos invocaciones consecutivas de métodos realizadas por el mismo cliente pueden terminar en diferentes objetos EJB sin estado!

Para un EJB singleton, no habrá diferencia: siempre hay una sola instancia por aplicación, sin importar cuántos clientes intenten acceder a ella.

 35
Author: gcvt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-22 19:12:05

De acuerdo con la Documentación de Oracle :

Los frijoles de sesión Singleton ofrecen una funcionalidad similar a los frijoles de sesión sin estado, pero difieren de ellos en que solo hay un frijol de sesión singleton por aplicación, a diferencia de un grupo de frijoles de sesión sin estado, cualquiera de los cuales puede responder a una solicitud de cliente. Al igual que los beans de sesión sin estado, los beans de sesión singleton pueden implementar endpoints de servicio web.

Los Singletones no pueden ser pasivados:

Como un frijol de sesión sin estado, un frijol de sesión único nunca es pasivado y tiene solo dos etapas, inexistente y listo para el invocación de métodos de negocio(...)

La documentación explica cuándo usar cada tipo de frijol , y los frijoles singleton tienen lo siguiente:

Se debe acceder a un solo enterprise bean mediante varios subprocesos simultáneamente.

La aplicación necesita un enterprise bean para realizar tareas aplicación arranque y apagado.

Por lo tanto, para su ejemplo no hay diferencia entre las dos anotaciones.

 28
Author: kauedg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-22 18:41:54