基於Spring boot定時任務編寫的幾種方法

       定時任務,顧明思議就是在不須要人工干預的前提下,預先設定好程序執行頻率或者執行時間。與傳統的觸發式請求響應最大的區別在於,定時任務須要在程序設計時自動進行響應調用。java

       經常使用的幾種定時任務實現方式以下:spring

       1.Timer:一種java自帶的java.util.Timer類,改類調度一個java.util.TimerTask任務,使用該方法會讓程序以必定的頻率去執行,可是不能指定時間下運行。該種方法在我最開始接觸java編程語言的時候使用過,目前已經基本被我廢棄,廢話很少說了,直接上demo代碼。編程

public class TestTimer {
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task  run:"+ new Date());
            }
        };
        Timer timer = new Timer();
        //安排指定的任務在指定的時間開始進行重複的固定延遲執行。這裏是每3秒執行一次
        timer.schedule(timerTask,10,3000);
    }

        2.ScheduledExecutorService:改類是基於線程池設計的定時任務類,每一個調度任務分配到線程池中的一個線程去執行,能夠併發執行。api

public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 參數:一、任務體 二、首次執行的延時時間
        //      三、任務執行間隔 四、間隔時間單位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }

       3.今年開始我慢慢地喜歡上了註解的方式,再加上使用過了spring boot框架以後,愈加以爲能用註解解決的問題就用註解解決,這是由於它真心方便。這一種方式是我極力推崇的,也是我在目前項目中常常使用的用於定時任務處理的方法。先上代碼再說。併發

public class ScheduledService {
 
    @Scheduled(fixedDelay = 60000)    //1分鐘執行一次
    public void serviceStatusGet(){
        log.info(String.format("===第%s次開始執行應用狀態數據抽取服務,當前時間爲:%s", count2, dateFormat.format(new Date())));
        svcStatusUtil.getServiceStatus();
        log.info(String.format("===第%s次執行結束應用狀態數據抽取服務,當前時間爲:%s", count2, dateFormat.format(new Date())));
        count2++;
    }
 
 
 
    @Scheduled(cron = "0 0 12 * * ?")    //天天中午12點觸發
    public void serviceStatusGet2(){
        log.info(String.format("===第%s次開始執行應用狀態數據抽取服務,當前時間爲:%s", count2, dateFormat.format(new Date())));
        svcStatusUtil.getServiceStatus();
        log.info(String.format("===第%s次執行結束應用狀態數據抽取服務,當前時間爲:%s", count2, dateFormat.format(new Date())));
        count2++;
    }
 
}

        該定時任務很是簡易,只須要在要實現的方法上添加@Scheduled(*)註解便可,經常使用的能夠分爲兩類,第一種屬於按照時間頻率定時任務@Scheduled(fixedDelay=6000),另外一種爲設置固定時間點執行定時任務@Scheduled(「0 0 12 * * ?」 )。具體的其它類型能夠想看對應的api。總之,在使用過上面幾種定時任務處理的經驗來看,直接使用@@Scheduled註解的方式應該是最方便的。框架

相關文章
相關標籤/搜索