初学SpringBoot之Task定时任务

一、前言

    这篇是学习SpringBoot的第六篇文章,这篇记录的是SpringBoot内置的定时任务的使用。这边文章的程序是沿用上一篇的。如果不想从头配置,可以先创建一个SpringBoot的工程,然后再使用这篇文章的代码,MybatisPlus部分的也就是getUser方法需要替换掉。

    Task在Spring应用中,使用比较简单,直接使用@Scheduled注解即可,但是不能够动态维护,任务启动以后不能修改、暂停等。

二、直接上代码

    2.1在启动类加上@EnableScheduling注解

package com.xuexue.firstproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class FirstprojectApplication {

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

}

    2.2写一个定时任务吧。这个类要使用@Component注解,将这个类交给Spring管理。如果那个方法需要定时任务,在方法上方加上@Scheduled注解。请注意,任务的方法的返回值应该为void,并且不能有任何参数。如果需要与应用程序上下文中的其他对象进行交互,那么通常会通过依赖注入的方式来提供这些对象。

package com.xuexue.firstproject.task;

import com.xuexue.firstproject.Beans.User;
import com.xuexue.firstproject.Daos.UserMapper;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;

@Component
public class TaskDemo {

    @Resource
    private UserMapper userMapper;

    @Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次
    public void work() throws Exception {
        System.out.println("执行调度任务:"+new Date());
    }

    @Scheduled(fixedRate = 5000)//每5秒执行一次
    public void play() throws Exception {
        System.out.println("执行Quartz定时器任务:"+new Date());
    }

    @Scheduled(cron = "0/2 * * * * ?") //每2秒执行一次
    public void doSomething() throws Exception {
        System.out.println("每2秒执行一个的定时任务:"+new Date());
    }

    @Scheduled(cron = "0 0 0/1 * * ? ") // 每一小时执行一次
    public void goWork() throws Exception {
        System.out.println("每一小时执行一次的定时任务:"+new Date());
    }

    @Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次
    public void getUser() throws Exception {
        User quartzuser=userMapper.selectById(1);
        System.out.println("每分钟查询一次用户:"+quartzuser.getUsername());
    }
}

2.3运行结果如下

2.4@Scheduled注解

@Scheduled(fixedRate = 5000):固定间隔5秒,可以引用变量 fixedRate:以每次开始时间作为测量,间隔固定时间

private static final long SECOND = 1000;
@Scheduled(fixedRate = 3 * SECOND)
public void task1() {}

@Scheduled(fixedDelay = 3000):固定延迟3秒,从前一次任务结束开始计算,延迟3秒执行

@Scheduled(cron = "*/5 * * * * ?"):每5秒执行,使用的是cron表达式运行了

2.5cron表达式

cron表达式是由七个子表达式组成的字符串,用于描述日程表的各个细节。这些子表达式用空格分隔 

整体表达式为:[秒] [分] [小时] [日] [月] [周] [年](年可选)

1.Seconds(秒)
2.Minutes(分)
3.Hours(时)
4.Day-of-Month(日)
5.Month(月)
6.Day-of-Week(星期)
7.Year(可选字段)(年)

下面是每个表达式的取值规则:

字段 [秒] [分] [小时] [日] [月] [周] [年](年可选)
允许值 0-59 0-59 0-23 1-31 1~12
JAN~DEC
1~7
SUN~SAT

留空

1970~2099

允许特殊符号 , - * / , - * / , - * / , - * /
? L W C
, - * / , - * /
? L C #
, - * /

允许值及特殊符号说明:

  • 月份简称:JAN(一月),FEB(二月),MAR(三月),APR(四月),MAY(五月),JUN(六月),JUL(七月),AUG(八月),SEP(九月),OCT(十月),NOV(十一月)和DEC(十二月)。
  • 星期简称:SUN(星期日),MON(星期一),TUE(星期二),WED(星期三),THU(星期四),FRI(星期五)和SAT(星期六)。其中,1表示SUN。
  • ,:用来分割在域上指定的多个值。如:MON,WED,FRI在星期域里表示星期一、星期三、星期五。
  • /:用于指定增量值。如分钟上使用0/15,表示从零开始,每隔15分钟,等价于0,15,30,45。如分钟上使用3/15,表示从第3分钟开始,每隔15分钟,等价于3,18,33,48,x/y中x表示开始值,y表示步长。
  • *:表示匹配该域的任意值。如秒上使用*表示每秒触发一次。
  • -:表示指定一个范围,如分钟域上10-13,表示10分、11分、12分、13分。
  • ?:表示不关心的域,可用于日和周两个域上,主要用来解决日和周两个域的冲突。和*类似,区别在于*关心域,只是域的值可以任意,?则表示对该域不关心,不需要看该域的内容,直接忽略。
  • L:表示最后,是单词last的首字母,可用于日和周两个域上,用在日和周上含义不同:
    • 日域上表示月份中日期的最后一天,如一月的第31天、非闰年二月的第28天。
    • 周域上单独使用仅表示7或SAT,即仅表示周六。但是如果跟在其他值后,如6L或FRIL则表示该月中最后一个星期五。
    • L还可以指定偏移量,如日域指定L-3,表示该月倒数第3天。当使用L时其值尽量不要指定列表或范围,以免令人困惑。
  • W:用于日域,表示距离指定日最近的工作日(周一至周五中的一个)
        例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发。如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-")。
        小提示:'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发;周字段的设置,若使用英文字母是不区分大小写的,即MON与mon相同。
  • #:用于周域,表示该月的第n个星期几。如:周域值为6#3或FRI#3表示该月的第3个星期五。
        例如在周字段上设置"6#3"表示在每月的第三个周六。注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)。
        注:表中月份一行的JAN-DEC,是指一月到十二月的英文缩写;星期一行的SUN-SAT,是指星期天到星期六的英文缩写。

常用表达式:

表达式 含义
0 0 10,14,16 * * ? 每天上午10点、下午两点、下午4点整触发
0 0/30 9-17 * * ? 每天朝九晚五内每隔半小时触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 0/5 * * * ? 每5分钟触发
10 0/5 * * * ? 每隔5分钟的第10秒触发(即10:00:10、10:05:10、10:10:10等)
30 * * * * ? 每半分钟触发
30 10 * * * ? 每小时的10分30秒触发
30 10 1 * * ? 每天1点10分30秒触发
30 10 1 20 * ? 每月20号1点10分30秒触发
30 10 1 20 10 ? * 每年10月20号1点10分30秒触发
30 10 1 20 10 ? 2011 2011年10月20号1点10分30秒触发
30 10 1 ? 10 * 2011 2011年10月每天1点10分30秒触发
30 10 1 ? 10 SUN 2011 2011年10月每周日1点10分30秒触发
15,30,45 * * * * ? 每15秒,30秒,45秒时触发
15-45 * * * * ? 15到45秒内,每秒都触发
15/5 * * * * ? 每分钟的每15秒开始触发,每隔5秒触发一次
15-30/5 * * * * ? 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
0 0/3 * * * ? 每小时的第0分0秒开始,每三分钟触发一次
0 15 10 ? * MON-FRI 星期一到星期五的10点15分0秒触发
0 15 10 L * ? 每个月最后一天的10点15分0秒触发
0 15 10 LW * ? 每个月最后一个工作日的10点15分0秒触发
0 15 10 ? * 5L 每个月最后一个星期四的10点15分0秒触发
0 15 10 ? * 5#3 每个月第三周的星期四的10点15分0秒触发


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章