Spring Boot @Scheduled 定时任务
Spring Boot Java cron About 3,683 words创建定时任务
添加@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
注解,让定时任务支持异步执行;
- 若任务执行时间大于1秒(此处设置的是
- @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
秒钟/1
分钟/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 0 * * * ?"
每小时触发"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 * 21-23,0-5 * * ?"
晚上9
点到第二天凌晨5
点,每一分钟执行一次(跨天执行)"0 * 17-23/2,8 * * ?"
17
点到23
点每隔两小时和上午8
点,每一分钟执行一次"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
触发
Views: 5,482 · Posted: 2019-12-16
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...