如何使用 @PostConstruct 在无状态 bean EJB3 中创建计时器?
我想在池中创建无状态 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();
}
}
详细信息
我正在使用 weblogic 服务器 11g。
I want to create a timer EJB3 when a stateless bean is created in the pool.
But if I use @PostConstruct
I get the exception:
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.
If container calls @PostConstruct, the bean ins't null. So, why I get this exception?
CLASS
@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() {
}
}
INTERFACE
@Local
public interface TesteLocal {
void test();
}
SERVLET
public class TestServlet extends HttpServlet {
@EJB
private TestLocal test;
protected void doGet(....) throws .... {
test.test();
}
}
DETAILS
I'm using weblogic server 11g.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您不能使用 @PostConstruct 在无状态 bean EJB 3 中创建计时器。请参阅此博客 如何在 weblogic 10 集群环境中使用 EJB 3 计时器进行说明。即使博客也在谈论 weblogic,但该解释也应该适用于其他应用程序服务器。
You can NOT use a @PostConstruct to create a timer in a stateless bean EJB 3. See this blog How to use EJB 3 timer in a weblogic 10 cluster environment for the explanation. Even the blog was talking about weblogic, but the explanation should apply to other app servers also.
容器不允许在 Stateless Session Bean 的 @PostConstruct 注释的方法中使用timerService。如果你想在用@PostConstruct注释的方法中使用timerService,请使用Singleton会话bean(@Singleton)。
Container will not allow for timerService in method annotated with @PostConstruct of Stateless Session Bean. If you want to use timerService in method annotated with @PostConstruct the go for Singleton session bean(@Singleton).
我不是 100% 确定,但我认为 bean 类必须实现 javax.ejb.TimedObject 或具有用
@Timeout 注释的方法才能使用 EJB 计时器。示例:
WebLogic 是否仍然抱怨上述代码?
PS:无论如何,您当前收到的错误报告非常糟糕,您可能应该打开一个案例。
I'm not 100% sure but I think that the bean class must implement
javax.ejb.TimedObject
or have a method annotated with@Timeout
to use EJB timers. Example:Does WebLogic still complain with the above code?
PS: In any case, the error you currently get is very poorly reported, you should probably open a case.