2017-06-27 23 views
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/

谢谢。

回答

0

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

+0

我终于解决了这个方法,但是在TomEE中Timer.equals()有问题吗?我读过Timer.equals()必须由容器实现,尽管我没有尝试其他服务器而不是TomEE。 – Nihhaar

+0

使用getInfo()时,我有其他问题与TomEE,我编辑了问题。你可以看看它吗? – Nihhaar

+0

这是一个更恶毒的原因,你串行它,不知道这部分是明确指定的。这就是说,tomee也可以得到一个更明智的平等实现,但使用信息来保存商业代码metada也是一个很好的做法。 编辑:对于信息,您是否在创建定时器时设置它? –

相关问题