クラスター化された JEE6 環境 (Glassfish 3.1.2) では、@Singleton
すべてのクラスター ノードで Bean を作成できます。このシングルトン Bean がプログラム タイマーを登録する場合@PostConstruct
、メソッドはどのくらいの頻度で@Timeout
実行されますか? -- そのシングルトンの 1 つだけ (ティックごと)、またはそのタイマーを登録した各 Singeton に対して 1 回 (ティックごと) に?
コードの下に、この質問がこのコードにとって何を意味するかの例を示します。
@Singleton
public class CachedService {
@Resource
private TimerService timerService;
private static final long CACHE_TIMEOUT_DURATION_MS = 60 * 60 * 1000;
@PostConstruct
void initResetTimer() {
this.timerService.createIntervalTimer(CACHE_TIMEOUT_DURATION_MS,
CACHE_TIMEOUT_DURATION_MS,
new TimerConfig("current user cache timeout", false));
}
@Timeout
public void executeResetTimer() {
this.clearCache();
}
}
例: アプリケーションは、クラスター内の 3 つのノードで実行されます。シングルトンがすべてのノードでインスタンス化されると仮定すると、initResetTimer
合計で 3 回 (ノードごとに 1 回) 実行されます。次に問題は、 1 時間に 1 回、すべてのノードでキャッシュがクリアされる (呼び出される) かどうかです。executeResetTimer
(シングルトンは異なる時間にインスタンス化されるため、すべてのノードでタイマーが同時に作動しないことはわかっていますが、これは問題/質問ではありません。)