本文介绍: (1)注解@Scheduled标注方法实现定时功能;(2)使用注解时必须指定任意一个参数属性):cronfixedDelayfixedRate;(3)注解标识方法必须时无参方法且无返回值。如果有返回值返回值会被忽略;(4)有两种方式生效注解:XML中配置:,或者使用注解:@EnableScheduling;(5)定时任务相关逻辑在:ScheduledAnnotationBeanPostProcessor

1 缘起

最近看到有些定时任务项目
使用了Spring自带定时任务系统通过添加@Scheduled注解的方式实现
并且,使用了不只cron表达式方式实现定时执行
恍然大悟,原来@Scheduled还有其他的方式实现定时任务,
于是,看了下@Scheduled源码发现有三类参数开发者使用cronfixedDelayfixedRate,同时,复习了一下cron表达式
分享如下,帮助读者进一步了解@Scheduled使用,轻松应对知识交流知识考核。
版本:Spring-Context:5.2.7.RELEASE

2 注解:@Scheduled

2.1 是什么

先看下注解的注释,如下图所示
位置org.springframework.scheduling.annotation.Scheduled
注释可知,
(1)注解@Scheduled标注方法上实现定时功能
(2)使用注解时必须指定任意一个参数属性):cron、fixedDelayfixedRate;
(3)注解标识方法必须时无参方法且无返回值。如果有返回值,返回值会被忽略
(4)有两种方式生效该注解:XML中配置task:annotaiondriven,或者使用注解:@EnableScheduling
(5)定时任务的相关逻辑在:ScheduledAnnotationBeanPostProcessororg.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor)。
在这里插入图片描述

2.2 功能

(1)定时执行任务:指定执行的星期、月、天、时、分、秒,定时执行任务,cron参数
(2)固定周期执行任务:间隔x毫秒周期性指定任务,fixRate参数
(3)固定间隔延迟执行任务:延迟x毫秒执行指定任务,fixDelay参数

2.3 参数分析

2.3.1 CRON_DISABLED

常量参数CRON_DISABLED,用于配置生效定时任务,
值为-,如果已经配置了定时任务,但是,不想启用定时任务,则配置cron为-
在这里插入图片描述
在ScheduledAnnotationBeanPostProcessor使用参数用于判断cron表达式是否生效
具体的方法processScheduled处理逻辑如下图所示
由图可知,检查cron表达式,如果cron表达式为-,则该定时任务,不会被添加到任务池。
位置org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor#processScheduled

在这里插入图片描述

2.3.2 cron

CRON类型的表达式,配置定时任务,共有6个时间粒度,
参数样式a b c d e f
从左到右分别表示
秒、分、小时、天、月、星期。

序号 参数 取值范围 特殊字符
1 [0, 59] * , – /
2 分钟 [0, 59] * , – /
3 小时 [0, 23] * , – /
4 日期 [1, 31] * , – / ? L W
5 [1, 12]或[JAN, DEC] * , – /
6 星期 [1,7]或[MON, SUN] * , – / ? L #

特殊字符

序号 特殊字符 描述 样例
1 * 所有可能的值 如在分钟位置配置*,表示每一分钟都生效
2 , 枚举 表示对应数据,如分钟位置配置10,20,30,表示在某点的10分、20分和30分执行
3 范围 间隔值1,左右的数据表示上界和下界,如分钟位置配置:10-20,表示某点10分和20分之间,每1分钟执行
4 / 增量 左侧数据表起始值,右侧数据表示增量,分钟位置配置:3/10,表示从第一个间隔3分钟后,每10分钟执行,秒位置:2/10,表示从第一个2秒后开始,每10秒执行
5 ? 指定 日期或星期中使用,为避免冲突,将另一个位置配置?
6 L Last最后一个 日期位置使用L表示最后一天,星期位置使用L表示最后一个星期的最后一天
7 W 除周末以外的有效工作 日期位置就近原则,如果5W,5日在为星期六,则在4日执行,如果5日是星期日,则在星期一执行,如果5日在周一~周五,则在5日当天执行
8 # 确定每个月第几个星期几,仅支持星期 星期位置,4#2表示某月的第二个星期四

如配置为:0/5 * * * * ?,表示每5秒执行一次
参数描述下图所示
一行描述为:如果配置为-则不会触发定时任务。
在这里插入图片描述

2.3.3 fixDelay

延迟固定时间执行:服务启动后,延迟固定时间执行该任务,此后定期执行以此间隔作为执行周期。
参数描述如下图所示
由图可知,有两种类型long和String,其中,long类型的单位为毫秒。
在这里插入图片描述

2.3.4 fixRate

固定周期执行:以固定的时间执行该任务。
参数描述如下图所示
由图可知,有两种类型long和String,其中,long类型的单位为毫秒。
在这里插入图片描述

2.3.5 initialDelay

首次执行fixRate和fixedDelay延迟的时间,时间单位:毫秒。
参数源码下图所示
在这里插入图片描述

2.4 实际应用

2.4.1 cron样例

着重看下cron样例

序号 配置 描述
1 0/5 * * * * ? 每5秒执行一次
2 0 0/2 * * * ? 每两分钟执行一次
3 0 2 3 1 * ? 每月1日3点2分执行一次
4 0 2 3 1 1-3 ? 1月到3月的:1日3点2分执行一次
5 0 0 2,3,4,5 * * ? 每天2点、3点、4点和5点执行一次
6 0 10 2 * * ? 每天2:10分执行一次
0 0-5 14,16 * * ? 每天14:00到14:55和16:00到16:55每5分钟执行一次
0 10 10 L * ? 每月最后一天的10:10执行一次
0 10 10 5W * ? 每月的工作日5日10:10分执行,如果5日为周六,则往前退一天(星期五),4日10:10执行,如果5日为星期日,则往后推一天(星期一),6日10:10日执行
0 10 10 ?* 4#2 每月的第二个星期四10:10执行一次

2.4.2 测试样例

package com.monkey.standalone;

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

import javax.annotation.Resource;

/**
 * 启动类.
 *
 * @author xindaqi
 * @date 2021-04-30 18:22
 */
@SpringBootApplication
@EnableScheduling
public class StandaloneApplication {

	private static final Logger logger = LoggerFactory.getLogger(StandaloneApplication.class);
	public static void main(String[] args) {
		SpringApplication.run(StandaloneApplication.class, args);
		logger.info("Standalone启动成功");
	}
}
  • 定时任务
package com.monkey.standalone.common.schedule;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * 定时任务样例.
 *
 * @author xindaqi
 * @since 2022-11-30 23:04
 */
@Component
public class DemoSchedule {

    private static final Logger logger = LoggerFactory.getLogger(DemoSchedule.class);

    /**
     * CRON周期性任务:如从第一个10秒后,每隔5秒执行
     * 参数顺序:
     * 秒-分-时-日-月-周
     */
    @Scheduled(cron="10/5 * * * * ?")
    public void cronSchedule() {
        logger.info(">>>>>>>>Cron schedule:{}", LocalDateTime.now());
    }

    /**
     * 延迟固定时间周期性执行(从服务启动后开始)
     * 服务启动时间:10:30,任务在10:33开始执行,
     * 此后以3秒为周期执行
     */
    @Scheduled(fixedDelay = 3000)
    public void fixedDelaySchedule() {
        logger.info(">>>>>>>>FixedDelay schedule:{}", LocalDateTime.now());
    }

    /**
     * 固定周期执行
     * 固定每4秒执行一次
     */
    @Scheduled(fixedRate = 4000)
    public void fixedRateSchedule() {
        logger.info(">>>>>>>>FixedRate schedule:{}", LocalDateTime.now());
    }

    /**
     * 首次延迟周期性执行,
     * 服务启动后,延迟2秒执行,
     * 此后,每3秒执行一次
     */
    @Scheduled(initialDelay = 2000, fixedRate = 3000)
    public void initialDelaySchedule() {
        logger.info(">>>>>>>>InitialDelay and FixedRate schedule:{}", LocalDateTime.now());
    }
}

测试结果下图所示,详见图中描述。

在这里插入图片描述

3 小结

(1)注解@Scheduled标注在方法上实现定时功能;
(2)使用注解时必须指定任意一个参数(属性):cron、fixedDelay或fixedRate;
(3)注解标识方法必须时无参方法且无返回值。如果有返回值,返回值会被忽略;
(4)有两种方式生效该注解:XML中配置:task:annotaion-driven,或者使用注解:@EnableScheduling;
(5)定时任务的相关逻辑在:ScheduledAnnotationBeanPostProcessor

原文地址:https://blog.csdn.net/Xin_101/article/details/128267557

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_46656.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注