SpringBoot使用注解@Scheduled(多线程定时任务)

SpringBoot使⽤注解@Scheduled(多线程定时任务)最近做了⼀个定时任务的⼩⼯具,⽤到了注解@Scheduled,所以记录整理⼀下
1 SpringBoot集成Scheduled
1.1 添加maven依赖包
我这⾥是使⽤SpringBoot, Spring Scheduled已经包含在spring-boot-starter模块中
<dependencies>matlab
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
1.2 在启动类添加@EnableScheduling注解
在SpringBoot的启动类中增加@EnableScheduling注解启⽤定时任务。
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args){
SpringApplication.run(DemoApplication.class, args);
}
}
1.3 添加定时任务
在定时任务类,需要加上@Component注解
@Component
public class TetsJob{
@Scheduled(cron ="0/30 * * * * *")
public void job1(){
System.out.println ("Job1 Run By Cron: The time is now "+dateFormat().format(new Date()));
}
}
1.4 任务调度器
1.4.1 Corn表达式
类似Linux下的Cron表达式时间定义规则,Cron表达式由6或7个字段组成,空格分隔,如下图:
通配符说明
1. *表⽰所有值。 例如:在分的字段上设置 *,表⽰每⼀分钟都会触发。
2. ? 表⽰不指定值。使⽤的场景为不需要关⼼当前设置这个字段的值。例如:要在每⽉的10号触发⼀个操作,但不关⼼是周⼏,所以需要
周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?
3. -表⽰区间。例如 在⼩时上设置 “10-12”,表⽰ 10,11,12点都会触发。
4. , 表⽰指定多个值,例如在周字段上设置 “MON,WED,FRI” 表⽰周⼀,周三和周五触发
5. / ⽤于递增触发。如在秒上⾯设置”5/15” 表⽰从5秒开始,每增15秒触发(5,20,35,50)。 在⽉字段上设置’1/3’所⽰每⽉1号
开始,每隔三天触发⼀次。
6. L 表⽰最后的意思。在⽇字段设置上,表⽰当⽉的最后⼀天(依据当前⽉份,如果是⼆⽉还会依据是否是润年[leap]), 在周字段上表⽰
星期六,相当于”7”或”SAT”。如果在”L”前加上数字,则表⽰该数据的最后⼀个。例如在周字段上设置”6L”这样的格式,则表⽰“本⽉最后⼀个星期五”
7. W 表⽰离指定⽇期的最近那个⼯作⽇(周⼀⾄周五). 例如在⽇字段上置”15W”,表⽰离每⽉15号最近的那个⼯作⽇触发。如果15号
正好是周六,则最近的周五(14号)触发, 如果15号是周未,则最近的下周⼀(16号)触发.如果15号正好在⼯作⽇(周⼀⾄周五),则就在该天触发。如果指定格式为 “1W”,它则表⽰每⽉1号往后最近的⼯作⽇触发。如果1号正是周六,则将在3号下周⼀触发。
(注,”W”前只能设置具体的数字,不允许区间”-“)。
8. #序号(表⽰每⽉的第⼏个周⼏),例如在周字段上设置”6#3”表⽰在每⽉的第三个周六.注意如果指定”#5”,正好第五周没有周六,
则不会触发该配置(⽤在母亲节和⽗亲节再合适不过了) ;⼩提⽰:’L’和 ‘W’可以⼀组合使⽤。如果在⽇字段上设置”LW”,则表⽰在本⽉的最后⼀个⼯作⽇触发;周字段的设置,若使⽤英⽂字母是不区分⼤⼩写的,即MON与mon相同。
⽰例
每隔5秒执⾏⼀次:*/5 * * * * ?
每隔1分钟执⾏⼀次:0 */1 * * * ?
每天23点执⾏⼀次:0 0 23 * * ?
每天凌晨1点执⾏⼀次:0 0 1 * * ?
每⽉1号凌晨1点执⾏⼀次:0 0 1 1 * ?
每⽉最后⼀天23点执⾏⼀次:0 0 23 L * ?
每周星期天凌晨1点实⾏⼀次:0 0 1 ? * L
在26分、29分、33分执⾏⼀次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执⾏⼀次:0 0 0,13,18,21 * * ?
@Scheduled(cron ="0/30 * * * * *")
public void job1(){
System.out.println ("Job1 Run By Cron: The time is now "+dateFormat().format(new Date()));
}
//通过application.propertis或者l配置⽂件来动态配置CRON表达式。
//占位符(配置⽂件中有配置:cron.Job2Time = 0/30 * * * * *):
@Scheduled(cron ="${cron.Job2Time}")//每20秒执⾏⼀次
public void Job2(){
System.out.println ("Job2 Run By Cron: The time is now "+dateFormat().format(new Date()));
}
1.4.2 固定频率任务
fixedRate 表⽰⼀个固定频率执⾏,上个任务开始后多长时间后开始执⾏。
fixedRateString 和 fixedRate 意思相同,只是使⽤字符串的形式且⽀持占位符。
注意:当⽅法的执⾏时间超过任务调度的固定频率时,调度器会在当前⽅法执⾏完成后⽴即执⾏下次任务。
@Scheduled(fixedRate =1000*20)//每20秒执⾏⼀次
public void Job1(){
System.out.println ("Job1 Run By Rate: The time is now "+dateFormat().format(new Date()));
}
@Scheduled(fixedRateString ="20000")//每20秒执⾏⼀次
public void Job2(){
System.out.println ("Job2 Run By Rate: The time is now "+dateFormat().format(new Date()));
}
//占位符(配置⽂件中有配置:time.fixedRate =20000):
@Scheduled(fixedRateString ="${time.fixedRate}")//每20秒执⾏⼀次
public void Job3(){
System.out.println ("Job3 Run By Rate: The time is now "+dateFormat().format(new Date()));
}
1.4.3 固定间隔任务 fixedDelay 和 fixedDelayString
fixedDelay 表⽰⼀个固定延迟时间执⾏,上个任务完成后,延迟多久执⾏。
fixedDelayString 和fixedDelay 意思相同,只是使⽤字符串的形式且⽀持占位符。
@Scheduled(fixedDelay =1000*20)//上个任务结束后的20秒执⾏
public void Job1(){
System.out.println ("Job1 Run By Delay: The time is now "+dateFormat().format(new Date()));
}
@Scheduled(fixedDelayString ="20000")//上个任务结束后的20秒执⾏
public void Job2(){
System.out.println ("Job2 Run By Delay: The time is now "+dateFormat().format(new Date()));
}
//占位符(配置⽂件中有配置:time.fixedDelay=20000):
@Scheduled(fixedDelayString ="${time.fixedDelay}")//上个任务结束后的20秒执⾏
public void Job3(){
System.out.println ("Job3 Run By Delay: The time is now "+dateFormat().format(new Date()));
}
1.4.4 第⼀次延迟执⾏
initialDelay 表⽰⼀个固定延迟时间执⾏,上个任务完成后,延迟多久执⾏。
initialDelayString 和initialDelay 意思相同,只是使⽤字符串的形式且⽀持占位符。
@Scheduled(initialDelay=1000,fixedDelay =1000*20)//第⼀次延迟1秒后执⾏,之后按fixedDelay 的规则,上个任务结束后的20秒执⾏
public void Job1(){
System.out.println ("Job1 Run By Delay: The time is now "+dateFormat().format(new Date()));
}
@Scheduled(initialDelayString="1000",fixedDelayString ="20000")//第⼀次延迟1秒后执⾏,之后按fixedDelay 的规则,上个任务结束后的20秒执⾏
public void Job2(){
System.out.println ("Job2 Run By Delay: The time is now "+dateFormat().format(new Date()));
oah
}
//占位符(配置⽂件中有配置:time.initialDelay=1000,time.fixedDelay=20000):
@Scheduled(initialDelayString="${time.initialDelay}",fixedDelayString ="${time.fixedDelay}")//第⼀次
延迟1秒后执⾏,之后按fixedDelay 的规则,上个任务结束后的20秒执⾏
public void Job3(){
System.out.println ("Job3 Run By Delay: The time is now "+dateFormat().format(new Date()));
}
2 Schedule多线程
默认的 ConcurrentTaskScheduler 计划执⾏器采⽤wSingleThreadScheduledExecutor() 实现单线程的执⾏器。
因此:
对于同⼀个调度任务的执⾏总是同⼀个线程。如果任务的执⾏时间超过该任务的下⼀次执⾏时间,则会出现任务丢失,跳过该段时间的任务。
对于多个不同的调度任务在执⾏时间上有交集,在执⾏任务A的过程中,到了任务B的执⾏时间,任务B被阻塞,等待任务A完成后再执⾏任务B
⽅法⼀和⽅法⼆是有区别的,请根据实际场景需要进⾏选择
2.1 启⽤多线程⽅法⼀:注解@EnableAsync和@Async
使⽤该⽅法能够:
1. 对于同⼀个调度任务的执⾏,如果任务的执⾏时间超过该任务的下⼀次执⾏时间,会启动另外⼀个线程去执⾏,不会跳造成任务丢失
(前提:有空闲线程去执⾏)
2. 对于多个不同的调度任务在执⾏时间上有交集,在执⾏任务A的过程中,到了任务B的执⾏时间,任务B不会阻塞,不需要等待任务A
完成,会启动另外⼀个线程去执⾏任务B(前提:有空闲线程去执⾏)
2.1.1 在启动类加⼊注解@EnableAsync
@EnableAsync
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args){
SpringApplication.run(DemoApplication.class, args);
}
}
2.1.2 在需要多线程异步执⾏的定时任务加⼊注解@Async
@Scheduled(cron ="0/30 * * * * *")
public void job1(){
System.out.println ("Job1 Run By Cron: The time is now "+dateFormat().format(new Date()));
}
2.2 启⽤多线程⽅法⼆:⾃定义线程池
使⽤该⽅法:
1. 对于同⼀个调度任务的执⾏还是单线程去执⾏。如果任务的执⾏时间超过该任务的下⼀次执⾏时间,则会出现任务丢失,跳过该段时
间的任务。
2. 对于多个不同的调度任务在执⾏时间上有交集,在执⾏任务A的过程中,到了任务B的执⾏时间,任务B不会阻塞,不需要等待任务A
无锡市机关幼儿园完成,会启动另外⼀个线程去执⾏任务B(前提:有空闲线程去执⾏)
2.2.1新增⼀个配置类,实现SchedulingConfigurer接⼝。重写configureTasks⽅法,通过taskRegistrar设置⾃定义线程池。
@Configuration
七台河市高级中学public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor(){
wScheduledThreadPool(10);
}
}
参考⽂章
瓶颈效应1. springboot集成schedule(深度理解)
2. Spring中@Scheduled注解的使⽤

本文发布于:2024-09-22 06:42:50,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/284595.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:任务   时间   设置   需要
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议