1.直接设置参数在方法名上面
MyTask.java
package com.guilf.task; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import java.util.Date; /** * 自定义任务类. * */ @Configuration @EnableScheduling public class MyTask { /** * @Scheduled 详细参数说明: * * 1.corn 指定:秒,分钟,小时,日期,月份,星期,年(可选) * 2.fixedDelay 从上一个任务完成到下一个任务开始的间隔,单位是毫秒 * 3.fixedDelayString 同上,只是字符串类型. * 4.fixedRate 从上一个任务开始到下一个任务开始的间隔,单位是毫秒 * 5.fixedRateString 同上,只是字符串类型. * 6.initialDelay 任务第一次执行前需要延迟的毫秒数 * 7.initialDelayString 同上,只是字符串类型. * 8.zone 指定时区 * */ /** * 这个方法每10秒打印一次. * 使用cron表达式 指定:秒,分钟,小时,日期,月份,星期,年(可选). */ @Scheduled(cron = "0/10 * * * * *") public void test() { System.out.println("test1......" + new Date().getTime()); } /** * 每隔6秒执行. */ // @Scheduled(fixedDelay = 6000) // public void test2() { // System.out.println("test2..." + new Date().getTime()); // } // @Scheduled(fixedDelayString = "5000") // public void test3(){ // System.out.println("test3..."+new Date().getTime()); // } }
2.把参数设在文件里面
2.1 设置方法
/** * 使用外部的cron 表达式. */ @Scheduled(cron = "${my.cron}") public void test4() { System.out.println("test4..." + new Date().getTime()); }
2.2 设置参数
application.yml
##CRON表达式 含义 # "0 0 12 * * ?" 每天中午十二点触发 # "0 15 10 ? * *" 每天早上10:15触发 # "0 15 10 * * ?" 每天早上10:15触发 # "0 15 10 * * ? *" 每天早上10:15触发 # "0 15 10 * * ? 2005" 2005年的每天早上10:15触发 # “0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发 # "0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发 # "0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 ## "0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发 # "0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发 # "0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发 my: cron: '0/5 * * * * ?'
3.DynamicTask.java
package com.guilf.task; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; import org.springframework.scheduling.support.CronTrigger; import org.springframework.stereotype.Component; import java.util.Date; /** * 动态修改定时任务. * Created by hong on 2017/6/30. */ @Component @EnableScheduling public class DynamicTask implements SchedulingConfigurer { /** * ① 在定时任务类上增加@EnabledScheduling注解,并实现SchedulingConfigurer接口。 * ② 设置一个静态的cron,用于存放任务执行周期参数。 * ③ 开启一个线程,用于模拟实际业务中外部原因修改了任务执行周期。 * ④ 设置任务触发器,触发任务执行。 */ /** * 默认cron参数. */ private static final String DEFAULT_CRON = "0/5 * * * * ?"; /** * 动态修改的cron参数. */ private String cron = DEFAULT_CRON; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( new Runnable() { //设置定时任务执行点. @Override public void run() { System.out.println("定时执行的任务." + new Date().getTime()); } }, // 设置定时任务. new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { // 定时任务触发,可修改定时任务的执行周期 CronTrigger trigger = new CronTrigger(cron); Date nextExecDate = trigger.nextExecutionTime(triggerContext); return nextExecDate; } }); } public void setCron(String cron) { this.cron = cron; } }
DynamicTaskController.java
package com.guilf.mvc; import com.guilf.task.DynamicTask; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * */ @RestController public class DynamicTaskController { @Autowired private DynamicTask dynamicTask; private static final String DEFAULT_CRON = "0/10 * * * * ?"; /** * 动态修改定时任务. * @return */ @GetMapping("/dynamicTask") public String dynamicTask(){ dynamicTask.setCron(DEFAULT_CRON); return DEFAULT_CRON; } }