SpringBoot项目如何设置定时任务总开关

news2024/12/24 9:08:54

目录

方法一:使用Spring Profiles

1.1 步骤1

1.2 步骤2

1.3 步骤3

1.4 步骤4

方法二:使用@ConditionalOnProperty

2.1 步骤1

2.2 步骤2

2.3 步骤3

方法三: 主启动类禁用@EnableScheduling

定时任务原理剖析(选看)

1. @EnableScheduling的作用

2. @Scheduled的解析

解析过程

3. 任务调度与执行

调度机制

调度器实现

任务执行流程

4. 异常处理


在一些复杂项目中,我们写了很多定时任务类,但是有的时候,在代码调试阶段,不希望执行这些定时任务,如何更高效的方式关闭这些定时任务,而不是逐一注释代码。

解决方式也很简单。以下列举几种:

方法一:使用Spring Profiles

你可以为不同的环境(如开发、测试和生产)定义不同的profiles,并根据当前激活的profile来决定是否执行定时任务。

1.1 步骤1

在你的application.properties文件中,定义一个profile-specific的属性,例如

# application.properties
spring.profiles.active=dev

1.2 步骤2

创建profile-specific的配置文件,例如application-dev.properties,并在其中指定是否执行定时任务。

1.3 步骤3

在定时任务类上添加@Profile注解,只在特定profile下才加载定时任务Bean:

@Component
@Profile("prod") // 只有在prod profile下才加载这个bean
public class ScheduledTasks {
    @Scheduled(cron = "0 * * * * ?")
    public void reportCurrentTime() {
        System.out.println(new Date());
    }
}

1.4 步骤4

当你需要关闭定时任务时,只需更改激活的profile,比如在application.properties中设置

spring.profiles.active=test

方法二:使用@ConditionalOnProperty

还可以通过@ConditionalOnProperty注解来控制定时任务的启用与否。

这要求在application.propertiesapplication.yml中定义一个属性,用来标识是否启用定时任务。

2.1 步骤1

在配置文件中添加一个属性

# application.properties
app.enableScheduledTasks=true

2.2 步骤2

在定时任务类上使用@ConditionalOnProperty 

@Component
@ConditionalOnProperty(name = "app.enableScheduledTasks", havingValue = "true")
public class ScheduledTasks {
    @Scheduled(cron = "0 * * * * ?")
    public void reportCurrentTime() {
        System.out.println(new Date());
    }
}

2.3 步骤3

要禁用定时任务,只需将配置文件中的app.enableScheduledTasks设置为false即可。

方法三: 主启动类禁用@EnableScheduling

最简单的方式,就是将@EnableScheduling注解放在主启动类上,通过是否注释掉该注解,来决定是否禁用定时任务。推荐用这种方式!!!

 

同样的道理,像Rocketmq这种消息中间件也可以参考这些处理方式,进行统一开关。万变不离其宗~

定时任务原理剖析(选看)

Spring框架中的定时任务功能主要通过@Scheduled注解来实现,其背后有一套完整的机制来支持定时任务的定义、调度和执行。下面将详细介绍@Scheduled定时任务的实现原理。

1. @EnableScheduling的作用

首先,要使用Spring的定时任务功能,需要在Spring配置类中添加@EnableScheduling注解。这会触发一系列的内部配置动作:

  • 自动配置@EnableScheduling会自动配置AnnotationAwareTaskSchedulerAutoConfiguration类,该类会为应用程序提供一个TaskScheduler的实现,默认情况下是ConcurrentTaskScheduler
  • 注册调度器:通过SchedulingConfigurerSupport类中的configureTasks方法,将TaskScheduler注册到ApplicationContext中。

2. @Scheduled的解析

当Spring容器启动时,会扫描所有带有@Component及其派生注解(如@Service@Controller等)的类,并初始化它们作为Bean。此时,Spring会检查这些Bean中的方法是否有@Scheduled注解。

解析过程
  • BeanPostProcessor:Spring框架使用了BeanPostProcessor机制来处理带有@Scheduled注解的方法。具体来说,ScheduledAnnotationBeanPostProcessor实现了BeanPostProcessor接口,它会在Bean初始化之后(即postProcessAfterInitialization方法)拦截这些Bean,并处理它们的方法上的@Scheduled注解。
  • 方法提取ScheduledAnnotationBeanPostProcessor会提取所有带有@Scheduled注解的方法,并创建一个ScheduledMethodRunnable对象来包装这些方法。
  • 任务注册:对于每一个ScheduledMethodRunnable对象,ScheduledAnnotationBeanPostProcessor会将其注册到之前配置好的TaskScheduler中,同时传递调度规则(如cron表达式或固定延迟)。

3. 任务调度与执行

调度机制

TaskScheduler是Spring框架中用于调度任务的核心接口。它提供了两种主要的调度方式:

  • 基于cron表达式:使用cron参数来定义调度规则。
  • 基于固定延迟或周期:使用fixedDelayfixedRate参数来定义任务执行的时间间隔。
调度器实现

TaskScheduler接口的具体实现通常由ConcurrentTaskScheduler提供,后者内部使用ThreadPoolTaskScheduler来管理任务的执行。ThreadPoolTaskScheduler是一个实现了TaskScheduler接口的类,它使用一个线程池来执行任务。

任务执行流程

当达到任务定义的执行时间时,TaskScheduler会从线程池中获取一个线程来执行已注册的任务。任务执行的具体逻辑由ScheduledMethodRunnable对象的run方法完成。

4. 异常处理

如果@Scheduled方法抛出了未捕获的异常,Spring会默认记录日志,并继续执行后续的任务调度。如果需要自定义异常处理逻辑,可以在方法内部进行异常捕获和处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2229226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-21目录1. The Fair Language Model Paradox摘要研究背景问题与挑战如何解决创新点算法模型实验效果重要数据与结论推荐阅读指数&…

Python——实时域名通信状态监控

在互联网时代,网站和在线服务的可用性对于个人和企业都至关重要。域名的通信状态直接关系到服务的可达性,因此,实时监控域名的通信状态成为了一项基本需求。本文将详细介绍一个使用Python编写的简单域名通信状态监控工具,该工具能…

vue vxeui 上传组件 vxe-upload 全局配置上传方法,显示上传进度,最完美的配置方案

Vxe UI 上传组件 vxe-upload 全局配置上传方法,显示上传进度,最完美的配置方案 正常使用上传组件 vxe-upload,都是在用的时候传自定义上传方法,然后进行处理。几个页面是没什么问题,当系统页面非常多的时候&#xff0…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)没几天,又来一个新的,真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)https://blog.csdn.ne…

SSH登录介绍

说明:一般登录服务器,我们可以用远程连接工具,如XShell、Windterm等,或者通过公司搭建的JumpServer(跳板机、堡垒机)来连接。前者是点对点登录,输入主机、端口,通过SSH协议登录&…

Unity计算二维向量夹角余弦值和正弦值的优化方法参考

如果不考虑优化问题,计算两个向量的余弦值或者正弦值可以直接使用类似的方法: [SerializeField] Vector2 v1, v2;void Start() {float valCos Mathf.Acos(Vector2.SignedAngle(v1, v2));float valSin Mathf.Asin(Vector2.SignedAngle(v1, v2)); } 但是…

理解 CSS 中的绝对定位与 Flex 布局混用

理解 CSS 中的绝对定位与 Flex 布局混用 在现代网页设计中,CSS 布局技术如 flex 和绝对定位被广泛使用。然而,这两者结合使用时,可能会导致一些意想不到的布局问题。本文将探讨如何正确使用绝对定位元素,避免它们受到 flex 布局的…

JAVA力扣每日一题:P3216. 交换后字典序最小的字符串

本题来自&#xff1a;力扣-每日一题 力扣 (LeetCode) 全球极客挚爱的技术成长平台https://leetcode.cn/ 题解&#xff1a; class Solution {public String getSmallestString(String s) {int len s.length();int[] arr new int[len];for (int i 0; i < len; i) {arr[i…

Vue3 学习笔记(十二)侦听器详解

在 Vue 3 中&#xff0c;侦听器是一种响应式特性&#xff0c;允许你观察和响应 Vue 实例上的数据变动。Vue 提供了 watch 和 watchEffect 两个函数来创建侦听器。 1、watch 侦听器 watch 是一个用于侦听特定数据源变化的函数。它允许你指定一个或多个数据源&#xff0c;并在这些…

#渗透测试#SRC漏洞挖掘# 信息收集-常见端口及谷歌语法

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

SAP ABAP开发学习——第一代增强(包含增强演示)

​​​​​​SAP ABAP开发学习——第二代增强&#xff08;包含增强演示&#xff09;-CSDN博客 SAP ABAP开发学习——第三代增强&#xff08;BADI)-CSDN博客 概念 第一代增强(增强嵌入标准程序中) 第一代出口-User exit 以SD用户出口为例 SD及MM较多的程序都是基于源码控制来…

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…

动态规划 01背包(算法)

现有四个物品&#xff0c;小偷的背包容量为8&#xff0c;怎么可以偷得价值较多的物品 如: 物品编号&#xff1a; 1 2 3 4 物品容量&#xff1a; 2 3 4 5 物品价值&#xff1a; 3 4 5 8 记f(k,w) ,当背包容量为w,可以偷k件物品…

AWD挨打记录

前言 昨天参加了星盟的AWD集训&#xff0c;本来寻思能猛猛乱杀&#xff0c;结果加固时间只有20分钟&#xff0c;WAF还没push上去就被三家上了不死马QAQ cms是站帮主&#xff0c;之前没打过&#xff0c;D盾啥也没扫出来&#xff0c;还寻思是个贼安全的系统&#xff0c;结果洞满…

InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记

这是Radu大佬所在的Wrzburg大学的computer vision lab实验室发表在ECCV2024上的一篇论文&#xff0c;代码开源。文章提出了一种文本引导的All-in-One的restoration模型&#xff0c;如下图所示&#xff1a; 这个工作其实跟"InstructPix2Pix: Learning to Follow Image Edit…

libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑

博主是将大图切分成小图时遇到 问题一、linux编译后&#xff0c;找不到ffmpeg中的一个文件 产生原因&#xff0c;各种包集成&#xff0c;然后安装以后乱七八糟&#xff0c;甚至官方的教程也不规范导致没有添加路径到系统文件导致系统执行的时候找不到 1.下载 博主进行的离线…

【SQL实验】表的更新和简单查询

完整代码在文章末尾 在上次实验创建的educ数据库基础上&#xff0c;用SQL语句为student表、course表和sc表中添加以下记录 【SQL实验】数据库、表、模式的SQL语句操作_创建一个名为educ数据库,要求如下: (下面三个表中属性的数据类型需要自己设计合适-CSDN博客在这篇博文中已经…

UHF机械高频头的知识和待学习的疑问

电路图如上所示&#xff1a; 实物开盖清晰图如下&#xff1a; 待学习和弄懂的知识&#xff1a; 这是一个四腔的短路线谐振。分别是输入调谐&#xff0c;放大调谐&#xff0c;变频调谐和本振 第一个原理图输入为75欧&#xff08;应该是面向有同轴线的天线了&#xff09;如下图…

学习路之TP6--workman安装

一、安装 首先通过 composer 安装 composer require topthink/think-worker 报错&#xff1a; 分析&#xff1a;最新版本需要TP8&#xff0c;或装低版本的 composer require topthink/think-worker:^3.*安装后&#xff0c; 增加目录 vendor\workerman vendor\topthink\think-w…

【三十八】【QT开发应用】vlcplayer视频播放器(一)实现视频播放,视频暂停,视频停止,进度条调节,音量调节,时长显示功能

效果展示 vlcplayer_test视频播放器 MainWidget.ui 注意控件的布局和命名&#xff0c;控件的命名和信号与槽函数的绑定有关&#xff0c;所以这点很重要。 下载VLC组件和环境配置 videolan下载地址我下载的是vlc-3.0.8-win64版本. 将下载的文件复制粘贴到项目文件中. 复制粘…