springBoot自带定时任务schedule用法详解

定时任务不管哪个项目或多或少都会有用到,那定时任务可以用来干嘛?

定时任务的作用相信很多码友都知道,这里就简单介绍一下,spring项目启动后想对一些数据做同步,一些表数据要不定时统计,一些业务报表的汇总和生成,大量数据导入后台处理,一般都是用定时任务去处理,对于太占资源的任务需要后台处理,越复杂的系统定时任务也越多,需要监控的东西也很多。

springBoot也提供了简单的定时任务支持,文章中的代码也是接着上一次的项目来讲,也可以自己创建一个新项目,因为着节的内容没有很多复杂的配置。

1、创建定时任务业务实现类

在service创建一个ScheduleServiceImpl类

package com.apgblogs.springbootstudy.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

/**
 * @author xiaomianyang
 * @description
 * @date 2019-07-14 10:19
 */
@Service
public class ScheduleServiceImpl {

    private Logger logger= LoggerFactory.getLogger(ScheduleServiceImpl.class);

    int count1 = 1;
    int count2 = 1;
    int count3 = 1;

    @Scheduled(fixedRate = 1000)
    @Async
    public void jobFixedRate(){
        Thread.currentThread().setName("间隔执行");
        logger.info("{}.执行第{}次",Thread.currentThread().getName(),count1++);
    }

    @Scheduled(fixedRateString = "${job.fixedRate}")
    @Async
    public void jobFixedRateString(){
        Thread.currentThread().setName("spel表达式间隔执行");
        logger.info("{}.执行第{}次",Thread.currentThread().getName(),count2++);
    }

    @Scheduled(fixedDelay = 3000)
    @Async
    public void jobFixedDelay() throws InterruptedException{
        Thread.sleep(1000);
        Thread.currentThread().setName("上次任务完成后间隔执行");
        logger.info("{}.执行第{}次",Thread.currentThread().getName(),count3++);
    }

    @Scheduled(initialDelay = 8000,fixedRate = 1000)
    @Async
    public void jobInitialDelay(){
        Thread.currentThread().setName("spring容器完成后间隔执行");
        logger.info("{}.执行第{}次",Thread.currentThread().getName(),count3++);
    }

    @Scheduled(cron = "0 * 11 * * ?")
    @Async
    public void jobCron(){
        Thread.currentThread().setName("cron表达式执行");
        logger.info("{}.执行第{}次",Thread.currentThread().getName(),count3++);
    }
}

2、在启动类上添加启用调度注解

在启动类加上@EnableScheduling注解,我这里其他注解因为集成其他功能,如果是新项目就不用加了

package com.apgblogs.springbootstudy;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableJpaAuditing
@MapperScan("com.apgblogs.springbootstudy.dao")
@EnableCaching
@EnableScheduling
public class SpringBootStudyApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootStudyApplication.class, args);
    }

}

3、启动并测试定时任务的执行情况

可以看到输出的日志,说明定时任务就起作用了

4、cron表达式一些常用格式

cron表达式是很强大的,对于各种复杂的定时计划都能表示,比如每年的那个月那一天那个时间范围内每隔多少秒去执行,cron表达式都可以表示出来,下面是一些常用的时间格式

5、文章源码地址

码云:https://gitee.com/apgblogs/springBootStudy/tree/schdule/

现在定时任务就已经可以使用了,如果项目中有这种需求的就可以这样来处理了,但是有个问题,上面的需求只能满足固定的时间,那假如用户想自定义任务执行时间呢,或者用户想手动执行呢,这个springBoot的schedule就很难满足需求了,这时候就会用到比较强大的quartz,这个第三方任务调度插件可以完成各种复杂需求,记得关注我哦,下一篇文章就会详细讲解。

发表评论