我在我的网络应用程序中使用Timertask
每天24小时在午夜启动一次后台线程。所以我有一个ServletContextListener并且在contextInitialized中,我创建了一个Timertask对象timertask(比如说)和一个Timer对象说t。
我打电话
t.schedule(timertask, firstTime.getTime(), rescheduleMiliSec);
其中firstTime.getTime() = midnight
和rescheduleMiliSec = 24 hr
。
线程启动很好,并在DIT中执行它应该做的事情。每24小时它启动后台任务。
当它移动到PROD时,线程只在初始化上下文时运行一次但在此之后不运行。
是否有可能导致此问题的特定设置?
答案 0 :(得分:2)
你的TimerTask实现是否可能抛出RuntimeException?
如果不是异常,则在该Timer中调度的某些TimerTask会无限期地阻塞。这是我所知道的唯一可能导致Timer失败的两个条件。
顺便说一句,你可能想看一下ScheduledExecutorService。这是调度任务的更现代的方式。答案 1 :(得分:1)
我认为原因很简单,但可能会躲避肉眼。
firstTime.getTime()
以毫秒为单位,以下方法优先:
schedule(TimerTask task, long delay, long period)
预期的内容:
schedule(TimerTask task, Date firstTime, long period)
答案 2 :(得分:0)
在使用TimerTask调度任务后的contextInitialized方法中,下面是否有任何代码,可能导致异常。