5

我想在池中创建无状态 bean 时创建一个计时器 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,则 bean 不为空。那么,为什么我会得到这个异常?


班级

@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();

}

伺服器

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

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

细节

我正在使用 weblogic 服务器 11g。

4

3 回答 3

7

您不能使用 @PostConstruct 在无状态 bean EJB 3 中创建计时器。有关说明,请参阅此博客How to use EJB 3 timer in a weblogic 10 cluster environment。甚至博客都在谈论 weblogic,但解释也应该适用于其他应用程序服务器。

于 2010-11-17T14:44:25.337 回答
2

容器将不允许在使用无状态会话 Bean 的 @PostConstruct 注释的方法中使用 timerService。如果您想在使用 @PostConstruct 注释的方法中使用 timerService,请使用单例会话 bean(@Singleton)。

于 2016-04-06T12:32:29.877 回答
-3

我不是 100% 确定,但我认为 bean 类必须实现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:无论如何,您当前收到的错误报告非常差,您可能应该打开一个案例。

于 2010-08-15T23:27:58.770 回答