计时器任务不运行
问题描述:
我在我的web应用程序中使用Timertask
在每天午夜24小时启动一次后台线程。所以我有一个ServletContextListener并在contextInitialized中创建了一个Timertask对象timertask(say)和一个Timer对象say t。计时器任务不运行
我打电话
t.schedule(timertask, firstTime.getTime(), rescheduleMiliSec);
其中firstTime.getTime() = midnight
和rescheduleMiliSec = 24 hr
。 线程启动罚款和做什么是应该在DIT.Every做24个小时,它会启动后台任务。
当它移动到PROD时,线程只会在上下文初始化时运行一次,但不会在此之后运行。
是否有任何具体的设置可能是这个原因?
答
是否有可能你的TimerTask实现抛出一个RuntimeException?
如果不是例外,那么在该Timer中调度的某个TimerTask将无限期阻塞。这些是我知道的唯一两个可能导致Timer失败的条件。您可能需要查看ScheduledExecutorService。这是更现代的调度任务的方式。
答
在使用TimerTask调度任务之后的contextInitialized方法中,是否存在下面的任何代码,可能是导致异常的原因。
答
我想原因很简单,但它可以逃避肉眼。
firstTime.getTime()
是以毫秒为单位和下面的方法优先:
schedule(TimerTask task, long delay, long period)
INSEAD的预期:
schedule(TimerTask task, Date firstTime, long period)
当上下文首先初始化,所述TimerTask的正常运行,并且没有例外。后来也没有例外。它只是不运行。 – Victor 2010-10-22 22:38:17
由于这个问题是迫切需要我来解决,如果实际的解决方案是很难找到的,像下面一个解决办法也将正常工作。我仍然需要尽管实施它的一些帮助:由于逻辑驻留在contextinitialised(),每次应用程序重新部署时,上下文将初始化和逻辑运行。有没有办法在午夜时分自动重新部署应用程序?也许是一个脚本?这是一个有点凌乱,但它现在做... – Victor 2010-10-22 23:09:54
@ user454671,更新我的答案。关于重新部署应用程序,你可能会考虑一个时间工作......但这似乎不是一个合理的解决方案。 – 2010-10-23 05:06:43