在我们的 JavaEE 应用程序(在 JBoss 6.1 上运行)中,我们使用Timer
对象。这些对象是使用该timerService.createIntervalTimer()
方法创建的。这些计时器的信息对象是一个具有String
(作为 ID)和布尔字段的类。
想象一下,只有一个Timer
为timerService
. 现在,一个用 注释的方法@Timeout
负责处理Timer
超时时的行为。此Timer
对象与可通过 访问的对象不同(不同的哈希码)timerService.getTimers()
。的 info 对象的 IDTimers
相同String
,但对象不一样。
我的问题如下:我希望该@Timeout
方法仅Timer
在其布尔字段设置为 true 时才执行某些操作,然后将其设置为 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()中存储的timerService.getTimers()中的timerInfo.id相同的对象不是同一个对象在 timeOut 方法中。
我希望这可以澄清情况。