0
我正在开发一个webapp(.war文件),但现在我需要实现timerservice,所以我使用ejb的计时器服务。我在本地文件中存储一个对象,其中的变量是定时器的定时器句柄。创建新计时器时,会有多个对象附加到同一文件。当超时发生时,我打开本地文件和寻找使用equals方法写对象:Timer.equals()不能在TomEE中工作
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曼尼 - 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/
谢谢。
我终于解决了这个方法,但是在TomEE中Timer.equals()有问题吗?我读过Timer.equals()必须由容器实现,尽管我没有尝试其他服务器而不是TomEE。 – Nihhaar
使用getInfo()时,我有其他问题与TomEE,我编辑了问题。你可以看看它吗? – Nihhaar
这是一个更恶毒的原因,你串行它,不知道这部分是明确指定的。这就是说,tomee也可以得到一个更明智的平等实现,但使用信息来保存商业代码metada也是一个很好的做法。 编辑:对于信息,您是否在创建定时器时设置它? –