SpringBoot整合定时器:定时任务不再硬编码,动态定时刷起来( 二 )

  • 定时任务的通过代码启动实际是scheduler.schedule(task, new CronTrigger("*/2 * * * * ?"));实现的 。这个方法返回的对象是ScheduledFuture 。通过canel方法取消定时任务 。基于这两个方法我们来改进下我们之前的定时任务 。
  • Registar
    • 首先我们提供一个注册器,注册器的功能就是管理定时任务 。提供增加删除功能 。在增加定时器的节点上我们调用scheduler.schedule(task, new CronTrigger("*/2 * * * * ?"));来启动定时任务 。在删除节点上调用之前获取的ScheduledFuture来canel这个定时任务 。这样做的好处我们可以随时控制定时任务的开关
    public void addCronTask(Runnable task, String cron) {addCronTask(new CronTask(task,cron));}
    • 上面添加需要有一个runnable和cron表达式 。用一个ConcurrentHashMap来管理添加进来的runnable 。runnable为key,ScheduledTask为值 。
    public ScheduledTask scheduleCronTask(CronTask cronTask) {ScheduledTask scheduledTask;scheduledTask = new ScheduledTask();scheduledTask.future = this.taskScheduler.schedule(cronTask.getRunnable(), cronTask.getTrigger());return scheduledTask;}
    • 这样构建一个ScheduledTask对象 。
    public final class ScheduledTask {public volatile ScheduledFuture<!--?--> future;/*** 取消定时任务*/public void cancel() {ScheduledFuture<!--?--> future = this.future;if (future != null) {future.cancel(true);}}}
    • 这样我们就可以通过构建一个runnable线程,结合表达式通过注册器注册就可以开启这个线程已固定频率执行 。通过remove关闭线程 。
    SchedulingRunnable task = new SchedulingRunnable(TestMapper.class, "getTests", null);cronTaskRegistrar.addCronTask(task, "0/10 * * * * ?");
    • 这样做的好处是我们可以在表数据修改的情况下立马更新定时任务规则 。
    总结-上面的代码已经上传至gitee
    点我传送
    https://gitee.com/zxhTom/crontab.git
    • 下面Java类是我们这次使用用到的类 。
    • SchedulingConfigurer
    • DisposableBean
    • ConcurrentHashMap
    原文链接:
    https://www.cnblogs.com/zhangxinhua/p/14830103.html
    如果觉得本文对你有帮助,可以转发关注支持一下




    推荐阅读