日期:2014-05-18  浏览次数:20762 次

立即停止定时任务
各位大侠,请教一个关于定时任务的问题。

需求大致如下:当一个定时任务正在运行时,强行将其停止,类似于abort和terminate的作用,不让其继续执行完毕。如果不能做到,那就返回一个信息,说明某某任务正在运行或已经停止之类的。总之,就是对定时任务的当前状态要非常清楚。

我查过JDK中的Timer类和TimerTask类,它们的cancel方法都满足不了要求,定时任务会继续执行完毕,我想让它立即停掉不执行。

请问有什么好的解决方案呢?我查了spring,quartz,似乎没有满足我需要的。。。

请各位大侠指教
------解决方案--------------------
timer的cancel和scheduler的shutdown都能满足任务的。
------解决方案--------------------
看看这个:http://docs.oracle.com/cd/E17802_01/j2se/j2se/1.5.0/jcp/beta1/apidiffs/java/util/concurrent/ScheduledExecutor.html
------解决方案--------------------
既然task都已经进去了,你在外部想停止是没什么办法了,建议你设置个标志位可以存数据库里
第一个方式就是task进去的时候,修改标志位状态,这样其他人只要根据task的编号和标志位就能达到你说的“说明某某任务正在运行或已经停止之类的。”提示功能,你只要读数据库就好了。然后在task执行完成以后再次修改标注位状态。

另外一种是在外部先修改标志位,就是强行停止,TASK进去以后先读取标志位发现不让执行了就返回,然后如果特别巧合就是判断结束以后你修改了标志位,你可以在task的结尾再次读取那个状态,如果发现是在执行过程中状态位改了,那你想办法再task结束以后将task执行的操作回滚就可以了,比如你是插入记录,那就把记录再删了。

大概就是这种思路,如果你在程序上解决不了的问题,就想办法在程序设计上解决。
------解决方案--------------------
让定时任务启动一个线程,若果不满足运行条件,停掉这个线程就行了
------解决方案--------------------
实在不行,定时任务放线程里,要搞掉的时候interrupted一下