玩過linux系統的同窗,應該都知道cron是一個linux下的定時執行工具,一些重要的任務的定時執行能夠經過cron來實現,例如天天凌晨1點備份數據等。在JAVA WEB開發中,咱們也常常須要用到定時執行任務的功能,JDK提供了Timer類與ScheduledThreadPoolExecutor類實現這個定時功能。但在使用這兩個類的時候,要特別注意異常處理問題。如下是一個模擬程序:java
public class ScheduledThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1); BusinessTask task = new BusinessTask(); //1秒後開始執行任務,之後每隔2秒執行一次 executorService.scheduleWithFixedDelay(task, 1000, 2000,TimeUnit.MILLISECONDS); } private static class BusinessTask implements Runnable{ @Override public void run() { System.out.println("任務開始..."); //doBusiness(); System.out.println("任務結束..."); } } }
程序輸出結果跟相像中同樣:linux
任務開始...
任務結束...
任務開始...
任務結束...ide
但是執行了一段時間後,發現定時任務再也不執行了,去查看後臺打印的日誌,原來在doBusiness()方法中拋出了異常。爲何doBusiness()拋出異常就會停止定時任務的執行呢?去查看JDK的ScheduledThreadPoolExecutor.scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit)的方法說明:工具
Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given delay between the termination of one execution and the commencement of the next. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor.學習
這段話翻譯成中文是:網站
建立並執行一個在給定初始延遲後首次啓用的按期操做,隨後,在每一次執行終止和下一次執行開始之間都存在給定的延遲。若是任務的任一執行遇到異常,就會取消後續執行。不然,只能經過執行程序的取消或終止方法來終止該任務。翻譯
看到這裏,咱們明白了緣由,這樣就須要把doBusiness()方法的全部可能異常捕獲,才能保證定時任務繼續執行。把代碼改爲這樣:日誌
public class ScheduledThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1); BusinessTask task = new BusinessTask(); //1秒後開始執行任務,之後每隔2秒執行一次 executorService.scheduleWithFixedDelay(task, 1000, 2000,TimeUnit.MILLISECONDS); } private static class BusinessTask implements Runnable{ @Override public void run() { //捕獲全部的異常,保證定時任務可以繼續執行 try{ System.out.println("任務開始..."); //doBusiness(); System.out.println("任務結束..."); }catch (Throwable e) { // donothing } } } }
其實,在JAVAWEB開發中,執行定時任務有一個更好的選擇:Quartzcode
這個開源庫提供了豐富的做業調度集,有興趣的同窗能夠到官方網站中學習一下其用法。開發