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

定时任务的作用相信很多码友都知道,这里就简单介绍一下,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,这个第三方任务调度插件可以完成各种复杂需求,记得关注我哦,下一篇文章就会详细讲解。