Spring Boot 实现定时任务

110 篇文章 0 订阅
29 篇文章 0 订阅

时间问题,今天就直奔主题。 
在实际项目开发中,难免会遇到定时执行任务的场景;比方说,每隔多少时间需要做什么事情;每隔月的几号定时做什么事情;像这样的业务需求,会经常遇到;那么怎么去实现这样的业务需求呢。刚好最近使用spring Boot开发项目,我就以Spring Boot为例简述:

翻阅了下Spring Boot中有现成的定时注解使用,先来Code: 
实现目标是:每隔10秒定时执行 

[java]  view plain  copy
  1. /**  
  2. * 定时任务  
  3. * @author Liz  
  4. * 2017-05-25  
  5. */   
  6. @Component   
  7. @EnableScheduling   
  8. @Service  
  9. @Transactional  
  10. public class ScheduledTaskService {  
  11.   
  12.     /** 
  13.      * 目标:实现定时任务;实例中是每隔3秒钟执行一次 
  14.      */  
  15.       
  16.     private Integer count_first = 1;  
  17.     private Integer count_second = 1;  
  18.     private Integer count_three = 1;  
  19.       
  20.     @Scheduled(fixedRate = 10000)  
  21.     public void printCurrentTime() throws InterruptedException {  
  22.         System.out.println(String.format("① 第%s次执行,当前时间为:%s", count_first++, dateFormat.format(new Date())));  
  23.     }  
  24.       
  25.     @Scheduled(fixedDelay = 10000)  
  26.     public void printCurrentTimeAfterSleep() throws InterruptedException {  
  27.         System.out.println(String.format("② 第%s次执行,当前时间为:%s", count_second++, dateFormat.format(new Date())));  
  28.     }  
  29.       
  30.     @Scheduled(cron = "*/10 * * * * *")  
  31.     public void printCurrentTimeCron() throws InterruptedException {  
  32.         System.out.println(String.format("③ 第%s次执行,当前时间为:%s", count_three++, dateFormat.format(new Date())));  
  33.     }  
  34.       
  35.     private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  36.       
  37. }   

1.Spring Boot 实现就是这么简洁,其中:

@Scheduled添加在所要定时执行的方法上 
@Component和@EnableScheduling:标注启动定时任务

不难发现@Scheduled中的表达式不同,但是实现同样的功能

1)fixedRate = 10000表示每隔10000ms,Spring scheduling会调用一次该方法,不论该方法的执行时间是多少 
2)fixedDelay = 10000表示当方法执行完毕10000后,Spring scheduling会再次调用该方法 
3)cron = “/10 * * * * *”提供了一种通用的定时任务表达式,这里表示每隔10秒执行一次,更加详细的信息可以参考cron表达式。

2.cron表达式(摘取)

介绍一个cron Expression 表达式。

这一部分是摘抄的:

字段 允许值 允许的特殊字符
0-59 , - * /
0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * / L C #
年(可选) 留空, 1970-2099 , - * /

如上面的表达式所示:

”字符被用来指定所有的值。如:”“在分钟的字段域里表示“每分钟”。

“-”字符被用来指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点”。

“,”字符被用来指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”.

“?”字符只在日期域和星期域中使用。它被用来指定“非明确的值”。当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。看下面的例子你就会明白。

“L”字符指定在月或者星期中的某天(最后一天)。即“Last ”的缩写。但是在星期和月中“L”表示不同的意思,如:在月子段中“L”指月份的最后一天-1月31日,2月28日,如果在星期字段中则简单的表示为“7”或者“SAT”。如果在星期字段中在某个value值得后面,则表示“某月的最后一个星期value”,如“6L”表示某月的最后一个星期五。

“W”字符只能用在月份字段中,该字段指定了离指定日期最近的那个星期日。

“#”字符只能用在星期字段,该字段指定了第几个星期value在某月中

每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。表7.1中显示了一些cron表达式的例子和它们的意义:

表达式 意义
“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触发
0 6 * * * 每天早上6点
0 /2 * * 每两个小时
0 23-7/2,8 * * * 晚上11点到早上8点之间每两个小时,早上八点
0 11 4 * 1-3 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 4 1 1 *

1月1日早上4点

3.quartz实现定时任务

quartz中的触发器,设计某个时候触发执行 
使用的话,在Spring Boot 添加maven依赖包

[java]  view plain  copy
  1. <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->  
  2. <dependency>  
  3. <groupId>org.quartz-scheduler</groupId>  
  4. <artifactId>quartz</artifactId>  
  5. <version>2.2.3</version>  
  6. </dependency>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值