Как использовать @PostConstruct для создания таймеров в компоненте EJB3 без состояния? - PullRequest
4 голосов
/ 15 августа 2010

Я хочу создать таймер EJB3, когда в пуле создается компонент без сохранения состояния.Но если я использую @PostConstruct, я получаю исключение:

java.lang.IllegalStateException: [EJB:010193]Illegal call to EJBContext method. The bean is in "null" state. It cannot perform 'getting the Timer Service' action(s). Refer to the EJB specification for more details.

Если контейнер вызывает @PostConstruct, бин не равен нулю.Итак, почему я получаю это исключение?


КЛАСС

@Stateless
public class TestBean implements TestLocal {

    @Resource
    TimerService timerService;

    @PostConstruct
    public void startTimer() {
        if (timerService.getTimers().size() == 0) {
            timerService.createTimer(1 * 1000, 1 * 1000, null);
        }
    }

    @Override
    public void test() {        
    }

}

ИНТЕРФЕЙС

@Local
public interface TesteLocal {

    void test();

}

SERVLET

public class TestServlet extends HttpServlet {
    @EJB
    private TestLocal test;

    protected void doGet(....) throws .... {
        test.test();
    }
}

ДЕТАЛИ

Я использую сервер weblogic 11g.

Ответы [ 3 ]

7 голосов
/ 17 ноября 2010

Вы не можете использовать @PostConstruct для создания таймера в EJB-компоненте без состояния 3. Смотрите этот блог Как использовать таймер EJB 3 в кластерной среде weblogic 10 для объяснения. Даже блог говорил о weblogic, но объяснение должно относиться и к другим серверам приложений.

1 голос
/ 06 апреля 2016

Контейнер не позволит использовать timerService в методе, аннотированном с помощью @PostConstruct объекта Session Bean. Если вы хотите использовать timerService в методе, аннотированном с помощью @PostConstruct, используйте сессионный компонент Go для Singleton (@Singleton).

0 голосов
/ 16 августа 2010

Я не уверен на 100%, но я думаю, что класс бинов должен реализовывать javax.ejb.TimedObject или иметь метод, аннотированный @Timeout, чтобы использовать таймеры EJB.Пример:

@Stateless
public class TestBean implements TestLocal {

    @Resource
    TimerService timerService;

    @PostConstruct
    public void startTimer() {
        if (timerService.getTimers().size() == 0) {
            timerService.createTimer(1 * 1000, 1 * 1000, null);
        }
    }

    @Timeout
    @TransactionAttribute(value=REQUIRES_NEW)
    public void timeoutCallback(Timer timer) {
        ...
    }

}

WebLogic все еще жалуется на приведенный выше код?

PS: В любом случае, в настоящее время вы получаете очень плохую ошибку, вам, вероятно, следует открыть дело.

...