1、背景
定时任务处理监控数据是最常见的业务场景,如: 活动到结束时间时自动将状态更新为过期状态。 跑批检查漏处理的数据补漏处理等等。我这里先借助springboot 自带@Scheduled注解来编写定时任务。
2、Springboot自带定时任务实现
- 项目为
springboot-web
项目pom
包部分说明如下:
<spring-boot.version>2.1.4.RELEASE</spring-boot.version>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 启动类上添加
@EnableScheduling
@SpringBootApplication
@ServletComponentScan
@EnableFeignClients
@EnableScheduling
public class NextstoreJobApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(NextstoreJobApplication.class, args);
}
}
- 定时任务类
@Component
@Slf4j
public class SportExpJobSchedule {
@Autowired
private SportAppMotionService sportAppMotionService;
// 定时处理未处理运动数据
@Scheduled(cron = "1/2 * * * * ?")
public void dealSportUnSendExp(){
long begin = System.currentTimeMillis();
log.info("=======> 处理未赠送exp运动数据开始");
long end = System.currentTimeMillis();
log.info("=======> 处理未赠送exp运动数据结束,共耗时:{}",end-begin);
}
}
以上就是简单springboot 定时任务的代码实现。
3、Springboot定时任务中的常见问题
3.1 cron 表达式规则
* 第一位,表示秒,取值 0-59
* 第二位,表示分,取值 0-59
* 第三位,表示小时,取值 0-23
* 第四位,日期,取值 1-31
* 第五位,月份,取值 1-12
* 第六位,星期几,取值 1-7
* 第七位,年份,可以留空,取值 1970-2099
(*) 星号:可以理解为“每”的意思,每秒、没分
(?) 问好:只能出现在日期和星期这两个位置,表示这个位置的值不确定
(-) 表达一个范围,如在小时字段中使用 10-12 ,表示从10点到12点
(,) 逗号,表达一个列表值,如在星期字段中使用 1,2,4 ,则表示星期一、星期二、星期四
(/) 斜杠,如 x/y ,x是开始值,y是步长,如在第一位(秒)使用 0/15,表示从0秒开始,每15秒
官方解释:
0 0 3 * * ? 每天 3 点执行
0 5 3 * * ? 每天 3 点 5 分执行
0 5 3 ? * * 每天 3 点 5 分执行
0 5/10 3 * * ? 每天 3 点 5 分,15 分,25 分,35 分,45 分,55 分这几个点执行
0 10 3 ? * 1 每周星期天的 3 点10 分执行,注:1 表示星期天
0 10 3 ? * 1#3 每个月的第三个星期的星期天 执行,#号只能出现在星期的位置
注:第六位(星期几)中的数字可能表达不太正确,可以使用英文缩写来表示,如:Sun
3.2 corn表达式、fixedRate、fixedDelay的区别
image.png以上图像做说明如下:
- fixedDelay控制方法执行的间隔时间(毫秒),是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。上个过程结束后,等待300ms,执行下个过程
- fixedRate是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。以固定300ms的频率执行某个过程,不管前面的过程是否还在进行,一般用于可以独立、并行的执行过程
网友评论