Разница между @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 в этом случае?
Ответы
Ответ 1
Вы видите тот же результат, потому что только один клиент обращается к EJB за раз. Сервер приложений может перерабатывать один и тот же объект EJB без сохранения состояния для каждого вызова. Если вы одновременно используете одновременный доступ - несколько клиентов, вы увидите новые экземпляры без состояния.
Обратите внимание, что в зависимости от нагрузки на сервер даже два последовательных вызова метода, сделанные одним и тем же клиентом, могут оказаться в разных объектах EJB без состояния!
Для одноэлементного EJB не будет никакой разницы - всегда существует только один экземпляр для каждого приложения, независимо от того, сколько клиентов пытается получить к нему доступ.
Ответ 2
Согласно Документация Oracle:
Синглтон-сессия beans предлагает аналогичную функциональность для сеанса без состояния beans, но отличается от них тем, что для каждого приложения существует только один однострочный сеанс bean, а не пул безстоящего сеанса beans, любой из которых может отвечать на запрос клиента. Подобно сеансу безстоящих состояний beans, singleton session beans может реализовывать конечные точки веб-сервиса.
Синглеты не могут быть пассивированы:
Как сеанс без состояния bean, сеанс singleton bean никогда не выполняется пассивирован и имеет только два этапа, несуществующие и готовые к вызов бизнес-методов (...)
В документации объясняется когда нужно использовать каждый вид bean, а Singleton beans имеет следующее:
Для одного предприятия bean требуется доступ несколькими потоками одновременно.
Приложению требуется предприятие bean для выполнения задач при запуск и завершение работы приложения.
Итак, для вашего примера нет никакой разницы между двумя аннотациями.