SpringBoot 动态修改 cron 表达式

在实际项目开发中,定时任务是经常使用到的,例如周期性地完成某些任务。在 SpringBoot 项目中,我们通常使用的是 @Scheduled 注解来完成设置定时任务规则,但是有时候我们需要对周期性的时间设置做一些改变,那么这个时候使用此注解就不太方便了,原因在于这个注解中配置的 cron 表达式必须是常量,那么当我们修改定时参数的时候,就需要重新编译打包,重新部署。实际使用起来不是很方便。

为了实际项目不需要重新编译,我们需要动态配置 cron 表达式。一种可能的实现方式,是实现 SchedulingConfigurer 接口,步骤如下。

一、添加 @EnableScheduling 注解
可以在 SpringBoot 的启动类上添加开启定时任务注解,也可以在具体的定时任务类上添加该注解,以下两种方法都是可行的。
1.1 启动类加注解

package *****;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
@EnableTransactionManagement
@EnableScheduling
public class TestServerApplication {
    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(TestServerApplication .class);
        springApplication.run(args);
    }
}

1.2 定时任务类加注解
本文代码示例使用的此种方法,见下方源码。

二、定义具体任务,实现 SchedulingConfigurer 接口。

package *****.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class TestTask implements SchedulingConfigurer {
    private static Logger logger = LoggerFactory.getLogger(TestTask.class);

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // TODO: 2019/4/19 定时任务表达式,实际项目可以从配置文件、数据库等中获取
        String cron = "0 0 8,23 * * *";
        taskRegistrar.addCronTask(new Runnable() {
            @Override
            public void run() {
                // TODO: 2019/4/19 具体要做的任务,例如:输出
                System.out.println("===== test cron ok =====");
            }
        }, cron);
    }
}

定时任务还有其他实现方法,本文只写一种。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值