spring-boot实现定时任务(三种模式)

前言

1:工作上写了一个全定时任务的微服务模块,使用的@Scheduled。 2:网上剽窃到大佬一篇好文,记录下来,用以学习。

一、@Scheduled 注解(频率不可修改)

@EnableScheduling+@Scheduled 可以实现定时任务:
项目启动后,自动开始执行定时任务,定时频率不可修改
可搭配参数:
cron = /5 * * * * * 表示:每5秒执行一次
fixedDelay = 5 * 1000 表示:上一次执行完毕时间点之后5秒钟再执行
initialDelay = 2000 表示:第一次延迟多长时间后再执行

代码如下:

@Slf4j
@Component
@EnableScheduling
public class OverdueBookScheduler {
  	//AOP打印请求参数 
    //@BaseAroundAnnotation
    
    //每5秒钟查询一次
//    @Scheduled(fixedDelay = 5 * 1000, initialDelay = 2000)
    @Scheduled(cron = "*/5 * * * * *")
    public void getverdueBorrowBook(){
        log.info("开始执行定时任务:查询所有借阅超期的书籍");
    }
}

二、自动生效,启动后触发频率可修改

项目启动后,自动开始执行定时任务,定时频率可修改

代码如下(示例):

@Slf4j
@Component
@EnableScheduling  //放开即生效
@RestController
@RequestMapping(value = "scheuledOne")
public class TaskCronChange implements SchedulingConfigurer {
    //不需要 volatile ,因为cron参数是在主线程里,并不在执行逻辑时新生成的线程里
    public static String cron;

    public TaskCronChange() {
        //默认情况是:每5秒执行一次. 可以配置在nacos
        cron = "0/5 * * * * *";
    }

    /**
     * @Date 2021/12/1
     * @Describe 异步执行定时任务逻辑
     * 通过触发器设置下次定时任务执行周期
     **/
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        Runnable task = new Runnable() {
            @Override
            public void run() {
                //任务逻辑代码部分.
                log.info("TaskCronChange task is running ... " + new Date());
            }
        };
        Trigger trigger = new Trigger() {
            @Override
            public Date nextExecutionTime(TriggerContext triggerContext) {
                //任务触发,可修改任务的执行周期.
                CronTrigger trigger = new CronTrigger(cron);
                Date nextExec = trigger.nextExecutionTime(triggerContext);
                return nextExec;
            }
        };
        taskRegistrar.addTriggerTask(task, trigger);
    }

    /**
     * 外部动态修改定时任务的 cron
     **/
    @RequestMapping(value = "changeCron", method = RequestMethod.POST)
    public BaseResponse changeCron(@RequestBody JSONObject jsonObject) {
        String newCron = jsonObject.getString("cron");
        cron = newCron;
        return new BaseResponse(Msg.SUCCESS);
    }
}

三、手动控制定时任务(开启、关闭、修改频率)

项目启动后,定时任务没有自动执行,可通过接口控制:开启、关闭、修改频率
代码如下(示例):

@RestController
@Component
public class DynamicTask { 

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler; 

    private ScheduledFuture<?> future; 

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
       return new ThreadPoolTaskScheduler();
    } 

    @RequestMapping("/startCron")
    public String startCron() {

       future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("0/5 * * * * *"));
       System.out.println("DynamicTask.startCron()");
       return "startCron";
    } 

    @RequestMapping("/stopCron")
    public String stopCron() {

       if (future != null) {
           future.cancel(true);
       }
       System.out.println("DynamicTask.stopCron()");
       return "stopCron";
    }

    @RequestMapping("/changeCron10")
    public String startCron10() {

       stopCron();// 先停止,在开启.
       future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));
       System.out.println("DynamicTask.startCron10()");
       return "changeCron10";
    }

    private class MyRunnable implements Runnable {

       @Override
       public void run() {
           System.out.println("DynamicTask.MyRunnable.run()," + new Date());
       }
    } 
}

总结

第二、三点是好文啊,向大佬鞠躬。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值