2010-10-22 39 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)