我想在池中创建无状态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。
答案 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:无论如何,您目前得到的错误报告很少,您应该打开一个案例。