当前位置: 首页 > article >正文

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

目录

方法一:使用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.kler.cn/a/377864.html

相关文章:

  • 11.5学习swing
  • Spring 中的 Environment 对象
  • Granola:AI增强的会议记录工具,提升工作效率的利器
  • 【Android】Gradle 7.0+ 渠道打包配置
  • 从APP小游戏到Web漏洞的发现
  • 【Nginx】编译安装(Centos)
  • 视频Qoe测量学习笔记(一)
  • java中checkbox(只为记录,ai生成)
  • C++日期和时间库
  • Java 数据结构及其在日常业务中的应用!
  • 【代码随想录Day57】图论Part08
  • Rust语言有哪些数据类型?
  • linux super键是什么_linux终端的快捷命令汇总
  • Linux上本地部署KubeSphere与cpolar实现远程管理和监控集群
  • 在centos中安装cmake
  • JVM 类加载机制详解
  • redis详细教程(7.哨兵)
  • 为数据集而生的 SQL 控制台
  • 私有化视频平台EasyCVR视频汇聚平台接入RTMP协议推流为何无法播放?
  • 【LeetCode】每日一题 2024_11_2 使两个整数相等的位更改次数(位运算/模拟)
  • OPENAI官方prompt文档解析
  • 基于知识引导提示的因果概念提取(论文复现)
  • linux 系统扩容
  • (二 上)VB 2010 设计初步
  • Apache Hive 通过Docker快速入门
  • 华为OD机试真题-组装最大可靠性设备-2024年OD统一考试(E卷)