2014-09-19 78 views
4

在我的Java EE 7應用程序中,我創建了一個每小時運行一次的持續計劃任務。我使用了@Schedule註釋。Java EE 7:將@Schedule日期設置爲persistent = true時

當這項工作被調用時,我想對從最近一小時到現在發生的事件執行一些操作。要獲得現在我使用「新日期()」。

此@Schedule具有默認的持久屬性爲「true」,這非常棒,因爲如果服務器在幾個小時內停止,我希望在重新啓動時執行這些任務。

問題是,如果服務器在5個小時內停止了,作業將會啓動5次,但是在所有的執行過程中將會執行「new Date()」,結果將會是相同的。

有沒有辦法檢索@Schedule作業應該發佈的日期?

回答

3

有什麼辦法來檢索時@Schedule工作應該已經啓動的日期? ??

我認爲答案是否定的,沒有。

specification定義了三個必須由容器實現的接口。 這些接口是:TimerServiceTimerTimerHandle。 正如你所看到的,它們中的任何一個(特別是定時器)都會暴露你需要的方法 。因此,符合Java EE的服務器不會被強制執行此行爲。

也許你應該自己實施一個解決方案來提供這個要求。 例如,你的最後一個回調方法 被執行時可以存儲的時間戳,如果服務器使用這個時間戳來確定(而不是減1小時,以當前日期)

的一段時間...在5小時內已停止,作業將陸續推出5次......

請注意,你不能靠這個

18.4.3定時器過期和超時回調方法 ...在介入 時間內任何時間間隔永久定時器或基於時間表的永久定時器必須在重新啓動時至少調用至少一次

1

你可以重建你的計時器應通過javax.ejb.Timer實際運行時間:

@Timeout 
public void timeout(Timer timer) { 
    // get next time 
    Date nextTime = timer.getNextTimeout(); 
    // substract 1 hour 
    Calendar c = Calendar.getInstance(); 
    c.setTime(timer.getNextTimeout()); 
    c.add(Calendar.HOUR_OF_DAY, -1); 
    Date actualTimerDate = c.getTime(); 
} 
+0

我想,直接使用TimerService可以以某種方式實現,但我想從@Schedule註釋方法中使用。 – marcoslop 2014-09-19 15:49:43

+0

當使用持久性定時器時,這種方法不起作用,就像服務器關閉並開始備份一樣,在JBoss中,它將運行所有錯過的定時器,並使用相同的下一個超時值。 – Iain 2015-02-08 22:07:23

相關問題