无状态 EJB 计时器活动计时器计数太高
Stateless EJB timer active timer count too high
我有一个无状态 EJB 版本 3.0 运行ning,它应该每 30 秒触发一次。我的问题是,在我 运行ning 之后,无论我做什么,它总是 运行 有 4 个活动计时器(在我的 WebLogic 控制台中验证)大约每 2 秒左右关闭一次。
遗憾的是,我不能非常具体地使用我的代码,但这是我所拥有的:
- 我在程序开始时调用的创建计时器方法。这是一个 timerService.createTimer 调用。这实际上没有做任何事情,因为计时器仍在创建而没有被调用。为什么?
- 一个@postConstruct 方法,它只是打印一些东西用于测试。它应该被调用。
- 由于有多个计时器,@Timeout 方法被调用的次数超过了应有的次数。这就是我的业务逻辑所在。
- 在我的 weblogic-ejb-jar.xml 中,我将 max-beans-in-free-pool 设置为 1
如有任何建议,我们将不胜感激。我想我对发生的事情没有完全的了解,但我找不到任何对此有帮助的东西。
在 EJB 3.0 中,所有计时器都是持久的。换句话说,它们在服务器重启后仍然存在。
如果您创建间隔计时器,它将 运行 直到您取消它。停止服务器不会取消它。已知许多实现会在服务器重新启动时尝试再次赶上。
您现有的代码会在您重新启动时创建另一个计时器。
考虑将以下内容添加到为计时器提供服务的 EJB 中的 @PostConstruct 方法:
@Resource
private TimerService timerService;
@PostConstruct
void startup() {
...
for (Timer timer: timerService.getTimers()) {
timer.cancel();
}
...
}
这应该会为您清理干净。
我有一个无状态 EJB 版本 3.0 运行ning,它应该每 30 秒触发一次。我的问题是,在我 运行ning 之后,无论我做什么,它总是 运行 有 4 个活动计时器(在我的 WebLogic 控制台中验证)大约每 2 秒左右关闭一次。
遗憾的是,我不能非常具体地使用我的代码,但这是我所拥有的:
- 我在程序开始时调用的创建计时器方法。这是一个 timerService.createTimer 调用。这实际上没有做任何事情,因为计时器仍在创建而没有被调用。为什么?
- 一个@postConstruct 方法,它只是打印一些东西用于测试。它应该被调用。
- 由于有多个计时器,@Timeout 方法被调用的次数超过了应有的次数。这就是我的业务逻辑所在。
- 在我的 weblogic-ejb-jar.xml 中,我将 max-beans-in-free-pool 设置为 1
如有任何建议,我们将不胜感激。我想我对发生的事情没有完全的了解,但我找不到任何对此有帮助的东西。
在 EJB 3.0 中,所有计时器都是持久的。换句话说,它们在服务器重启后仍然存在。
如果您创建间隔计时器,它将 运行 直到您取消它。停止服务器不会取消它。已知许多实现会在服务器重新启动时尝试再次赶上。
您现有的代码会在您重新启动时创建另一个计时器。
考虑将以下内容添加到为计时器提供服务的 EJB 中的 @PostConstruct 方法:
@Resource
private TimerService timerService;
@PostConstruct
void startup() {
...
for (Timer timer: timerService.getTimers()) {
timer.cancel();
}
...
}
这应该会为您清理干净。