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

Java 如何使用@PostConstruct在无状态bean EJB3中创建计时器?,java,jakarta-ee,ejb-3.0,weblogic,weblogic11g,Java,Jakarta Ee,Ejb 3.0,Weblogic,Weblogic11g,我想在池中创建无状态bean时创建一个计时器EJB3。 但是如果我使用@PostConstruct我会得到一个例外: java.lang.IllegalStateException:[EJB:010193]对EJBContext方法的非法调用。bean处于“null”状态。它无法执行“获取计时器服务”操作。有关更多详细信息,请参阅EJB规范。 如果容器调用@PostConstruct,则bean不能为null。那么,为什么我会得到这个例外呢 课程 @Stateless public class

我想在池中创建无状态bean时创建一个计时器EJB3。 但是如果我使用
@PostConstruct
我会得到一个例外:

java.lang.IllegalStateException:[EJB:010193]对EJBContext方法的非法调用。bean处于“null”状态。它无法执行“获取计时器服务”操作。有关更多详细信息,请参阅EJB规范。

如果容器调用@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();
    }
}

详细信息

@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() {        
    }

}

我使用的是weblogic server 11g。

我不是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:在任何情况下,您当前收到的错误报告都非常糟糕,您可能应该打开一个案例

您不能使用@PostConstruct在无状态bean EJB 3中创建计时器。有关解释,请参见本博客。甚至博客也在谈论weblogic,但这一解释也应该适用于其他应用服务器。

容器将不允许在带有无状态会话Bean@PostConstruct注释的方法中使用timerService。如果您想在带有@PostConstruct注释的方法中使用timerService,那么就使用go for Singleton会话bean(@Singleton)。

我按照您的示例,做了2个更改:a)TestLocal有一个方法要由TestBean实现(没有这个,weblogic无法部署)b)创建一个调用EJB的servlet。错误仍然存在。@Topera我真的不确定(我甚至不确定我建议的内容是否是EJB3.0的必需内容)。我可能错了,但这看起来像个虫子。我建议联系支持人员确实,正如Mike所说,这段代码不会运行。无法通过@Postconstruct方法访问或启动计时器。是的,JBoss中也出现了相同的问题。虽然这解释了为什么不可能,但它没有给出问题的实际答案。