在羣集JEE6環境(Glassfish 3.1.2)中,可以在每個羣集節點上創建一個@Singleton
bean。如果這個Singleton Bean在其@PostConstruct
上註冊了編程定時器 - @Timeout
方法執行的頻率如何? - 只有一個單身人士(每個勾號),或者一個(每個勾號)每個註冊一個定時器的Singeton?在羣集中多久執行一次編程創建的EJB定時器?
下面的代碼是這個問題對這段代碼的意義。
@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個節點上運行。假設Singleton在每個節點上實例化,所以總共完成3次(每個節點一次)。那麼問題是:緩存是否每小時清除一次(所有節點上都會調用executeResetTimer
)?
(我知道,計時器滴答不是在同一時間的所有節點上,因爲辛格爾頓是在不同的時間實例化,但這不是問題/問題。)
這個答案非常有用,它回答了其他問題:http://stackoverflow.com/questions/11244608/how-to-run -a-scheduled-in-a-cluster-for-one-node-and-for-all - 但是仍然有一個懸而未決的問題:在上面的例子中,編程計時器不是永久的 - 是否會被執行在非常節點(這是我想實現的)? – Ralph
是的,對'timerService.createXXXTimer(...)'的編程調用是相互獨立的,請參閱更新以回答。 – Tair