JavaEE:同一个Timer的两个对象,@ Timeout和TimerService中的Timer不同

时间:2012-05-31 06:11:06

标签: java java-ee jboss timer

在我们的JavaEE应用程序(在JBoss 6.1上运行)中,我们使用Timer个对象。这些对象是使用timerService.createIntervalTimer()方法创建的。这些Timers的info对象是一个具有String(作为ID)和布尔字段的类。

想象一下,Timer只创建了一个timerService。现在,一个注释为@Timeout的方法负责处理Timer超时时的行为。此Timer对象与通过timerService.getTimers()可访问的对象不同(不同的哈希码)。 Timers的信息对象的ID与String相同,但对象不同。

我的问题如下: 我希望@Timeout方法只在其布尔字段设置为true时对Timer执行某些操作,然后将其设置为false。稍后,在@Timeout方法之外,我想再次将此布尔字段设置为true。但由于对象不同,这没有任何效果。

这是JBoss中的错误还是这个行为?有谁知道如何规避这个?

修改

这是一个代码示例:

public class TimerManager {
   @Resource
   TimerService timerService;

   public void createTimer(String Id) {
      TimerConfig timerConfig = new TimerConfig();
      timerConfig.setInfo(new TimerInfo(Id));
      this.timerService.createIntervalTimer(new Date(), 120000, timerConfig);
   }

   @Timeout
   public void timeOut(Timer timer) {
      TimerInfo timerInfo = (TimerInfo) timer.getInfo();
      if (timerInfo.isFlagSet()) {
         //do something
         System.out.println("Timeout for timer with ID: " + info.getID() + " and hashcode " + timer.hashCode());
         timerInfo.setFlag(false);
      }
   }

   //will be called from outside this class and after the timeout happened once
   public void searchTimerByIdAndChangeFlag(String ID) {
      for (Timer timer : this.timerService.getTimers()) {
         if (timer.getInfo() instanceof TimerInfo) {
            TimerInfo info = (TimerInfo) timer.getInfo();
            if (info.getID().equals(ID)) {
               System.out.println("Searching for timer with ID: " + info.getID() + " and hashcode " + timer.hashCode());
               info.setFlag(true); // has no effect because the flag is still set to true
            }
         }
      }
   }

}

public class TimerInfo {
   private String id;
   private boolean flag;

   public TimerInfo(String id) {
      this.id = id;
      this.flag = true;
   }

   //getter and setter for id and flag

}

第一次执行timeOut后,timer的timerInfo.flag将为false,并且searchTimerByIdAndChangeFlag无法更改它,因为存储在timerService.getTimers()中的timer对象与timerInfo.id不是同一个对象作为timeOut方法中的一个。

我希望这能澄清情况。

0 个答案:

没有答案