定时任务不管哪个项目或多或少都会有用到,那定时任务可以用来干嘛?
定时任务的作用相信很多码友都知道,这里就简单介绍一下,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、文章源码地址
现在定时任务就已经可以使用了,如果项目中有这种需求的就可以这样来处理了,但是有个问题,上面的需求只能满足固定的时间,那假如用户想自定义任务执行时间呢,或者用户想手动执行呢,这个springBoot的schedule就很难满足需求了,这时候就会用到比较强大的quartz,这个第三方任务调度插件可以完成各种复杂需求,记得关注我哦,下一篇文章就会详细讲解。