前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot动态定时任务

SpringBoot动态定时任务

作者头像
一觉睡到小时候
发布2021-03-16 10:54:13
4940
发布2021-03-16 10:54:13
举报
文章被收录于专栏:国产程序员国产程序员

其实SchedulingConfigurer实现方法很简单,只需要实现SchedulingConfigurer并重写configureTasks方法,在启动类必须加上@EnableScheduling注解即可。

代码语言:javascript
复制
@Configuration
@EnableScheduling
@Slf4j
public class RuleTask implements SchedulingConfigurer {

    private volatile ScheduledTaskRegistrar registrar;
    private ConcurrentHashMap<Long, ScheduledFuture<?>> scheduledFutures = new ConcurrentHashMap<>();
    private ConcurrentHashMap<Long, CronTask> cronTasks = new ConcurrentHashMap<>();

    @Override
    public void configureTasks(ScheduledTaskRegistrar registrar) {
        registrar.setScheduler(Executors.newScheduledThreadPool());
        this.registrar = registrar;
    }

    /**
     * 刷新任务
     * cronList是数据库查出来的定时任务列表
     * @param ruleList
     */
    public void refresh(List<WarCron> cronList) {
        //取消已经删除的任务
        Set<Long> cronIds = scheduledFutures.keySet();
        for (Long cronId : cronIds) {
            if (!exists(cronList, cronId)) {
                scheduledFutures.get(cronId).cancel(false);
            }
        }
        if (cronList != null) {
            for (WarCron warCron : cronList) {
                String expression = warCron.getCron();
                //定时任务已存在且表达式未发生变化时跳过
                if (scheduledFutures.containsKey(warCron.getCronId()) && cronTasks.get(warCron.getCronId()).getExpression().equals(expression)) {
                    continue;
                }
                //如果执行时间发生了变化,则取消当前的定时任务
                if (scheduledFutures.containsKey(warCron.getCronId())) {
                    scheduledFutures.get(warCron.getCronId()).cancel(false);
                    scheduledFutures.remove(warCron.getCronId());
                    cronTasks.remove(warCron.getCronId());
                }
                CronTask task = new CronTask(
                        new Runnable() {
                            @Override
                            public void run() {
                                System.out.println("------------定时任务--------------");
                            }
                        }, warCron.getCron()
                );
                ScheduledFuture<?> future = registrar.getScheduler().schedule(task.getRunnable(), task.getTrigger());
                cronTasks.put(warCron.getCronId(), task);
                scheduledFutures.put(warCron.getCronId(), future);
            }
        }
    }

   /**
     * 判断是否有该任务
     *
     * @param warCronList
     * @param cronId
     * @return
     */
    private boolean exists(List<WarCron> warCronList, Long cronId) {
        for (WarCron warCron : warCronList) {
            if (cronId.equals(warCron.getCronId())) {
                return true;
            }
        }
        return false;
    }
}

每次新增编辑删除数据库中的任务时都需刷新下任务 以达到任务的动态变化 启动boot时也需执行refresh方法;

代码语言:javascript
复制
/**
 * @Author: pandar
 * @Date: 2021/3/12 0012 上午 11:57
 * @Description:  项目启动后刷新定时任务
 */
@Component
public class ApplicationRunnerConfig implements ApplicationRunner {

    @Autowired
    private RuleTask ruleTask;
    @Autowired
    private WarCronService warCronService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        List<WarCron> warCronList = warCronService.selectWarCronAll();
        ruleTask.refresh(ruleList);
    }
}

数据库表结构

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 国产程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档