我知道在无状态会话bean中使用实例变量是一个流行的讨论主题,并且已经阅读了其中的一些内容,但是我特别需要的是这个主题我的应用程序的实际设计。在无状态的EJB定时器中正确使用实例变量
我的企业应用程序由几个无状态bean组成,它们触发特定的事件。在这样的事件中,我希望一些定时器也可以触发并跟踪某些事情(例如插入数据库中的特定于原始事件的新数据)。
@Stateless
public class SpecificFeedbackImpl implements SpecificFeedback {
@Resource
protected TimerService timerService;
//more injections here
public String name;
public String ip;
@Timeout
public void timeoutHandler(Timer timer) {
if (timer.getInfo().toString().startsWith(name)) {
//search db for data of event with identifier "name"
//if anything found, then send to "ip"
}
}
public void stopTimer() {
for (Object o : this.timerService.getTimers())
if (((Timer) o).getInfo().toString().startsWith(name)){
((Timer)o).cancel();
}
}
@Override
public void startTimer(long interval, String eventID, String serverIP){
this.name = eventID;
this.ip = serverIP;
stopTimer();
TimerConfig config = new TimerConfig();
config.setInfo(name);
config.setPersistent(false);
timerService.createIntervalTimer(interval, interval, config);
}
}
然而,当我做了一个小测试手动调用多个计时器,以不同的间隔,eventIDs和serverIPs,我没有从所有的定时器预期的行为(其中一些从未超时等。 )。
上述来源是否适合所需用途,或者我应该如何设计/实施它?如果是的话,你能否提出一些建议?
存储数据的另一种方式是将'name'属性设置为'static',或者如果名称是为每个定时器指定的,则要使用'static Map'并使用'timer.getInfo() .toString()'作为'Map'键。 –