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 メソッドで。
これで状況が明確になることを願っています。