SpringTask任务调度详解+SpringBoot整合

一世执手 提交于 2020-04-06 11:01:07

1 定时任务的框架

  1. Quartz:整合了Spring
  2. SpringTask:轻量
  3. SpringBoot整合SpringTask:两行代码即可搞定

1.1.说说定时任务的应用场景

1. 月底扣话费
2. 会员到期
3. 生日祝福
4. qq好友生日祝福
5. 月底的自动发邮件给领导, 统计这个月的数据
6. 等等等

2.SpringBoot整合SpringTask任务调度框架的使用

2.1 注解

采用SpringBoot整合SpringTask不需要额外导包

@EnableScheduling:开启对定时任务的支持,添加在启动类上

@Scheduled(cron="*/6 * * * * ?"):执行的方法上添加,标识方法何时被执行,注意是有空格,后面详细解释

2.2 启动类启用定时任务调度

在启动类上加@EnableScheduling即可开启定时,当项目中有多个执行任务的时候,只需要开启一次

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

2.3 创建定时任务实现类

2.3.1 项目创建

2.3.2 添加SpringBoot启动器

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
    </dependencies>

2.3.2 创建启动器

2.3.3 创建两个简单的定时任务

2.3.3.1 定时任务1:

package com.manlu.test;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @author 漫路
 */
@Component
public class SchedulerTask01 {
    private int count = 0;

    //每嗝6秒执行一次
    @Scheduled(cron = "*/6 * * * * ?")
    private void process(){
        System.out.println("定时任务1:"+ ++count);
    }
}

2.3.3.1 定时任务2:

package com.manlu.test;


import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author manlu
 */
@Component
public class SchedulerTask02 {
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedDelay = 6000)
    private void reportCurrentTime(){
        System.out.println("定时任务2: "+DATE_FORMAT.format(new Date()));
    }
}

2.3.4 运行结果

//记得要在启动器上加@EnableScheduling注解

2.4 @Scheduled注解中参数说明

  • @Scheduled("*/6 * * * * ?"):参数可以接收两种定时的设置
    • 一种是常用的cron=“*/6 * * * * ?”
    • 一种是fixedRate=6000,这两种都表示每隔6秒运行一次
  • @Scheduled(fixedRate = 6000):上次开始执行时间点之后6秒再执行
  • @Scheduled(fixedDelay = 6000):上次执行完毕时间点之后6秒再执行
  • @Scheduled(initialDelay = 1000, fixedRate = 6000):第一次延迟1秒后执行,之后按fixedRate的规则每6秒执行一次

2.5 CronTrigger的使用

上面说的那个要加空格的参数怎么写?现在聊一聊

  • cron里面写的是有规则的表达式

2.5.1 定时任务表达式表

2.5.2 一些符号的用法

2.5.3 CronTriggerBean调度器介绍

一个cron表达式至少有6个(也可能是7个) 由空格分隔的时间元素。从左到右,这些元素的定义如下:

参数1:秒 0 - 59
参数2:分钟 0 -59
参数3:小时 0 - 23
参数4:月份中的日期 0 - 30
参数5:月份 0 - 11 或 JAN - DEC
参数6:星期中的日期 1 - 7 获取  SUN - SAT
参数7:年份 1970 - 2099

    每个元素都可以显示的规定一个值(如6),一个区间(如9-12),一个列表(如9,11,13)或一个通配符(如*)。
“月份中的日期” 和 “星期中的日期”这两个元素是互斥的,因此需要通过设置一个问号(?)来表明你不想设置的那个字段

2.5.4 表达式示例

表达式 对应的意思
"0 0 10,14,16 * * ?" 每天上午10点,下午2点,4点 时触发
"0 0/30 9-17 * * ?" 朝九晚五工作时间内每半小时,从0分开始每隔30分钟发送一次
"0 0 12 ? * WED" 表示每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/55 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/55 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!