Spring Boot @Scheduled 定时任务
Spring Boot Java cron 大约 3663 字创建定时任务
添加@EnableScheduling
注解,开启定时任务支持。
@EnableScheduling
@SpringBootApplication
public class ScheduledApplication {
public static void main(String[] args) {
SpringApplication.run(ScheduledApplication.class, args);
}
}
添加@Scheduled
注解,开启定时任务。
@Component
public class ScheduledTask {
@Scheduled(cron = "* * * * * ?")
public void scheduled() throws IOException {
System.out.println("任务执行时间:" + LocalDateTime.now());
}
}
配置定时任务线程池
方式零(推荐)
使用配置文件方式
spring:
task:
scheduling:
thread-name-prefix: my-scheduling-
pool:
size: 8
方式一
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
// 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
// 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
taskScheduler.setAwaitTerminationSeconds(60);
taskScheduler.setThreadNamePrefix("t-scheduler-");
taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return taskScheduler;
}
方式二
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
@Bean
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setScheduler(taskExecutor());
}
}
注解参数详解
- @Scheduled(cron = "0 0 8 * * ?"):通过cron表达式定义规则,每日早上8点执行。
- @Scheduled(fixedDelay = 1000):任务执行完毕之后延迟1秒(此处设置的是1秒)再执行下一次任务,需等待此次任务完成再延迟1秒。
- @Scheduled(fixedRate = 1000):
- 若任务执行时间大于1秒(此处设置的是1秒),则执行结束后立即开始下一次任务;
- 若执行时间小于1秒,则每隔1秒执行;
- 如果就想要每隔1秒执行效果可再添加
@Async
注解,让定时任务支持异步执行;
- @Scheduled(initialDelay = 1000, fixedRate = 1000):初始化时延迟1秒执行,
initialDelay
需配置fixedDelay
或fixedRate
。
cron规则
表达式
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
占位符解释
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒数 | 0~59 | - , * / |
分钟 | 0~59 | - , * / |
小时 | 0~23 | - , * / |
日期 | 1~31,需注意每个月的天数 | - , * / ? L W C |
月份 | 1~12或JAN-DEC | - , * / |
星期 | 1~7或SUN-SAT | - , * / ? L C # |
年份 | 1970~2099,可为空 | - , * / |
星期:1代表星期天(一星期的第一天),7代表星期六(一星期的最后一天)。
特殊字符
-
代表在指定的范围内触发,比如"25-45"代表从25秒开始触发到45秒结束触发,每隔1秒触发1次,
代表在指定的秒数触发,比如"0,15,45"代表0秒、15秒和45秒时触发任务*
代表每隔1秒钟触发/
代表触发步进(step),斜杠前面的值代表初始值,后面的值代表偏移量- "0/20"或"/20":从0秒钟开始,每隔20秒钟触发1次,即0秒触发1次,20秒触发1次,40秒触发1次
- "5/20":5秒触发1次,25秒触发1次,45秒触发1次
- "10-45/20":在[10,45]内步进20秒命中的时间点触发,即10秒触发1次,30秒触发1次
?
代表日期
和星期
互斥,即把日期
占位符标为问好则代表是指定星期
触发,把星期
占位符标为问好则代表是指定日期
触发L
(Last)若用在日期
上代表这个月最后一天;若用在星期
上代表这周的最后一天即星期六;若用在星期
上并且配合数字如"5L"代表这个月的最后一个星期四触发W
(Weekday)只用在日期
上,代表最接近指定天的工作日(周一到周五),比如"15W":最接近这个月第15天的工作日- 如果这个月第15天是周六,那么触发器将会在这个月第14天即周五触发
- 如果这个月第15天是周日,那么触发器将会在这个月第16天即周一触发
- 如果这个月第15天是周二,那么就在触发器这天触发
- 只会在当前月计算值,不会越过当前月
- "LW"代表这个月的最后一个工作日
#
只用在星期
上,代表这个月的第几个周几,比如"6#3"指这个月第3个周五(6指周五,3指第3个),如果指定的日期不存在,触发器就不会触发C
(Calendar)代表依靠一个指定的“日历”,没有“日历”关联,则等价于所有包含的“日历”- 用在
日期
上"5C"表示关联“日历”中第一天,或者这个月开始的第一天的后5天 - 用在
星期
上"1C"表示关联“日历”中第一天,或者星期的第一天的后1天,也就是周日的后一天(周一)
- 用在
举例
"0 * 21-23,0-5 * * ?"
晚上9点到第二天凌晨5点,每一分钟执行一次(跨天执行)"0 * 17-23/2,8 * * ?"
17点到23点每隔两小时和上午8点,每一分钟执行一次"0 0 12 * * ?"
每天中午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期间的每1分钟触发"0 0/5 14 * * ?"
在每天下午2点到下午2:55期间的每5分钟触发"0 0/5 14,18 * * ?"
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发"0 0-5 14 * * ?"
在每天下午2点到下午2:05期间的每1分钟触发"0 10,44 14 ? 3 WED"
每年三月的星期三的下午2:10和2:44触发"0 15 10 ? * MON-FRI"
周一至周五的上午10:15触发"0 15 10 15 * ?"
每月15日上午10:15触发"0 15 10 L * ?"
每月最后一日的上午10:15触发"0 15 10 ? * 6L"
每月的最后一个星期五上午10:15触发"0 15 10 ? * 6L 2002-2005"
2002年至2005年的每月的最后一个星期五上午10:15触发"0 15 10 ? * 6#3"
每月的第三个星期五上午10:15触发
阅读 4891 · 发布于 2019-12-16
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb扫描下方二维码关注公众号和小程序↓↓↓

昵称: