Разница между @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.

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