Подтвердить что ты не робот

Разница между @Stateless и @Singleton

Я следую этому руководству, в котором также используется 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++;
    }    
}

Вот пример вывода:


Привет от Facelets
Сообщение: 84804258 Счетчик: 26
Сервер сообщений Bean: [email protected]


Здесь мое наблюдение:

  • Когда я устанавливаю Bean как @Stateless, я всегда получаю тот же идентификатор объекта, и счетчик всегда увеличивается.
  • Когда я устанавливаю Bean как @Stateful, я получаю новый экземпляр при каждом обновлении страницы.
  • Когда я устанавливаю его в @Singleton, я получаю те же результаты, что и когда я устанавливаю его в @Stateless: тот же идентификатор объекта, счетчик увеличивается.

Итак, что я действительно хотел бы понять: какая разница между @Stateless и @Singleton EJB в этом случае?

4b9b3361

Ответ 1

Вы видите тот же результат, потому что только один клиент обращается к EJB за раз. Сервер приложений может перерабатывать один и тот же объект EJB без сохранения состояния для каждого вызова. Если вы одновременно используете одновременный доступ - несколько клиентов, вы увидите новые экземпляры без состояния.

Обратите внимание, что в зависимости от нагрузки на сервер даже два последовательных вызова метода, сделанные одним и тем же клиентом, могут оказаться в разных объектах EJB без состояния!

Для одноэлементного EJB не будет никакой разницы - всегда существует только один экземпляр для каждого приложения, независимо от того, сколько клиентов пытается получить к нему доступ.

Ответ 2

Согласно Документация Oracle:

Синглтон-сессия beans предлагает аналогичную функциональность для сеанса без состояния beans, но отличается от них тем, что для каждого приложения существует только один однострочный сеанс bean, а не пул безстоящего сеанса beans, любой из которых может отвечать на запрос клиента. Подобно сеансу безстоящих состояний beans, singleton session beans может реализовывать конечные точки веб-сервиса.

Синглеты не могут быть пассивированы:

Как сеанс без состояния bean, сеанс singleton bean никогда не выполняется пассивирован и имеет только два этапа, несуществующие и готовые к вызов бизнес-методов (...)

В документации объясняется когда нужно использовать каждый вид bean, а Singleton beans имеет следующее:

Для одного предприятия bean требуется доступ несколькими потоками одновременно.

Приложению требуется предприятие bean для выполнения задач при запуск и завершение работы приложения.

Итак, для вашего примера нет никакой разницы между двумя аннотациями.