如何在 Spring Boot 中启用定时任务

ops/2024/11/14 22:44:24/

添加 @EnableScheduling 注解

可以添加在 Application 类上

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

定义定时任务类和方法

定时任务类要注册为Spring IoC 容器的 Bean,或者通过 @Bean 将某个方法的返回值(返回值为定时任务类对象)注册为 Spring IoC 的Bean。

package com.cmcc.nlpt.sitemessage.task;import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class ScheduledTask {/*** 每日0点执行*/@Scheduled (cron = "0 0 0 * * ?")public void doCronTask() {}/*** 本次任务结束到下次任务开始的时间间隔为5秒*/@Scheduled (fixedDelay = 5000)public void doFixedDelayTask() {}/*** 两次任务开始时间间间隔为5秒*/@Scheduled(fixedRate = 5000)public void doFixedRateTask() {}/*** 第一次任务启动延时1秒,后续任务结束到下次任务开始的时间间隔为5秒*/@Scheduled(initialDelay = 1000, fixedDelay = 5000)public void doInitialDelayTask() {}
}

通过配置项控制定时任务是否开启

方法一 @ConditionalOnProperty

此方法是控制任务类是否注册为 Spring IoC 的 Bean,可以控制上述所有类型的定时任务是否注册。

# enabled 配置为 false 时定时任务就不会开启
scheduled-task:enabled: true
@Component
@ConditionalOnProperty(name = "scheduled-task.enabled", havingValue = "true")
public class ScheduledTask {/*** 每日0点执行*/@Scheduled (cron = "0 0 0 * * ?")public void doCronTask() {}/*** 本次任务结束到下次任务开始的时间间隔为5秒*/@Scheduled (fixedDelay = 5000)public void doFixedDelayTask() {}/*** 两次任务开始时间间间隔为5秒*/@Scheduled(fixedRate = 5000)public void doFixedRateTask() {}/*** 第一次任务启动延时1秒,后续任务结束到下次任务开始的时间间隔为5秒*/@Scheduled(initialDelay = 1000, fixedDelay = 5000)public void doInitialDelayTask() {}
}

方法二 Boolean 标志位

使用此方法定时任务还是会被调度执行,只是在任务执行时什么都不做,也可以控制上述所有类型的定时任务。


scheduled-task:enabled: true
@Component
@ConditionalOnProperty(name = "scheduled-task.enabled", havingValue = "true")
public class ScheduledTask {@Value("${scheduled-task.enabled}")private Boolean taskEnabled;@Scheduled (fixedDelay = 5000)public void doFixedDelayTask() {if (!taskEnabled) {return;}System.out.println("start to doFixedDelayTask");}
}

使用"-"使 cron 定时任务关闭

此方法只适用于 cron 类型的定时任务,不适用于其它类型的定时任务。

注意:yml 文件中配置 - 时要加上双引号或单引号,否则会报错。


关闭 cron 定时任务的配置:

scheduled-task:cron: "-"

开始 cron 定时任务的配置,将 cron 表达式配置上即可:

scheduled-task:cron: 0 0 0 * * ?
@Component
public class ScheduledTask {/*** 每日0点执行*/@Scheduled (cron = "${scheduled-task.cron}")public void doCronTask() {}
}

参考

  • Michael Pratt:Conditionally Enable Scheduled Jobs in Spring
  • tan日拱一兵:@ConditionalOn…注解,条件组合你知道吗?
  • 江南一点雨:Spring Boot 中实现定时任务的两种方式!

http://www.ppmy.cn/ops/133698.html

相关文章

攻防世界37-unseping-CTFWeb

攻防世界37-unseping-CTFWeb <?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("…

【IC每日一题:IC验证面试--UVM验证-2】

IC每日一题&#xff1a;IC验证面试--UVM验证-2 2.9 get_next_iterm()和try_next_item()的区别&#xff1f;2.10 一个典型的UVM验证平台&#xff0c;谈一下UVM验证环境结构&#xff0c;各个组件之间的关系&#xff1f;2.11 uvm组件之间通信的方式&#xff1f; analysis_port和其…

基于STM32的LCD1602显示Proteus仿真设计(仿真+程序+设计报告+讲解视频)

这里写目录标题 1.主要功能0. 资料清单&下载链接资料下载链接&#xff1a;2.仿真设计3. 程序设计4. 设计报告5. 框图 基于STM32的LCD1602显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a…

【Android】View—基础知识,滑动,弹性滑动

基础知识 什么是View 在 Android 中&#xff0c;View 是用户界面&#xff08;UI&#xff09;中的基本组件&#xff0c;用于绘制图形和处理用户交互。所有的 UI 组件&#xff08;如按钮、文本框、图片等&#xff09;都是 View 的子类。可以说&#xff0c;View 是构建 Android …

在jquery里,使用$.each()函数循环数组,对象,dom的用法

介绍 $.each() 能遍历一维数组&#xff0c;多维数组&#xff0c;JSON对象&#xff0c;dom2元素。在开发中可以很高效的处理各种数据结构。前提&#xff0c;需要导入jquery 使用 遍历JSON对象 var objDemo {name: linda,age:12, desc: a girl};$.each(objDemo,function(i,va…

小程序开发进阶之路-AI编程助手

之前&#xff0c;我独自一人开发了一个名为“心情追忆”的小程序&#xff0c;旨在帮助用户记录日常的心情变化及重要时刻。从项目的构思、设计、前端&#xff08;小程序&#xff09;开发、后端搭建到最终部署&#xff0c;所有环节都由我一人包办。经过一个月的努力&#xff0c;…

MySQL技巧之跨服务器数据查询:高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中

MySQL技巧之跨服务器数据查询&#xff1a;高级篇-先调用A数据库的MySql存储过程再复制到B数据库的表中 基础篇已经描述&#xff1a;借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MySQL数据库的…

c语言中的文件操作(2)

文件的打开-fopen 函数介绍 文件的打开方式 相对路径与绝对路径 文件关闭函数fclose 文件操作的正确流程 函数的介绍 文件的打开形式 相对路径与绝对路径 文件的关闭函数-fclose 正确的文件操作的流程 前言 通过前面的章节我们已经知道文件的基本的概念&#xff0c;我们如…