0

JavaEE アプリケーション (JBoss 6.1 で実行) では、Timerオブジェクトを使用します。これらのオブジェクトはtimerService.createIntervalTimer()メソッドで作成されます。これらのタイマーの情報オブジェクトは、String(ID として) およびブール値フィールドを持つクラスです。

Timer用に作成されたものは 1 つしかないと想像してくださいtimerService。で注釈が付けられたメソッドが、タイムアウト@Timeout時の動作の処理を担当するようになりました。TimerこのTimerオブジェクトは、 からアクセスできるものと同じオブジェクト (異なるハッシュコード) ではありませんtimerService.getTimers()。の情報オブジェクトの ID はTimers同じStringですが、オブジェクトは同じではありません。

これに関する私の問題は次のとおりです。ブール値フィールドが true に設定され、次に false に設定されている場合@Timeoutにのみ、メソッドで何かを実行する必要があります。Timer後で、@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 の最初の実行後、タイマーの timerInfo.flag は false になり、同じ timerInfo.id を持つ timerService.getTimers() に格納されているタイマー オブジェクトは同じオブジェクトではないため、searchTimerByIdAndChangeFlag によって変更することはできません。 timeOut メソッドで。

これで状況が明確になることを願っています。

4

0 に答える 0