springboot动态定时任务,不使用中间件
  RJqwnp6UPIKw 2023年11月02日 49 0

老项目中没有引入xxljob之类的定时任务查询,但是有一个任务需要动态开启和关闭,但是引入中间件需要新部署一下,改动较大。

老项目不想动太多东西就查资料找了这个方法。

注意:启动类加入注解 @EnableScheduling 也可直接写到定时任务的类上

编写getExpression方法内容返回定时任务即可

  • getExpression方法返回6位的执行公式 公式生成网站
  • 返回值可通过数据库获取,修改时修改数据库即可
  • 可通过配置中心获取,如nacos之类的,修改是修改配置中心里面的内容即可
  • 可通过redis之类的缓存获取,注意持久化
  • 可通过读取本地文件获取,调用http接口获取也可。
  • 只要根据项目实际情况用适合自己的获取公式方式即可,只有能保证修改后能读取到最新的数据


triggerTask()方法里面写定时任务要执行的内容

package com.yv.demo.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

//@EnableScheduling     需要启动类添加注解
@Component
@Slf4j
public class EnableSchedulingConfig implements SchedulingConfigurer {

    /**
     * 是否设置了定时任务,如果没有设置或设置错误公式为false
     * true:可以解析,执行任务
     * false:无法解析,表达式错误(需要维护正确的表达式)或未维护(定时任务未开启或暂时停止)。每分钟会获取一下公式判断是否需要执行
     */
    private static boolean cron_suspend = true;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.addTriggerTask(
                () -> {//进行定时任务调用
                    if (cron_suspend) {
                        //可执行,进行任务调用
                        triggerTask();
                    } else {
                        log.warn("定时任务已暂停");
                    }
                },
                triggerContext -> {//设置定时任务执行公式
                    try {
                        String expression = getExpression();
                        log.info("获取定时公式:[{}]", expression);
                        if (!cron_suspend) {//当前未执行改为可执行
                            cron_suspend = true;
                        }
                        return new CronTrigger(expression).nextExecutionTime(triggerContext);
                    } catch (Exception e) {
                        log.error("获取公式执行失败,将暂停服务,一分钟后重新获取定时任务公式");
                        cron_suspend = false;
                        e.printStackTrace();
                        return new CronTrigger("0 * * * * ?").nextExecutionTime(triggerContext);
                    }
                }
        );
    }

    /**
     * 获取定时任务表达式
     *
     * @return 表达式
     */
    String getExpression() {
        //连接数据库获取定时任务
        return "0 * * * * ?";
    }

    /**
     * 触发任务
     */
    void triggerTask() {
        try {
            //执行任务
            String mag = "定时任务执行成功";
            log.info("定时任务执行完毕:[{}]", mag);
        } catch (Exception e) {
            log.error("定时任务执行完毕,结果无法解析(或执行任务异常,可通知开发检查)");
            e.printStackTrace();
        }
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2nTRIltqfA7y   2023年12月23日   25   0   0 MVCspringMVCspring
RJqwnp6UPIKw