SpringBoot下的定时任务调度@Scheduled,Java原生定时任务

2023-11-03

SpringBoot下的定时任务调度@Scheduled,Java原生定时任务

一、概述

定时任务调度,一句话概括就是:基于给定的时间点、给定的时间间隔、自动执行的任务(方法)。

二、java生态下的定时任务实现方式

  • Spring 3.0以后自带了task 调度工具简单方便,(SpringBoot项目里的主流实现方式)
  • java自带的API java.util.Timerjava.util.TimerTask类 (早期的实现方式)
  • Quartz开源框架,功能强大,但是使用起来稍显复杂。 (逐渐淘汰)

三、SpringBoot项目里的定时器主流实现方式

3.1 SpringBoot引导类了上加上@EnableScheduling 开启定时任务支持

@EnableScheduling //开启定时任务支持
public class Application {

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

3.2 在引导类的包及其子包下编写定时任务类

@Component
public class ScheduledTask {
    /**
     * @Scheduled 表示这是一个需要定时执行的方法
     * cron 表达式,用于设置每次执行的时间间隔
     */
    @Scheduled( cron = "0/20 * * * * ? ")	//配置时间规则:每20秒执行一次
    public void scheduledMethod() throws ParseException {
        //业务逻辑
        System.out.println("定时任务执行");
    }
}

3.3 Scheduled注解的各个参数解析

Scheduled注解源码:

package org.springframework.scheduling.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String CRON_DISABLED = "-";

    String cron() default "";

    String zone() default "";

    long fixedDelay() default -1L;

    String fixedDelayString() default "";

    long fixedRate() default -1L;

    String fixedRateString() default "";

    long initialDelay() default -1L;

    String initialDelayString() default "";

  1. zone:时区设置,可以设置为java.util.TimeZone中的zoneId,该字段一般留空即可

  2. fixedDelay:执行完一次以后(方法完全执行完之后)隔多长的时间再去执行

    //执行完一次以后隔10000毫秒,即10秒再去执行
    @Scheduled(fixedDelay = 10000)
    
  3. fixedDelayString:与fixedDelay不同的就是只接收字符串,并且可以支持SpringEL表达式来赋值

    //执行完一次以后隔10000毫秒,即10秒再去执行
    @Scheduled(fixedDelayString = "10000")
    
    //SpringEL的赋值方式
    @Scheduled(fixedDelayString = "${Schedul.fixedDelay}")
    

    SpringEL的赋值方式 需要在application.yml中配置

    Schedul: 
    	fixedDelay: 10000
    
  4. fixedRate: 在上一次开始执行时间点(也就是方法刚开始执行的时候)之后多长时间再执行

    //在上一次开始执行时间点(也就是方法刚开始执行的时候)的10000毫秒后,即10秒后再去执行
    @Scheduled(fixedRate = 10000)                
    
  5. fixedRateString:与fixedRate不同的就是只接收字符串,并且可以支持SpringEL表达式来赋值

    //在上一次开始执行时间点(也就是方法刚开始执行的时候)的10000毫秒后,即10秒后再去执行
    @Scheduled(fixedRate = "10000")    
    
  6. initialDelay:设置第一次执行时的等待时间,即等待多长时间,再去执行第一次

    //第一次延迟2秒后执行,之后就按只有fixedRate参数的方式每10秒执行一次 
    @Scheduled(initialDelay=2000, fixedRate=10000)   
    //第一次延迟2秒后执行,之后按只有fixedDelayStrin参数的方式每10秒执行一次
    @Scheduled(initialDelay=2000, fixedDelayString=10000)   
    

    相当于initialDelay也就只对定时任务的首次执行有效

  7. initialDelayString:与initialDelay不同的就是只接收字符串,并且可以支持SpringEL表达式来赋值

  8. cron表达式:用于设置每次执行的时间间隔

    • 语法:[秒] [分] [小时] [日] [月] [周] [年]

      其中[年]不是必须的域,通常使用的时候省略[年],前6位足以满足大部分需求,并且前6位也不能省。

    • cron表达式支持的六个域 :

    名称 是否必须 允许值 可以使用的通配符
    0-59 , - * /
    0-59 , - * /
    0-23 , - * /
    1-31 , - * ? / L W C
    1-12 或 JAN-DEC , - * /
    1-7 或 SUN-SAT , - * ? / L C #
    1970-2099 , - * /
    • 通配符说明:

      • * 代表任意值,表示当前域上的任意时间段都会触发

      • ? 忽略当前域,它只能用在周和日两个域。因为二者会相互影响

      • - 区间连接符,表示时间范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次

      • , 表示给当前域指定多个枚举值 (并列值)

      • / 表示起始时间开始触发,然后每隔固定时间触发一次

        ​ 比如分钟上设置0/5表示,从第0分钟开始每5分钟执行一次,

      • Llast,表示最后的意思。表示当前域的最后一秒,最后一分钟执行,执行方式由所在域决定

      • W 表示在离当前日期最近的那个工作日触发,注意:是工作日

        ​ 在日字段上置”15W”,表示离每月15号最近的那个工作日触发。

        ​ 如果15号正好是周六,则找最近的周五(14号)触发,

        ​ 如果15号是周日,则找最近的下周一(16号)触发

        ​ 如果15号正好在工作日(周一至周五),则就在该天触发。

      • # 只能用在周这个域上面

        ​ 比如5#2表示在每月的第二个周五,如果指定的时间不存在则不会触发

      • LW表示在本月的最后一个工作日触发

    • 常见的使用示例:

      每10秒执行一次:*/10 * * * * ?
      
      每10分钟执行一次:0 */10 * * * ?
      
      每天上午11:15触发:0 15 11 ? * * 或者 0 15 11 * * ? 
      
      在每天下午2点到下午2:59期间的每1分钟触发:0 * 14 * * ? 
      
      在每天下午2点到下午2:55期间的每5分钟触发:0 0/5 14 * * ?
      
      在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发: 0 0/5 14,18 * * ?
      
      每月5号8点执行一次:0 0 8 5 * ?
      
      每月最后一天8点执行一次:0 0 8 L * ?
      
      每月最后一周内的任意天数的1点执行一次:0 0 1 ? * L
      
      在每小时的15分、17分、19分各执行一次:0 15,17,19 * * * ?
      

注:

  • ​ 对与Cron表达式理解其含义即可

  • ​ 网上很多CRON在线生成器,在实际项目应用中可以参考使用

四、原生java实现定时任务

4.1 创建定时任务类,实现TimerTask接口,重写run方法

/**
 *  定时任务
 */
public class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        //定时任务执行体----里面可以编写定时任务需要执行的具体逻辑
		System.out.println("定时任务执行!");
    }

}

4.2 创建java定时器,并执行定时任务

public class TimerTest {

    public static void main(String[] args) {
        Timer timer = new Timer();        //java定时器
        
        //调用timer的schedule方法执行定时任务
        //第二个参数为Long代表第一次延迟多久执行, 为Date代表第一次执行的具体时间是什么时候
        //第三个参数为延迟执行时间,也就是每隔多久执行一次定时任务中的run方法,单位为毫秒
        timer.schedule(new MyTimerTask(), startDate, 24 * 60 * 60 * 1000);
    }
    
}

4.3 Spring中使用java定时器

在Spring项目中使用java原生定时器通常会在项目启动时就开启定时任务

写法如下:

@Component
public class TimerListener implements ApplicationListener<ContextRefreshedEvent> {

    private Timer timer = new Timer();        //java定时器

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        //防止spring容器 和 springmvc容器导致此方法执行两次
        //root application context 没有parent,他就是最顶层.
        if(contextRefreshedEvent.getApplicationContext().getParent() == null){
            //需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
            System.out.println("开启定时任务!");
			//调用timer的schedule方法执行定时任务
            //第二个参数为Long代表第一次延迟多久执行, 为Date代表第一次执行的具体时间是什么时候
            //第三个参数为延迟执行时间,也就是每隔多久执行一次定时任务中的run方法,单位为毫秒
            timer.schedule(new MyTimerTask(), startDate, 24 * 60 * 60 * 1000);
        }
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot下的定时任务调度@Scheduled,Java原生定时任务 的相关文章

随机推荐

  • 【OpenCV图像处理】1.22 像素值映射

    相关理论 什么是像素重映射 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去 形成一张新的图像 g x y
  • 电子商务计算机考试,电子商务师考试电子商务训练试题

    电子商务师考试电子商务训练试题 导语 电子商务师是指利用计算机技术 网络技术 通过专业的网络商务平台等现代信息技术 帮助商家与顾客或商家与商家之间从事各类商务活动或相关工作的人员 跟着小编一起来看看相关试题吧 1 确定事物之间异同的形式逻辑
  • Ingress配置跨域(服务包含websocket)

    nginx ingress默认是支持websocket 不需要添加配置 如果websocket的端口与当前服务不一致 则需要在rules中配置对应的路径 具体本文不体现 跨域主要配置有 nginx ingress kubernetes io
  • 【Java】maven-shaded-plugin超详细详解

    一 总体介绍 maven shaded plugin提供了两大基本功能 将依赖的jar包打包到当前jar包 常规打包是不会将所依赖的jar包打进来的 对依赖的jar包进行重命名 用于类的隔离 创建一个Shaded JAR maven sha
  • Opencv 入门(三)

    文章目录 图像梯度 Sobel算子 Scharr 算子 Laplacian算子 Canny边缘检测 图像金字塔 高斯金字塔 拉普拉斯金字塔 轮廓检测 画图函数 轮廓特征 面积 周长 轮廓近似 多边形 边界矩形 外接圆 图像梯度 Sobel算
  • 来做一个麦克纳姆轮吧!!

    想玩全向小车么 想搭建一个移动底盘么 想满足中二病的创造欲么 想 那么为什么不自己做一个麦克纳姆轮呢 自己动手丰衣足食 0 准备材料 3D打印机一台 打印耗材 直径2mm 长度60mm的铁轴 这种玩具模型里用的小铁轴刚好可以用来当麦克纳姆轮
  • 03-雾化

    const fog new THREE Fog color near far color 颜色 用于设置雾的颜色 以十六进制表示 near 近平面 处于这个距离之内的物体将被完全雾化 far 远平面 处于这个距离之外的物体将不受雾化影响
  • Java枚举类常量写法

    在写代码的过程中我们常常需要定义一些常量 以下代码是使用枚举类型定义常量的实例 有需要大家可以进行参考 public class MyConstant public enum StatusEnum CREATED 0 状态0 ASSIGNE
  • python趣味编程-盒子追逐者游戏

    在上一期我们用Python实现了一个奥赛罗游戏的游戏 这一期我们继续使用Python实现一个简单的盒子追逐追逐者游戏 让我们开始今天的旅程吧 在Python自由源代码中使用Turtle的盒子追逐者游戏 在Python中使用Turtle的盒子
  • 我使用Java one longin组件进行ADFS连接,但是logout endpoint有问题

    很抱歉 看起来你遇到了使用 Java OneLogin 组件连接 ADFS 时的注销端点问题 这可能是由于 ADFS 设置不正确或 Java OneLogin 组件的配置问题造成的 建议您检查相关文档 并确保 ADFS 和 Java One
  • 龙书(附录A):一个完整的编译器前端(学习记录)

    龙书 完整的编译器前端下载地址 ps 我设置的不要下载积分 如果还是不能下载的话请评论区留言 https download csdn net download Zheng lan 16779204 百度网盘下载 链接 https pan b
  • java8之Stream-Collect操作

    文章目录 collect Collector in Action 收集器 Collectors 常用规约操作 规约到一个单独的值 把数据装进一个list中 将数据收集到一个Set中 把数据收集到一个Map中 Using other coll
  • 《人工智能》之《非经典推理》习题解析

    教材 人工智能及其应用 蔡自兴等 2016m清华大学出版社 第5版 参考书 对应同系列博客 人工智能 之 非经典推理 人工智能 之 非经典推理 习题解析 1 非经典逻辑 非经典推理与经典逻辑 经典推理有何不同 2 什么是不确定性推理 为什么
  • fastapi之tortoise-orm

    目录 概述 fastapi引入 创建对应数据模型 创建Model 设置数据库字段field 字段介绍 自定义字段 设置Meta Model模型方法 查询 Q对象查询 字段过滤 预取 F表达式 功能和聚合 事务 根据Model生成Schema
  • Faster RCNN 源码解读(1) -- 文件结构分析

    基本介绍 Faster RCNN 在目标检测及其相关领域得到了广泛的运用 其原型RCNN是将CNN引入到目标检测的开山之作 此外基于region proposal是一种十分值得学习的思想 因此将在后续的系列章节中 基于源码 对Faster
  • vue + element实现前端excel上传解析

    前言 最近有个新需求 需要前端解析excel文件并且展示到页面让用户确认无误后进行上传 1 安装插件 首先安装xlsx插件 我这里安装的是0 14 1 npm install xlsx save 2 html部分代码 这里使用element
  • 海州高级中学2021高考成绩查询,2020年新海高中、海州高中高考成绩及三年前录取情况对比...

    高考分数出来以后 各所高中喜报频传 今天我们来梳理一下连云港市区四所四星级高中 她们三年前的中考录取情况和今年的高考成绩数据 这四所四星级高中分别为江苏省新海高级中学 以下简称 新海高中 连云港高级中学 以下简称连云港高中 江苏省海州高级中
  • 《网络设备安装与管理》实训2(配置二层交换机、三层交换机)

    网络设备安装与管理 实训2 一 实习项目 配置交换机 包括二层交换机 三层交换机 实现不同VLAN之间的通讯 二 实习目的 1 理解多层交换机的路由原理 实现不同VLAN间通讯 采用三层交换机以及路由器设备来解决 在三层交换机上 创建各个V
  • python绘制好几个子图_python – 在matplotlib中绘制一条关联多个子图之间区域的线...

    我是一名地质学家 有一堆不同深度的钻孔 我粗略地设定了子图的数量 宽度和高度 以根据钻孔的数量和这些钻孔中的样本数量而变化 在每个钻孔中都有一个我想要突出显示的区域 我用axhspan完成了这个区域 我想做的是在钻孔 子图 之间进行关联 绘
  • SpringBoot下的定时任务调度@Scheduled,Java原生定时任务

    SpringBoot下的定时任务调度 Scheduled Java原生定时任务 一 概述 定时任务调度 一句话概括就是 基于给定的时间点 给定的时间间隔 自动执行的任务 方法 二 java生态下的定时任务实现方式 Spring 3 0以后自