无状态EJB计时器活动计时器计数太高

时间:2016-08-10 17:33:01

标签: java timer ejb

我有一个无状态的EJB 3.0版本运行,应该每30秒触发一次。我的问题是,在我运行之后,无论我做什么,它总是会运行4个活动计时器(在我的WebLogic控制台中验证)大约每2秒左右一次。

可悲的是,我的代码不能超级具体,但这就是我所拥有的:

  • 我在程序开头调用的创建计时器方法。这是一个timerService.createTimer调用。这真的没有做任何事情,因为定时器仍在被创建而没有被调用。为什么?
  • 一个@postConstruct方法,它只是打印出来进行测试。它被称之为应该。
  • 由于多个计时器而被称为WAY的@Timeout方法比它应该多。这就是我的业务逻辑。
  • 在我的weblogic-ejb-jar.xml中,我将max-beans-in-free-pool设置为1

任何建议都将不胜感激。我想我不完全了解发生了什么,但我找不到任何有用的东西。

1 个答案:

答案 0 :(得分:1)

在EJB 3.0中,所有计时器都是持久的。换句话说,它们可以在服务器重启后继续存在。

如果您创建间隔计时器,它将一直运行,直到您取消它。停止服务器不会取消它。已知许多实现在重新启动服务器时尝试再次赶上。

现有代码在重新启动时会创建另一个计时器。

考虑将以下内容添加到为Timer提供服务的EJB中的@PostConstruct方法:

 @Resource
 private TimerService timerService;

 @PostConstruct
 void startup() {
     ...
     for (Timer timer: timerService.getTimers()) {
         timer.cancel();
     }
     ...
 }

这应该为你清理。