Сессионные компоненты без состояния (SLSB) не привязаны к одному клиенту, и нет гарантии для одного клиента, чтобы он получал один и тот же экземпляр при каждом вызове метода (некоторые контейнеры могут создавать и уничтожать bean-компоненты при каждом сеансе вызова метода, это решение, зависящее от реализации, но экземпляры обычно объединяются в пул (и я не упоминаю кластерные среды). Другими словами, хотя bean-компоненты без сохранения состояния могут иметь переменные экземпляра, эти поля не являются специфичными для одного клиента, поэтому
не полагайтесь на них между удаленными вызовами.
Напротив, Stateful Session Bean (SFSB) выделен одному клиенту за всю их жизнь, нет обмена или объединения экземпляров (его можно удалить из памяти после пассивации для экономии ресурсов, но это другая история) и поддерживать разговорное состояние . Это означает, что переменные экземпляра компонента могут хранить данные относительно клиента между вызовами методов. И это позволяет иметь взаимозависимые вызовы методов (изменения, сделанные одним методом, влияют на последующие вызовы методов). Многоэтапные процессы (процесс регистрации, корзина покупок, процесс бронирования ...) являются типичными сценариями использования SFSB.
Еще одна вещь. Если вы используете SFSB, вы должны избегать внедрения их в многопоточные классы, такие как Servlets и управляемые bean-компоненты JSF (вы не хотите, чтобы он был общим для всех клиентов). Если вы хотите использовать SFSB в своем веб-приложении, вам нужно выполнить поиск JNDI и сохранить возвращенный экземпляр EJB в объекте HttpSession
для будущей деятельности. Примерно так:
try {
InitialContext ctx = new InitialContext();
myStateful = (MyStateful)ctx.lookup("java:comp/env/MyStatefulBean");
session.setAttribute("my_stateful", myStateful);
} catch (Exception e) {
// exception handling
}