EJB с состоянием в бизнес-уровне, используемый в области диалога веб-уровня - PullRequest
1 голос
/ 02 марта 2012

У меня есть корпоративное приложение с (как минимум) веб-уровнем (только пользовательский интерфейс) и уровнем обслуживания. На сервисном уровне вся бизнес-логика и текущее состояние диалога реализованы в виде @Stateful @LocalBean EJB (без CDI).

Это немного похоже на бин @SessionScoped с точки зрения CDI, верно?

Итак, вот проблема: У меня длительный разговор на веб-уровне (@Named @ConversationScoped) и я хочу получить доступ к Stateful EJB. EJB должен быть доступен в разных контроллерах (бинах) этого диалога. Я не могу сделать это так: @EJB, потому что это будет другой экземпляр определенного типа EJB. Я должен как-то сохранить ссылку на EJB. Это мое текущее решение:

@EJB
private MyEJB _myEJB; // a stateful EJB

@Produces
@Builder // custom quallifier
@ConversationScoped
public MyEJB produceMyEJB() {
    return _myEJB;
}

Теперь я могу получить доступ к одному и тому же экземпляру EJB с состоянием в каждом из контроллеров области диалога, как это @Inject @Builder MyEJB _myEJB.

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

Я получаю эту трассировку стека в server.log Glassfish:

javax.ejb.NoSuchObjectLocalException: The EJB does not exist. session-key:
907f0200001f-ffffffffc3388fbb-761

и / или

Cannot load from  BACKUPSTORE FOR Key: <907f0200001f-ffffffffc3388fbb-761>

У вас есть идеи, почему это происходит? Спасибо за помощь и извините за мой плохой английский.

1 Ответ

1 голос
/ 02 марта 2012

Ваш EJB с состоянием, вероятно, истекает. Проверьте javax.ejb.StatefulTimeout: http://docs.oracle.com/javaee/6/api/javax/ejb/StatefulTimeout.html

@Stateful
@StatefulTimeout(unit = TimeUnit.MINUTES, value = 30)
public class MyEJB {
...