【发布时间】:2017-06-27 13:27:34
【问题描述】:
我正在开发一个webapp(.war文件),但是现在我需要实现timerservice,所以我使用了ejb的timer service。我在本地文件中存储一个对象,其中一个变量是创建的计时器的计时器句柄。当您创建新计时器时,将有许多对象附加到同一个文件中。当超时发生时,我打开本地文件并使用equals方法找到写入对象:
public void programmaticTimeout(Timer timer) {
try(FileInputStream fin = new FileInputStream(db);
ObjectInputStream ois = new ObjectInputStream(fin);){
while((temp = (Rules)ois.readObject()) != null){
System.out.println(temp.getName());
if(timer.equals(temp.getTimerHandle().getTimer())){
System.out.println("Time handler found!");
break;
}
}
} catch(Exception e){
}
}
但这导致总是选择第一个对象。谁能解释一下如何解决这个问题?
编辑: 正如@Romain Manni-Bucau 所建议的,我正在使用 getInfo() 方法,如下所示:
public TimerHandle setTimer(ScheduleExpression schedule, Rules rule) {
Timer timer = timerService.createCalendarTimer(schedule, new TimerConfig(rule, true));
return timer.getHandle();
}
@Timeout
public void programmaticTimeout(Timer timer) {
System.out.println("Programmatic timeout fired!");
this.setLastProgrammaticTimeout(new Date());
Rules temp = (Rules)timer.getInfo();
if(temp.getType().equals("campaigns"))
try {
handleCampaigns(temp);
} catch (Exception e) {
e.printStackTrace();
}
}
现在,我已经实现了网页(和相应的 servlet),通过选择事件的时间和频率来设置新规则。随着新规则的创建,servlet 会调用:
setTimer(schedule,newrule);
现在,如果我创建了多个规则(具有相应事件的多个计时器),则只有第一个计时器会被触发,但会触发最后一个计时器的事件。我不知道为什么会这样。我做错了吗?我已经从 TomCat 切换到了 TomEE 的时间服务。我应该为这个转变添加任何依赖项到 pom.xml 吗?
截图:https://postimg.org/image/9jde59nep/
谢谢。
【问题讨论】:
标签: jakarta-ee timer ejb-3.1 apache-tomee