Spring定時調度器原理

定時調度器主要是負責一些定時任務的調度,

public class CronTaskPool {

    /**
     * 執行任務的線程池
     */
    private Executor executor;

    /**
     * 調度任務的線程池
     */
    private ScheduledExecutorService scheduled;

    private CronTaskPool() {
    }

    public static CronTaskPool newCornTaskPool(int poolSize, String poolName) {
        CronTaskPool taskPool = new CronTaskPool();
        taskPool.executor = ThreadPools.newFixedThreadPool(poolName, poolSize);
        taskPool.scheduled = ThreadPools.newSingleThreadScheduledExecutor("scheduled-" + poolName);
        return taskPool;
    }

    /**
     * 收到任務后計算距離下一次執行的時間,提交至ScheduledExecutorService中
     */
    public void submit(CronTask cronTask) {
        scheduled.schedule(() -> safeExec(cronTask), getNextDelay(cronTask.getCron()),
            TimeUnit.MILLISECONDS);
    }

    /**
     * 將Cron中的任務提交至Executor執行,生成下一個任務
     */
    private void safeExec(CronTask cronTask) {
        try {
            executor.execute(cronTask.getRunnable());
            submit(cronTask);
        } catch (Exception e) {

        }
    }

    /**
     * 計算當前時間距離下次執行的間隔
     */
    private long getNextDelay(CronSequenceGenerator corn) {
        return corn.next(new Date()).getTime() - System.currentTimeMillis();
    }

    private static void safeSleep(int seconds) {
        try {
            Thread.sleep(1000L * seconds);
        } catch (Throwable t) {

        }
    }

    public static void main(String[] args) {
        CronTaskPool taskPool = CronTaskPool.newCornTaskPool(1, "test");
        taskPool.submit(new CronTask() {
            @Override
            public Runnable getRunnable() {
                return () -> System.out.println(System.currentTimeMillis());
            }

            @Override
            public CronSequenceGenerator getCron() {
                return new CronSequenceGenerator("*/5 * * * * ?");
            }
        });

        safeSleep(100);
    }
}
public interface CronTask {

    /**
     * 要被定時調度的任務
     */
    Runnable getRunnable();

    /**
     * 任務調度的頻率,該類存在于org.springframework.scheduling.support.CronSequenceGenerator
     * 接受一個cron表達式
     */
    CronSequenceGenerator getCron();
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 專業考題類型管理運行工作負責人一般作業考題內容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規程...
    小白兔去釣魚閱讀 9,051評論 0 13
  • 當和底層系統交互時,必須花費大量時間為任務做好準備。調用內核或者其他系統層需要切換上下文,這也是比在進程內部調用昂...
    坤坤同學閱讀 1,787評論 0 16
  • 一點知識 在JAVA開發領域,目前可以通過以下幾種方式進行定時任務: Timer:jdk中自帶的一個定時調度類,可...
    雅倩蘭爸爸閱讀 3,853評論 1 28
  • YarnYarn產生背景:Yarn直接來自于MR1.0MR1.0 問題:采用的是master slave結構,ma...
    時待吾閱讀 5,841評論 2 23
  • 進程調度:在可運行態進程之間分配有限處理器時間資源的內核子系統。通俗來說就是,各個進程之間如何有規律的使用CPU。...
    batbattle閱讀 3,173評論 0 9