Управление сеансами Java EE между сетью и уровнем EJB - PullRequest
2 голосов
/ 21 сентября 2009

У меня есть приложение Java EE, состоящее из 1 веб-модуля и 1 EJB-модуля. Внутри моего EJB-модуля у меня есть сессионный компонент с состоянием, содержащий мою бизнес-логику.

Что бы я хотел:

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

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

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

1 Ответ

3 голосов
/ 21 сентября 2009

Stateful Sessions не всегда хороший выбор, иногда проще использовать постоянство в БД.

В сервлете, обрабатывая запрос от пользователя, получите «дескриптор» вашей SFSB. Поместите эту «ручку» в вашу HttpSession. Теперь, когда приходит следующий запрос для этого пользователя, у вас есть готовый дескриптор.

С EJB 3.0 сделайте это так.

Объявите ссылку на bean-компонент с помощью @EJB в области видимости, это установит ссылку, которую вы будете использовать позже

@EJB 
(name=“CounterBean", beanInterface=Counter.class)
public class MyStarterServlet …

Когда вы обрабатываете запрос: обращайтесь к EJB, используя JNDI и объявленное имя компонента, обратите внимание, что этот код находится в вашем методе doGet () и / или doPost (), переменная "counter" должна быть локальной (в стеке ), поскольку объект сервлета распределяется между большим количеством запросов одновременно.

Context ctx = new InitialContext(); 
Counter counter = (Counter)
ctx.lookup(“java:comp/env/CounterBean”);
counter.increment();

Сохранение интерфейса в объекте HttpSession для извлечения при необходимости

session.setAttribute(“counter”, counter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...