ステートレス セッション Bean 内でのインスタンス変数の使用が人気のあるディスカッション トピックであることは知っており、既にそれらのいくつかを読んでいますが、このトピックで特に必要なのは、アプリケーションの実際の適切な設計です。
私のエンタープライズ アプリケーションは、特定のイベントで起動するいくつかのステートレス 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);
}
}
ただし、複数のタイマーを異なる間隔、イベント ID、およびサーバー IP で手動で呼び出す小さなテストを行ったところ、すべてのタイマーで期待どおりの動作が得られませんでした (一部のタイマーはタイムアウトにならないなど)。
上記のソースは必要な使用法に適していますか、それとも別の方法で設計/実装する必要がありますか? はいの場合、いくつかのオプションを提案していただけますか?