可调度的定时任务,根据用户操作变更执行频率

一次实际开发中用到的,参考别人的写法完成的,简单记录一下。
实现思路是,有一张设置表,里面固定只有id为1的一条数据(建表的时候就要insert好),作为模块设置参数,用户在页面更改参数时,修改设置存在表里(实际上入库之前就有代码检查定时参数是不是有更改,有的话会执行完更改再入库)。系统第一次运行时读取数据库设置表的参数开启定时任务,后面每次修改设置表都会检查,如果和已有设置不一样,就会set新的cron表达式给定时任务类(这个类的执行是托管给Spring的)。
代码贴一下:


/**
 * @author liumeixiang
 * @description:动态修改定时任务cron参数
 */
@Component
@EnableScheduling
public class UpdateTimeCronUtil implements SchedulingConfigurer {

    @Autowired
    private DemoServiceImpl demoService;
    
  //  private static final String DEFAULT_CRON = "0/10 0/1 * * * ?"用于测试,十秒一次
    /**
     * 默认值,从数据库读取,这里因为我的常量类里在系统启动时有加载过设置表数据了,所以可以不* 用重新查表,反正就是这个定时频率要从数据库获取,不然你系统第一次启动的时候没用上配置表,这* 是不合理的
     */
    private static final String DEFAULT_CRON = Constants.DEFAULT_CRON;
    //Constants是常量类,里面存放后续要用到的cron表达式

    private String cron = DEFAULT_CRON;
    int i = 0;

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(new Runnable() {
            @Override
            public void run() {
            //------------------------------------------------------
            这里是你的定时任务具体做的事情
               demoService.doSomething();
            //-----------------------------------------------------   
                i++;
                // 任务逻辑
                DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(TimeUtils.DB_TIME_PATTERN_F2);
                String s1 = LocalDateTime.now().format(dateTimeFormatter);
                System.out.println("定时任务:第" + (i) + "次执行任务... " + "此次执行时间:【" + s1 + "】");
            }
        }, new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                // 定时任务触发,通过cron的改变,可修改定时任务的执行周期
                CronTrigger trigger = new CronTrigger(cron);
                Date nextExecDate = trigger.nextExecutionTime(triggerContext);
                return nextExecDate;
            }
        });
    }
/*
--------------------------------------------下面是定时任务修改的入口,业务逻辑编写时,在需要修改执行频率的地方,调用setCron方法给一个新的表达式就行,你的cron表达式要作为final String 提前存放在常量类Constants里。---------------------------------------------------------------------------------------------------------------------
*/
    public void setCron(String cron) {
        this.cron = cron;
 //下面这行仅用于测试,可不保留
        System.out.println("请注意,定时任务表达式已变更哦!新的表达式为:"+cron);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值