SpringBoot自带的定时功能

Posted 紫翌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot自带的定时功能相关的知识,希望对你有一定的参考价值。

一、实现步骤

备注:本文介绍的方法可以动态修改执行周期,其实就是通过修改cron值达到修改执行周期,修改cron的值的方法看具体使用情况。

① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。
② 设置一个静态的cron,用于存放任务执行周期参数。(本文介绍的方法可以动态修改执行周期)

二、实现代码示例

代码中向控制台打印的部分,即是需要重复执行的片段

 1、无需修改执行周期用:第一种

@Component
@EnableScheduling //①步                ①步
public class TaskCronChangeController implements SchedulingConfigurer{

    public static String cron;  //②    
    //核心的主要是使用到了ScheduledTaskRegistrar这个类有一个方法addTriggerTask(Runnable,Trigger) 两个参数,
    //一个Runnable,一个是Trigger,在Runnable中执行业务逻辑代码,在Trigger修改定时任务的执行周期
    @Override
    public void configureTasks(ScheduledTaskRegistrar arg0) {
//秒,分钟,小时,日期,月份,星期,年 (相 对应) cron
="0/70 * * * * *";//间隔70秒触发一次 ,这个是固定死的, Runnable task = new Runnable() { //重复运行代码片段 @Override public void run() { //ApiController api = new ApiController(); //System.out.println(api.getdas()); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("I am going:" + LocalDateTime.now()); System.out.println("I am going:" + df.format(System.currentTimeMillis())); } }; Trigger trigger = new Trigger() { @Override public Date nextExecutionTime(TriggerContext arg1) { //任务触发,可修改任务的执行周期. //每一次任务触发,都会执行这里的方法一次,重新获取下一次的执行时间 //corn可以在这里再次获取,但是要在下下次才能生效 CronTrigger trigger = new CronTrigger(cron); Date nextExec = trigger.nextExecutionTime(arg1); return nextExec; }}; arg0.addTriggerTask(task, trigger); } }

2、需要修改执行周期:第二种

去这里看7分钟的视频讲解吧:https://v.youku.com/v_show/id_XMjY5NDg2OTA0MA==.html

注意红色部分,我是通过接口去实现改变的,方法很多,关键是如何取到cron的值,去访问数据库取也可以。

@RestController
@EnableScheduling
public class TaskCronChangeCtr implements SchedulingConfigurer{

    public String cron="0/25 * * * * *";
    
    @RequestMapping("/ChangCron")
    public String ChangCron(@RequestBody String param,HttpServletRequest request,HttpServletResponse response) throws IOException{
        response.setContentType("text/html;charset=utf-8");
        System.out.println(param);
        JSONObject json = JSONObject.fromObject(param);    
        cron=String.valueOf(json.get("cron"));
        //cron="0/10 * * * * *";//修改为10秒一次
        //response.getWriter().write("修改成功");
        return "修改成功";
    }
    
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        
        //秒,分钟,小时,日期,月份,星期,年 (相 对应)
//    cron="0/70 * * * * *";//间隔70秒触发一次
    
    Runnable  task = new Runnable() {
        //重复运行代码片段
        @Override
        public void run() {
            //ApiController api = new ApiController();
            //System.out.println(api.getdas());
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("I am going:" + LocalDateTime.now());
            System.out.println("I am going:" + df.format(System.currentTimeMillis()));

        }
    
     };
    Trigger trigger = new Trigger() {
    @Override
    public Date nextExecutionTime(TriggerContext arg1) {
        //任务触发,可修改任务的执行周期.
        //每一次任务触发,都会执行这里的方法一次,重新获取下一次的执行时间 
        //corn可以在这里再次获取,但是要在下下次才能生效
        CronTrigger trigger = new CronTrigger(cron);
        Date nextExec = trigger.nextExecutionTime(arg1);
        return nextExec;

    }};
    taskRegistrar.addTriggerTask(task, trigger);
    }

}

以上是关于SpringBoot自带的定时功能的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot定时任务 - Spring自带的定时任务是如何实现的?有何注意点?

SpringBoot中并发定时任务的实现动态定时任务的实现(看这一篇就够了)

Springboot自带定时任务实现动态配置Cron参数

Springboot自带定时任务实现动态配置Cron参数

SpringBoot定时任务说明

SpringBoot集成Quartz动态定时任务