美文网首页任务调度
Springboot 中定时任务

Springboot 中定时任务

作者: Geroge1226 | 来源:发表于2021-01-04 16:11 被阅读0次

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的频率执行某个过程,不管前面的过程是否还在进行,一般用于可以独立、并行的执行过程

相关文章

网友评论

    本文标题:Springboot 中定时任务

    本文链接:https://www.haomeiwen.com/subject/zngmoktx.html