【问题标题】:Timer.equals() not working in TomEETimer.equals() 在 TomEE 中不起作用
【发布时间】: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


    【解决方案1】:

    为什么不使用 getInfo() 来匹配正确的计时器?

    【讨论】:

    • 我终于确定了这个方法,但是TomEE中的Timer.equals()有问题吗?我读过 Timer.equals() 必须由容器实现,尽管我没有尝试过 TomEE 以外的其他服务器。
    • 我在使用 getInfo() 时遇到了 TomEE 的其他问题,我已经编辑了问题。你能调查一下吗?
    • 这有点恶毒,因为你序列化它,不确定这部分是否明确指定。也就是说,tomee 也可以获得更明智的 equals 实现,但使用 info 来保存业务代码元数据也是一个很好的做法。编辑:供参考,你在创建计时器时设置它吗?
    • 是的,我在设置计时器时创建了它。我已经编辑了问题以包含屏幕截图。
    • 你认为你可以写一个小的(失败的)测试来重现这个问题吗? (例如使用tomee.apache.org/developer/testing/applicationcomposer/…)。除了序列化之外,它看起来接近github.com/rmannibucau/scheedule/blob/master/src/main/java/com/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2013-04-16
    相关资源
    最近更新 更多