如何使用@PostConstruct在无状态bean EJB3中创建计时器?

时间:2010-08-15 19:35:56

标签: java java-ee ejb-3.0 weblogic weblogic11g

我想在池中创建无状态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不为null。那么,为什么我得到这个例外?


@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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

Container不允许在使用无状态会话Bean的@PostConstruct注释的方法中使用timerService。如果要在使用@PostConstruct注释的方法中使用timerService,请转到Singleton会话bean(@Singleton)。

答案 2 :(得分:-2)

我不是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:无论如何,您目前得到的错误报告很少,您应该打开一个案例。