Бит состояния без состояния не поддерживают состояние. Значит ли это, что у них не должно быть переменных экземпляра?Java, сеанс сеанса без состояния
Спасибо,
Roger
Бит состояния без состояния не поддерживают состояние. Значит ли это, что у них не должно быть переменных экземпляра?Java, сеанс сеанса без состояния
Спасибо,
Roger
Термин "государство" в этом контексте немного вводит в заблуждение. Речь идет о состоянии разговоров, что означает, что если клиент делает несколько вызовов, сессионный компонент не знает. Представьте последовательность вызовов:
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
, который вы проходите. Асинхронный сеансовый компонент может получить заказ и продолжить с того места, где еще остался.
Я часто видел, что факсимильные сессии без использования состояния используют локальные переменные как способ поддержания «глобального» состояния в компоненте (во избежание обременительной задачи передачи данных из одного вызова метода внутри объекта в другой).
Сказав это, это по существу глобальные переменные в вашем объекте, и они могут злоупотреблять (как и в большинстве случаев, которые я видел). Я бы рекомендовал их избегать.
Могут быть случаи, когда они полезны, хотя ... у вас есть конкретная информация об использовании?
Бит статута может иметь переменные экземпляра, такие как любой другой объект. Он просто не может использовать их для поддержания значений, специфичных для конкретного клиента ...
Что касается хранения конечных переменных 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.