2010-10-22 73 views
1

我在我的web應用程序中使用Timertask在每天午夜24小時啓動一次後臺線程。所以我有一個ServletContextListener並在contextInitialized中創建了一個Timertask對象timertask(say)和一個Timer對象say t。計時器任務不運行

我打電話

t.schedule(timertask, firstTime.getTime(), rescheduleMiliSec); 

其中firstTime.getTime() = midnightrescheduleMiliSec = 24 hr。 線程啓動罰款和做什麼是應該在DIT.Every做24個小時,它會啓動後臺任務。

當它移動到PROD時,線程只會在上下文初始化時運行一次,但不會在此之後運行。

是否有任何具體的設置可能是這個原因?

回答

2

是否有可能你的TimerTask實現拋出一個RuntimeException?

如果不是例外,那麼在該Timer中調度的某個TimerTask將無限期阻塞。這些是我知道的唯一兩個可能導致Timer失敗的條件。您可能需要查看ScheduledExecutorService。這是更現代的調度任務的方式。

+0

當上下文首先初始化,所述TimerTask的正常運行,並且沒有例外。後來也沒有例外。它只是不運行。 – Victor 2010-10-22 22:38:17

+0

由於這個問題是迫切需要我來解決,如果實際的解決方案是很難找到的,像下面一個解決辦法也將正常工作。我仍然需要儘管實施它的一些幫助:由於邏輯駐留在contextinitialised(),每次應用程序重新部署時,上下文將初始化和邏輯運行。有沒有辦法在午夜時分自動重新部署應用程序?也許是一個腳本?這是一個有點凌亂,但它現在做... – Victor 2010-10-22 23:09:54

+0

@ user454671,更新我的答案。關於重新部署應用程序,你可能會考慮一個時間工作......但這似乎不是一個合理的解決方案。 – 2010-10-23 05:06:43

0

在使用TimerTask調度任務之後的contextInitialized方法中,是否存在下面的任何代碼,可能是導致異常的原因。

1

我想原因很簡單,但它可以逃避肉眼。

firstTime.getTime() 

是以毫秒爲單位和下面的方法優先:

schedule(TimerTask task, long delay, long period) 

INSEAD的預期:

schedule(TimerTask task, Date firstTime, long period)