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,049评论 0 13
  • 当和底层系统交互时,必须花费大量时间为任务做好准备。调用内核或者其他系统层需要切换上下文,这也是比在进程内部调用昂...
    坤坤同学阅读 1,787评论 0 16
  • 一点知识 在JAVA开发领域,目前可以通过以下几种方式进行定时任务: Timer:jdk中自带的一个定时调度类,可...
    雅倩兰爸爸阅读 3,853评论 1 28
  • YarnYarn产生背景:Yarn直接来自于MR1.0MR1.0 问题:采用的是master slave结构,ma...
    时待吾阅读 5,809评论 2 23
  • 进程调度:在可运行态进程之间分配有限处理器时间资源的内核子系统。通俗来说就是,各个进程之间如何有规律的使用CPU。...
    batbattle阅读 3,160评论 0 9