SpringBoot项目中使用定时任务
一 问题描述
写的这个签到项目有个功能就是统计从第几天到第几天的在线时长情况,不用精确到某一天第几分钟在线不在线,而是只要知道某天在线多长时间就可以了,那我们只需要每一天的总在线时长就行。
二 解决办法
SpringBoot内置定时任务scheduled
2.1 开启SpringBoot定时任务功能
在SpringBoot的朱启动程序添加注解
@EnableScheduling
2.2 创建定时任务
该类是需要交给Spring容器管理的,类名上加上
@Component
三 关于@Scheduled
注解属性
3.1 cron
cornexpression表达式的意思
字段 | 允许值 | 允许特殊字符 |
---|---|---|
秒 | 0-59 | - * , / |
分 | 0-59 | - * , / |
小时 | 0-23 | - * , / |
日 | 1-31 | - * , ? / L W |
月 | 1-12或JAN-DEC | - * , / |
周 | 1-7或SUN-SAT | - * , ? / L # |
年 | 留空或1970-2099 | - * , / |
3.1.2 表达式详解:
完整字段:[秒] [分] [小时] [日] [月] [周] [年]
3.1.3 注
- *表示所有值,在分钟里表示每一分钟触发。在小时,日期,月份等里面表示每一小时,每一日,每一月。
- ?表示不指定值。表示不关心当前位置设置的值。 比如不关心是周几,则周的位置填写?。 主要是由于日期跟周是有重复的所以两者必须有一者设置为?
- -表示区间。小时设置为10-12表示10,11,12点均会触发。
- ,表示多个值。 小时设置成10,12表示10点和12点会触发。
- / 表示递增触发。 5/15表示从第5秒开始,每隔15秒触发。或者*/20,表示每隔20秒执行一次。
- L 表示最后的意思。 日上表示最后一天。星期上表示星期六或7。 L前加数据,表示该数据的最后一个。星期上设置6L表示最后一个星期五。 6表示星期五
- W表示离指定日期最近的工作日触发。15W离该月15号最近的工作日触发。
- .#表示每月的第几个周几。 6#3表示该月的第三个周五。
3.1.4 实例
例子 | 解释 |
---|---|
0 0 12 * * ? | 每天中午12点触发 |
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 0 */2 * * ? | 每两个小时 |
3.2 fixedRate
上一次开始执行时间点向后延迟多少时间执行,单位是毫秒
//上一次开始执行时间点向后每隔20秒执行一次。
@Scheduled(fixedRate = 20000):
3.3 fixedDelay
上一次执行完毕时间点向后延迟多少时间执行,单位是毫秒
//上一次执行完毕时间点向后每隔20秒执行一次。
@Scheduled(fixedDelay = 20000):
3.4 nitialDelay
可以和fixedRate、fixedDelay组合使用
//第一次延迟6秒后执行,之后按fixedRate的规则每20秒执行一次。
@Scheduled(initialDelay=6000, fixedRate=20000)