一、实现步骤
备注:本文介绍的方法可以动态修改执行周期,其实就是通过修改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); } }
原文:https://www.cnblogs.com/puzhichao/p/12158797.html