Запросить контекстную область для сессионных компонентов без сохранения состояния - PullRequest
3 голосов
/ 05 июня 2011

Существует ли контекст области запроса для сессионных компонентов EJB3? Моя среда Java-EE-5.

Этот пример

@Remote(SessionFacade.class) @Stateless
public class SessionFacadeBean implements SessionFacade {
  @EJB
  private Other bean;

  public void myBusinessMethod() {
     // TODO: get or create *myRequestScope*
     *myRequestScope*.put("demo", Integer.valueOf( 1 ));
     bean.otherBusinessMethod();
     sysout(*myRequestScope*.get("demo"));
  }
}

@Local(Other.class) @Stateless
public class OtherBean implements Other {
  public void otherBusinessMethod() {
     // TODO: get or create *myRequestScope*
     *myRequestScope*.put("demo", Integer.valueOf( 2 ));
  }
}

всегда должен выводить «2» при вызове SessionFacadeBean # myBusinessMethod () - независимо от параллельных вызовов.

Я не могу позволить себе роскошь использовать CDI. И он также должен работать независимо от распространения транзакции (поэтому JCA также не вариант).

Ответы [ 2 ]

1 голос
/ 05 июня 2011

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

  • Thread объекты просто не уничтожаются после завершения выполнения метода EJB;они возвращаются в пул потоков контейнера.Поэтому, если вы прочитаете значение ThreadLocal в другом контексте выполнения, вы найдете значение предыдущего контекста выполнения, который использовал тот же поток.Другими словами, убедитесь, что ваше приложение всегда помещает значения в объект ThreadLocal перед их чтением.
  • Кроме того, освободите все объекты ThreadLocal, если они вам не нужны, в противном случае у вас будет утечка памяти.
0 голосов
/ 05 июня 2011

Существует ли контекст области запроса для сеансовых компонентов без состояния?

Краткий ответ - нет.

Длинный ответ: вам нужен некоторый контекст для обмена данными между вызовами вашей компании.методы.Это может быть проблемой дизайна.Requestscope - это концепция веб-уровня.

  • На веб-уровне область запроса, страницы, сеанса и приложения реализована в виде Hashmap.Таким образом, вы можете передать ссылку на Hashmap в качестве контекста, чтобы поделиться всеми данными.

  • Другим подходом может быть использование одиночного (который должен быть разделен между узлами, например, используя ehcache).

  • Миграция в EJB 3.1 и использование @ Singleton

  • Рассмотрите возможность использования Beans с состоянием и поместите вашу область запроса в область сеанса bean, которая можетбудет удален после того, как вы покинете область запроса.

...