EJB 3计时器多次执行

时间:2012-03-29 15:48:18

标签: timer ejb-3.1

我的EJB 3计时器存在一些问题,它不止一次启动。 我使用编程配置,而不是在注释中配置计时器,如许多博客中的解释。这是我的代码:

@Singleton
@Startup
public class AutoAssignTask extends AbstractDirectoryMonitor {

    @Resource
    private TimerService timer;

    @Inject
    @PropertyResource(name = "timer.hour", resource = "/DL4/app.conf")
    private String hour;
    @Inject
    @PropertyResource(name = "timer.minute", resource = "/DL4/app.conf")
    private String minute;
    @Inject
    @PropertyResource(name = "timer.second", resource = "/DL4/app.conf")
    private String second;

    @EJB
    private AutoAssignService autoAssignService;

    @PostConstruct
    public void init() {
            // initializing with an expression.
        this.initSchedule();
    }
    protected void initSchedule() {
        ScheduleExpression exp = new ScheduleExpression();
        if (!StringUtils.isEmpty(this.getHour())) {
            exp.hour(this.getHour());
        }
        if (!StringUtils.isEmpty(this.getMinute())) {
            exp.minute(this.getMinute());
        }
        if (!StringUtils.isEmpty(this.getSecond())) {
            exp.second(this.getSecond());
        }
        this.getTimer().createCalendarTimer(exp);
    }

    @Timeout
    public void process() {
        // do something
        AutoAssignTask.LOG.info("starting job.");
    }

现在让我说我每分钟配置一次计时器,当我查看我的日志时,我得到两次“起始工作”日志,证明它开始工作两次。

关于什么是错的任何想法?

2 个答案:

答案 0 :(得分:3)

问题可能很旧,但它看起来(至少对于JBoss EAP 7),计时器以XML格式存储在%JBOSS_HOME%\ standalone \ data \ timer-service-data中。所以它很可能从那里读取多个ScheduleExpression。至少那是我的情况。删除所有XML并重新部署应用程序解决了这个问题。

答案 1 :(得分:1)

一些想法:

  1. 更新代码以显示initSchedule()方法。问题可能出在ScheduleExpression
  2. 您永远不能排除服务器错误。检查以确保您的@PostConstruct未被调用两次,如果您的服务器创建了两个单例(常见竞争条件问题),则会发生这种情况。
  3. 由于您有一些子类,请确保您知道如果AutoAssignTask进一步子类化,@PostConstruct的{​​{1}}仍然会被调用。更简单地说,EJB的超类的AutoAssignTask方法也被调用 - 最早的父级。
  4. 对于数字2和3,一个简单的静态AtomicInteger和log语句可以工作:

    公共类AutoAssignTask扩展了AbstractDirectoryMonitor {

    @PostConstruct