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

JavaEE:同一个计时器的两个对象,@Timeout和TimerService中的计时器不同,java,jakarta-ee,jboss,timer,Java,Jakarta Ee,Jboss,Timer,在JavaEE应用程序(在JBoss6.1上运行)中,我们使用Timer对象。这些对象是使用timerService.createIntervalTimer()方法创建的。这些计时器的info对象是一个类,它有一个字符串(作为ID)和一个布尔字段 假设为timerService只创建了一个Timer。现在,一个带有@Timeout注释的方法负责处理计时器超时时的行为。此Timer对象与通过timerService.getTimers()可访问的对象不同(不同的hashcode)。定时器的info

在JavaEE应用程序(在JBoss6.1上运行)中,我们使用
Timer
对象。这些对象是使用
timerService.createIntervalTimer()方法创建的。这些计时器的info对象是一个类,它有一个
字符串
(作为ID)和一个布尔字段

假设为
timerService
只创建了一个
Timer
。现在,一个带有
@Timeout
注释的方法负责处理
计时器
超时时的行为。此
Timer
对象与通过
timerService.getTimers()
可访问的对象不同(不同的hashcode)。
定时器的info对象的id与
字符串的id相同,但对象不同

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

这是JBoss中的一个bug还是预期的行为?有人知道如何绕过这一点吗

编辑:

下面是一个代码示例:

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后,计时器的timerInfo.flag将为false,并且不能通过SearchTimerByAndChangeFlag对其进行更改,因为具有相同timerInfo.id的timerService.getTimers()中存储的计时器对象与timeOut方法中的对象不同


我希望这能澄清问题。

关于什么参数,您得出结论,对象是不同的,即使它们的id相同。我在JBoss上调试了应用程序,并且能够看到计时器对象的哈希代码。@Timeout方法中的方法与timerService.getTimers()方法中可访问的方法不同。此外,更改其中一个计时器的info对象的布尔字段不会更改另一个计时器的字段。但是在获取info对象并更改其值后,如何在计时器中再次设置该对象。发布一些相关代码,这将有助于大家更好地理解。