Jakarta ee Timer.equals()在TomEE中不起作用
我正在开发一个webapp(.war文件),但是现在我需要实现timerservice,所以我使用ejb的定时器服务。我将一个对象存储在一个本地文件中,其中一个变量是timerhandle,另一个变量是创建的计时器。创建新计时器时,将有许多对象附加到同一文件中。当超时发生时,我打开本地文件,并使用equals方法查找write对象:Jakarta ee Timer.equals()在TomEE中不起作用,jakarta-ee,timer,ejb-3.1,apache-tomee,Jakarta Ee,Timer,Ejb 3.1,Apache Tomee,我正在开发一个webapp(.war文件),但是现在我需要实现timerservice,所以我使用ejb的定时器服务。我将一个对象存储在一个本地文件中,其中一个变量是timerhandle,另一个变量是创建的计时器。创建新计时器时,将有许多对象附加到同一文件中。当超时发生时,我打开本地文件,并使用equals方法查找write对象: public void programmaticTimeout(Timer timer) { try(FileInputStream fin = new File
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来享受timeservice。我是否应该为此班次向pom.xml添加任何依赖项
截图:
谢谢。为什么不使用getInfo()来匹配正确的计时器呢?我最终决定使用这种方法,但是TomEE中的timer.equals()有问题吗?我已经读到Timer.equals()必须由容器实现,尽管我没有尝试除TomEE以外的其他服务器。我在使用getInfo()时与TomEE有其他问题,我已经编辑了这个问题。你能调查一下吗?这是一个更恶毒的原因,你序列化它,不确定这部分是不是很好地指定。也就是说,tomee也可以得到一个更合理的equals实现,但使用信息保存业务代码metada也是一个很好的实践。编辑:对于信息,您在创建计时器时设置了它吗?是的,我在设置计时器时创建了它。我已经编辑了这个问题,包括了截图。你认为你可以写一个小的(失败的)测试来重现这个问题吗?(例如使用)。因为它看起来很接近