美文网首页任务调度
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