spring之定时任务

spring之定时任务

      一.    概述

        在spring中支持三种主流的定时任务: JDK自带的定时任务Timer, 开源项目quartz,以及spring自带的定时任务.如果定时任务比较轻便,可以考虑使用JDK自带的定时任务Timer,如果定时任务很复杂,可以考虑使用quartz,我觉得spring自带的定时任务就像一个轻便型的quartz,在此篇博客中,只讨论spring自带的定时任务.

     二.    七子表达式

        首先,定时任务要知道一个东西,专业术语叫七子表达式(Cron),他与UNIX的Cron相类似,但是UNIX的Cron只能精确到分,而spring和quartz的Cron可以支持到秒.七子表达式,名字由来应该是他有七个域,每一个域代表着自己特殊的含义.

      七个作用域

名称 必须 合法值 占位符
0~59 * - , /
0~59 * - , /
0~23 * - , /
0~31 * ? - , / L W
1~12 或者 JAN~DEC * - , /
1~7 或者 SUN~SAT * ? - , / L #
空 或者 1970~2099 * - , /

      占位符

符号 作用域 含义 示例 解析
* 全部 该域上所有合法的值 0 0 9 * * ? 每天9点
? 日和周 无视该域上的值 同上 同上
- 全部 该域上指定值的范围 0 0 9-17 * * ? 每天9点至17点的整点
, 全部 该域上指定值的集合列表 0 0 9,12,17 * * ? 每天9点12点和17点
/ 全部 该域上时间表的递增 0 0/15 * * * ? 每刻钟
L 日和周 该域上最后一个合法值 0 0 9 ? * 2L 每个月最后一个星期一的9点
W 该域上指定日期的最近一个工作日 0 0 9 15W * ? 每个月离15号最近的工作的的9点
# 该域上的第几个星期的星期几 0 0 9 ? * 6#4 每个月的第四个星期五

        三.    代码演示

        定时任务类:
package com.yczuoxin.demo.config;

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

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

@Component
public class ScheduledTask {

    private static final SimpleDateFormat FORMAT = new SimpleDateFormat("HH:mm:ss");

    // 每5s触发一次定时任务
    @Scheduled(fixedRate = 5000)
    public void printTime(){
        System.out.println("当前时间为: " + FORMAT.format(new Date()));
    }

    // 每天19点准时触发定时任务
    @Scheduled(cron = "0 0 19 ? * *")
    public void toTime(){
        System.out.println("指定时间: " + FORMAT.format(new Date()));
    }
}

可以看到@Scheduled有几种定时任务可供选择:


cron:                    表示用七子表达式表示

zone:                    cron所运行的时区

fixedDelay:           从上一个任务完成后等待多长时间执行(ms)

fixedRate:             从上一个任务开始后等待多长时间执行(ms)

initialDelay:           等待长时间后开始执行(ms)

后面带String是用配置文件来读取内容信息,即相应的配置版本.

        配置类:

package com.yczuoxin.demo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@ComponentScan("com.yczuoxin.demo.config")
/** 开启对任务的支持 */
@EnableScheduling
public class TaskConfig {
}

        测试类:

package com.yczuoxin.demo.config;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TaskTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskConfig.class);
    }
}

        运行结果:


        从结果可见,定时任务启动成功.

猜你喜欢

转载自blog.csdn.net/ycxzuoxin/article/details/80931765