2011-10-28 50 views
2

我正在開發的應用程序的任務之一是備份系統上運行的其他應用程序的數據。我想安排此備份過程,以便它可以無人值守運行。我正在使用JEE6/EJB3.1 Timer實用程序。JEE6重新部署時的定時器持久性

我有一個類BackupConfiguration,我堅持使用JPA2的數據庫,它有一個類型爲TimerHandle的字段。如果用戶決定安排備份,我將創建一個新的持久性Timer並填充TimerHandle字段。

如果我重新啓動服務器,一切正常,定時器重新啓動(並且所有定時器立刻開啓,嘆息時有一個短暫的恐慌),一切都在我離開它的時候。

如果我重新部署應用程序(在開發它時發生了很多事情),所有的計時器都會丟失!我愚蠢地認爲定時器會綁定到服務器,但事實證明它們與應用程序綁定在一起。

所以,我的問題是,什麼是最好的方法來使定時器在重新部署中保持不變?

我能看到的唯一解決方案是將ScheduleExpression以及TimerHandle與備份配置一起存儲。然後,如果我有一個句柄,但沒有定時器,我重新創建了定時器。這個問題的主要問題是它意味着每次應用程序開始查找是否缺少定時器時枚舉每個計劃實體。目前這並不是很多工作,但未來可能會成爲一項巨大的成本。

+0

哪個應用服務器您使用的?您正在描述WebSphere Application Server的行爲,但尚不清楚。如果這是您正在使用的應用程序服務器,那麼我認爲除非應用程序服務器在執行卸載時停止(例如,使用斷開連接的wsadmin會話),否則可以選擇避免在重新部署過程中清除持久定時器。 –

+0

我使用GlassFish 3.0.1,這似乎是標準行爲。 – wobblycogs

回答

1

似乎大多數(可能是所有的)應用程序服務器使定時器對應用程序而不是服務器持久。這是有道理的,因爲當你刪除一個應用程序時,你不會希望定時器在四處閒逛。它在開發過程中很笨拙,因爲NetBeans至少會在重新部署之前刪除應用程序,從而失去所有定時器。

我想到的解決方案是將TimerHandle和調度信息存儲在數據庫中。當應用程序啓動時,它創建一個TimerRepair單例bean,它在任何需要它的類上調用repairTimers。 repairTimers方法選擇所有計劃,並且如果他們有TimerHandle嘗試恢復定時器。如果Timer恢復引發異常,則從調度信息重新創建Timer。總的來說,作爲解決方案並不算太壞,如果計劃了很多項目,我唯一真正關心的就是過度的啓動時間。

相關問題