我的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.");
}
现在让我说我每分钟配置一次计时器,当我查看我的日志时,我得到两次“起始工作”日志,证明它开始工作两次。
关于什么是错的任何想法?
答案 0 :(得分:3)
问题可能很旧,但它看起来(至少对于JBoss EAP 7),计时器以XML格式存储在%JBOSS_HOME%\ standalone \ data \ timer-service-data中。所以它很可能从那里读取多个ScheduleExpression。至少那是我的情况。删除所有XML并重新部署应用程序解决了这个问题。
答案 1 :(得分:1)
一些想法:
initSchedule()
方法。问题可能出在ScheduleExpression
。AutoAssignTask
进一步子类化,@PostConstruct
的{{1}}仍然会被调用。更简单地说,EJB的超类的AutoAssignTask
方法也被调用 - 最早的父级。对于数字2和3,一个简单的静态AtomicInteger和log语句可以工作:
公共类AutoAssignTask扩展了AbstractDirectoryMonitor {
@PostConstruct