Разница между @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
Компонент сервера сообщений: exercise1.MessageServerBean@757b6193
вот мое наблюдение:
- когда я устанавливаю боб как
@Stateless
Я всегда получаю один и тот же идентификатор объекта, а счетчик всегда увеличивается. - когда я устанавливаю боб как
@Stateful
Я получаю новый экземпляр каждый раз, когда я обновите страницу. - когда я установил его в
@Singleton
Я получаю те же результаты, что и при установке@Stateless
: тот же идентификатор объекта, счетчик приращений.
Итак, что я на самом деле хотел бы понять: в чем разница между @Stateless
и @Singleton
EJBs в этом самом случае?
2 ответов
вы видите тот же вывод, потому что есть только один клиент, обращающийся к EJB одновременно. Сервер приложений может повторно использовать один и тот же объект EJB без состояния для каждого вызова. Если вы попробуете одновременный доступ-несколько клиентов одновременно-вы увидите новые экземпляры без состояния.
обратите внимание, что в зависимости от загрузки сервера даже два последовательных вызова метода, сделанные одним и тем же клиентом, могут оказаться в разных объектах EJB без состояния!
для a singleton EJB, нет никакой разницы – всегда есть только один экземпляр для каждого приложения, независимо от того, сколько клиентов пытаются получить к нему доступ.
по словам Документация Oracle:
одноэлементные сеансовые компоненты предлагают аналогичную функциональность для безгосударственных сеансовых компонентов, но отличаются от них тем, что существует только один одноэлементный сеансовый компонент для каждого приложения, в отличие от пула безгосударственных сеансовых компонентов, любой из которых может отвечать на запрос клиента. Как и компоненты сеанса без состояния, одноэлементные компоненты сеанса могут реализовывать конечные точки веб-службы.
синглтоны не может быть предже:
Как безгосударственный компонент сеанса, одноэлементный компонент сеанса никогда не пассивирован и имеет только две стадии, несуществующие и готовые к вызов бизнес-метода(...)
документация объясняет когда использовать каждый вид зерен, а Singleton beans имеет следующее:
один корпоративный компонент должен быть доступен несколькими потоками одновременно.
в приложению необходим корпоративный компонент для выполнения задач приложение Startup и shutdown.
Итак, для вашего примера нет никакой разницы между двумя аннотациями.