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());
}
}
}
总结
第二、三点是好文啊,向大佬鞠躬。