Java 如何使用@PostConstruct在无状态bean EJB3中创建计时器?
我想在池中创建无状态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
@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中也出现了相同的问题。虽然这解释了为什么不可能,但它没有给出问题的实际答案。