2010-01-17 3 views

ответ

9

Термин "государство" в этом контексте немного вводит в заблуждение. Речь идет о состоянии разговоров, что означает, что если клиент делает несколько вызовов, сессионный компонент не знает. Представьте последовательность вызовов:

  • reserveSeatsOnFlight();
  • chooseMealPreference();
  • confirmBooking().

У вас есть диалоговое состояние, то есть второй вызов должен быть сделан для одного и того же компонента в качестве первого вызова или просто не имеет смысла. Это то, что делают счётчики состояния.

Абоненты без состояния могут иметь переменные экземпляра, но они по существу глобальны. Если у вас есть пул сессионных компонентов без состояния (которые вы можете или не можете в зависимости от того, что решит контейнер), эти экземпляры могут иметь или не существовать от одного вызова к другому. Поэтому обычно избегайте переменных экземпляра. Существуют и другие механизмы для такого рода вещей.

Позвольте привести пример. Представьте себе, этот вызов в сессионном компоненте:

public void bookFlight(List<Passsenger> passengers, FlightNumber flight, Date date) { 
    ... 
} 

, если положить в переменном экземпляре, чтобы подсчитать количество заказов и увеличивать его при каждом вызове затем последующие вызовы могут назвать различные бобы так будет видеть разные значения. Это то, что я имею в виду, не обязательно имеет смысл.

Так возвращаясь к первому примеру, один способ справиться с этим было бы передать состояние обратно вызывающему:

public interface ReservationSystem { 
    public int createNewBooking(); 
    public int reserveSeatsOnFlight(int bookingId, int seats); 
    public int chooseMealPreference(int bookingId, ...) 
    ... 
} 

Посмотрите, как не выше, чем дольше не имеет диалоговое состояние? Ну, да, но теперь он заключен в bookingId, который вы проходите. Асинхронный сеансовый компонент может получить заказ и продолжить с того места, где еще остался.

1

Я часто видел, что факсимильные сессии без использования состояния используют локальные переменные как способ поддержания «глобального» состояния в компоненте (во избежание обременительной задачи передачи данных из одного вызова метода внутри объекта в другой).

Сказав это, это по существу глобальные переменные в вашем объекте, и они могут злоупотреблять (как и в большинстве случаев, которые я видел). Я бы рекомендовал их избегать.

Могут быть случаи, когда они полезны, хотя ... у вас есть конкретная информация об использовании?

1

Бит статута может иметь переменные экземпляра, такие как любой другой объект. Он просто не может использовать их для поддержания значений, специфичных для конкретного клиента ...

0

Что касается хранения конечных переменных final, которые инициализируются при запуске SLSB (т. Е. В конструкторе). Я имею в виду атрибут DAO, который конкретизируется в конструкторе SLSB, например, так:

@Stateless 
    public class MyStatelessBean() {  
    private final CustomerDAO customerDAO; 

     public MyStatelessBean() { 
       // Initialization code goes here 
       this.customerDAO = new CustomerDAO(); 
     } 
    ... 
    } 

Так DAO можно использовать непосредственно в методах SLSB, и не должен быть создан каждый раз в DAO подбирается. Разумеется, что DAO является апатридом, что обычно имеет место. Разумеется, соединения с базой данных будут предоставляться по требованию и никогда не будут храниться в самом SLSB.

Смежные вопросы