Jakarta ee Timer.equals()在TomEE中不起作用

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

我正在开发一个webapp(.war文件),但是现在我需要实现timerservice,所以我使用ejb的定时器服务。我将一个对象存储在一个本地文件中,其中一个变量是timerhandle,另一个变量是创建的计时器。创建新计时器时,将有许多对象附加到同一文件中。当超时发生时,我打开本地文件,并使用equals方法查找write对象:

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也是一个很好的实践。编辑:对于信息,您在创建计时器时设置了它吗?是的,我在设置计时器时创建了它。我已经编辑了这个问题,包括了截图。你认为你可以写一个小的(失败的)测试来重现这个问题吗?(例如使用)。因为它看起来很接近