本文记录在SpringBoot中使用定时任务。

  在我们的项目中,经常需要用到定时任务去帮我们做一些事情,比如服务状态监控,业务数据状态的更改等,SpringBoot中实现定时任务有2中方案,一种是自带的,我们只需要加上注解即可;另一种是集成Quartz来实现定时任务。

一 SpringBoot 提供的定时任务

  在SpringBoot的starter包中已经提供了对定时任务的支持,我们很容易实现定时任务。修改pom.xml文件,加入如下内容,引入依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

  在启动类上加注@EnableScheduling 注解,开启定时任务

@SpringBootApplication
@EnableScheduling
public class TimingTaskApplication { public static void main(String[] args) {
SpringApplication.run(TimingTaskApplication.class, args);
} }

  创建定时任务类及要定时执行的方法

@Component
public class ScheduleTaskDemo { private int num1 = 0;
private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Scheduled(cron = "*/5 * * * * ?")
public void test1(){
System.out.println("这是test1方法第"+ (++num1) + "次执行,执行时间:"+df.format(new Date()));
} }

  @Component 注解 将当前类交给Spring容器管理

  @Scheduled 注解标明方法是一个定时执行的方法

  启动项目后可以看到控制台打印出的信息

  @Scheduled 注解有几个参数可以使用,每个参数的意义不一样,参数及执行规则说明如下:

  fixedRate @Scheduled(fixedRate = 5000) 上一次开始执行时间点之后每5秒执行一次;

  fixedDelay @Scheduled(fixedDelay = 5) 上一次执行完毕时间点之后每5秒执行一次;

  initialDelay @Scheduled(initialDelay = 1, fixedDelay = 6) 第一次延迟1秒后执行,之后按照fixedRate的规则执行;

  cron @Scheduled(cron = "*/5 * * * * ?") 一个表达式,一共有7位,一般只需要设置6为就可以了

  第一位:秒,取值范围是0-59;

  第二位:分,取值范围是0-59;

  第三位:时,取值范围0-23;

  第四位:日,取值范围1-31;

  第五位:月,取值范围1-12;

  第六位:星期,取值范围1-7,1代表星期日,2代表星期一,7代表星期六;

  第七位:年,取值范围1970-099,可以不设置。

  cron表达式也可以在http://cron.qqe2.com进行在线生成。

二 SpringBoot集成Quartz

     Quartz是用Java编写的一个开源的任务调度框架。提供了丰富的Api供调用,支持集群环境和持久化,支持多种配置,与SpringBoot可以无缝集成。

  Quartz几个关键元素:

  Job  代表要执行的任务,是个接口,提供了一个方法 execute(JobExecutionContext context);

  JobDetail  代表具体的要执行的任务;

  Trigger  代表调度任务的触发器,配置调度任务的执行规则;

  Scheduler  代表调度容器,一个调度容器中可以注册多个JobDetail和Trigger。

  元素关系如下图:

  SpringBoot对Quartz已经提供了支持,我们可以很容易的使用,在pom.xml文件中引入依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

  在启动类上加注解 @EnableScheduling ,开启定时执行。

  创建一个要执行的任务继承QuartzJobBean,输出任务执行时间

public class MyTask1 extends QuartzJobBean {

    private DateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm:ss");

    @Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("MyTask1 执行时间:" + df.format(new Date()));
} }

  创建一个配置类,初始化MyTask1任务所需要的JobDetail和Trigger

@SpringBootConfiguration
public class QuartzConfig { @Bean
public JobDetail myTask1JobDetail(){
return JobBuilder.newJob(MyTask1.class).withIdentity("myTask1").storeDurably().build();
} @Bean
public Trigger myTask1Trigger(){
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
//5秒执行一次
.withIntervalInSeconds(5)
.repeatForever();
SimpleTrigger trigger = TriggerBuilder.newTrigger()
//指定触发器对应的JobDetail
.forJob(myTask1JobDetail())
.withIdentity("myTask1")
.withSchedule(scheduleBuilder).build();
return trigger;
} }

  启动项目,可以看到控制台输出的内容

    在上边的方法,我们使用的定时执行方法是在代码中写的固定值,这种局限性比较大,难以满足一些复杂的定制任务执行时间。我们使用Cron表达式来完成定时任务执行时间配置。

  创建任务类,继承QuartzJobBean

public class MyTask2 extends QuartzJobBean {

    private DateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm:ss");

    @Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("MyTask2 执行时间:" + df.format(new Date()));
} }

  在配置类QuartzConfig中创建任务所需的JobDetail和Trigger

@Bean
public JobDetail myTask2JobDetail(){
return JobBuilder.newJob(MyTask2.class).withIdentity("myTask2").storeDurably().build();
} @Bean
public Trigger myTask2Trigger(){
//cron 表达式
String cronStr = "*/10 * * * * ?";
//根据表达式设置ScheduleBuilder
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronStr);
CronTrigger trigger = TriggerBuilder.newTrigger()
//指定JobDetail
.forJob(myTask2JobDetail())
.withIdentity("myTask2")
//指定ScheduleBuilder
.withSchedule(cronScheduleBuilder)
.build();
return trigger;
}

  重启项目,看到控制台输出内容,任务1每5秒执行一次,任务2每10秒执行一次

SpringBoot入门 (十二) 定时任务的更多相关文章

  1. SpringBoot第十二集:度量指标监控与异步调用(2020最新最易懂)

    SpringBoot第十二集:度量指标监控与异步调用(2020最新最易懂) Spring Boot Actuator是spring boot项目一个监控模块,提供了很多原生的端点,包含了对应用系统的自 ...

  2. SpringBoot入门教程(二)CentOS部署SpringBoot项目从0到1

    在之前的博文<详解intellij idea搭建SpringBoot>介绍了idea搭建SpringBoot的详细过程, 并在<CentOS安装Tomcat>中介绍了Tomca ...

  3. SpringBoot入门(二)——起步依赖

    本文来自网易云社区 在前一篇我们通过简单几步操作就生成了一个可以直接运行的Web程序,这是因为SpringBoot代替我们做了许多工作,概括来讲可以分为起步依赖和自动配置.这一篇先来看看起步依赖. 项 ...

  4. SpringBoot系列(十二)过滤器配置详解

    SpringBoot(十二)过滤器详解 往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件 ...

  5. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  6. SpringBoot | 第二十二章:定时任务的使用

    前言 上两章节,我们简单的讲解了关于异步调用和异步请求相关知识点.这一章节,我们来讲讲开发过程也是经常会碰见的定时任务.比如每天定时清理无效数据.定时发送短信.定时发送邮件.支付系统中的定时对账等等, ...

  7. SpringBoot入门教程(二十)Swagger2-自动生成RESTful规范API文档

    Swagger2 方式,一定会让你有不一样的开发体验:功能丰富 :支持多种注解,自动生成接口文档界面,支持在界面测试API接口功能:及时更新 :开发过程中花一点写注释的时间,就可以及时的更新API文档 ...

  8. SpringBoot入门教程(九)定时任务Schedule

    在日常项目运行中,我们总会有需求在某一时间段周期性的执行某个动作.比如每天在某个时间段导出报表,或者每隔多久统计一次现在在线的用户量.在springboot中可以有很多方案去帮我们完成定时器的工作,有 ...

  9. SpringBoot入门 (十) 发送邮件

    本文记录学习在SpringBoot中发送邮件. 一 邮件发送过程 发送邮件是一个我们在项目中经常会用到的功能,如在用户注册时发送验证码,账户激活等都会用到.完整的一个邮件发送过程主要包含以下几个步骤: ...

随机推荐

  1. 最短路 模板 【bellman-ford,dijkstra,floyd-warshall】

    Bellman-ford: /* bellman ford */ #include <iostream> #include <cstdio> #include <cstr ...

  2. Delphi 在DLL中使用DevExpress控件时出错解决办法

    测试环境 DevExpress VCL 14.1.3 和XE7 问题:在dll使用cxGrid控件时  如果不添加列标题 则不报错   查询无数据集显示,如果加上标题 就报错了 这段为报错部分 fun ...

  3. WordPress建站指南(1)

    写在前面: 3月份用10天零碎时间火速完成了建站,后台95%的工作都交给了WP(WordPress).如果想偷懒的话,WP是一个绝好的选择,估计有个小半天就建完收工了. 想有片自己的小花园,可是不会P ...

  4. WinForm中DataGridView的TextBoxColumm换行

    一.内容超过显示宽度自动换行: 在需要自动换行的列中设置 二.换行符换行: 一开始在需要换行的文本添加"\r\n"并不能直接换行,DGV直接把\r\n显示出来了,后换成 Syste ...

  5. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  6. python项目飞机大战

    实现步骤 1.创建窗口 2.创建一个玩家飞机,按方向键可以左右移动 3.给玩家飞机添加按空格键发射子弹功能 4.创建一个敌机 5.敌机自动左右移动 6.敌机自动发射子弹 1.创建窗口 import p ...

  7. ubuntu下nodejs源码安装

    1.从github选择下载自己要安装的nodejs版本,https://github.com/nodejs/node/releases,我下载的版本是node-9.11.2.tar.gz 2.解压no ...

  8. Vue + Bootstrap 制作炫酷个人简历(二)

    没想到隔了这么久才来更新. 用vue做简历,不是非常适合,为什么呢. 因为简历没什么数据上的操作,一般都是静态的内容. 不过都说了用Vue来做,也只能强行续命了. 这里是我做好的成品  非一般简历 由 ...

  9. 反向读取Mysql数据库表结构到PowerDesigner中

    使用PowerDesigner挺长时间了,只是一些简单的表结构设计,因需要对当前数据库进行再设计,需要看一下数据库中所有的表,及表之间的关系,并重新修改表结构,因此需求就是怎么把数据库中的表结构反向生 ...

  10. 初识SQL语句

    SQL(Structured Query Language ) 即结构化查询语言 SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发.SQL语言分为3种类型: ...