【Spring Boot】# 使用@Scheduled注解无法执行定时任务

ops/2024/11/26 17:26:53/

1. 前言

在 Spring Boot中,使用@Scheduled注解来定义定时任务时,定时任务不执行;或未在规定时间执行。

java">import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class MySchedule {/*** 5秒执行一次*/@Scheduled(cron = "0/5 * * * * ?")public void task1() {System.out.println("Scheduled task-1111 is running ... ...");}/*** 10秒执行一次*/@Scheduled(cron = "0/10 * * * * ?")public void task2() {System.out.println("Scheduled task-2222 is running ... ...");}
}

2. 解决

2.1 定时任务不执行

  • 启动类或者相关Configuration类上,添加@EnableScheduling注解;
  • 然后在定义定时任务的类上,添加 @Component 注解

2.2 未按规定时间执行

如果使用@Scheduled注解定义了多个定时任务,但是任务未按规定时间执行。

  • 增加配置类,改变线程池大小

    java">import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;/*** @Description : scheduler配置类*/
    @Configuration
    public class ScheduledTaskConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(20); // 线程池大小设置为20taskScheduler.initialize();taskRegistrar.setTaskScheduler(taskScheduler);}
    }
    

原因分析

  • 查看 @Scheduled注解的源码:每一个有@Scheduled注解的方法都会被注册为一个ScheduledAnnotationBeanPostProcessor

    image-20241121182709167

  • 继续跟踪,看ScheduledAnnotationBeanPostProcessor的源码

    image-20241121182956161

    从图中的这句话得知,如果我们不主动配置我们需要的TaskScheduler,Spring Boot会默认使用一个单线程的scheduler来处理我们用@Scheduled注解实现的定时任务

要的TaskScheduler,Spring Boot会默认使用一个单线程的scheduler来处理我们用@Scheduled注解实现的定时任务

因为默认是单线程处理,因此就会导致有的有的任务在规定时间内没执行,需要等待。


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

相关文章

Python 爬虫从入门到(不)入狱学习笔记

爬虫的流程:从入门到入狱 1 获取网页内容1.1 发送 HTTP 请求1.2 Python 的 Requests 库1.2 实战:豆瓣电影 scrape_douban.py 2 解析网页内容2.1 HTML 网页结构2.2 Python 的 Beautiful Soup 库 3 存储或分析数据(略) 一般爬虫的基…

【MATLAB源码-第223期】基于matlab的Massive-MIMO Vblast检测比较,对比ZF ZF-SIC MMSE MMSE-SIC四种算法。

操作环境: MATLAB 2022a 1、算法描述 无线通信系统的发展极大地推动了现代通信技术的进步,从移动通信到无线局域网,甚至是物联网,均依赖于无线通信系统的高效和可靠性。在无线通信系统中,核心目标是实现数据的可靠传…

2024年11月最新版Adobe PhotoShop(26.0)中文版下载

点击下载 Adobe PhotoShop 是一款功能强大的应用程序,已被各种公司、专业艺术家、设计和创作者广泛使用。该程序允许您创建、编辑和合成多层、蒙版和多种颜色模型(包括 RGB、专色、CMYK 等)的光栅图像。 Adobe Adobe PhotoShop 主要功能&…

AIVA 技术浅析(三):如何通过CNN捕捉音乐作品中的细节和模式

为了更深入地理解AIVA(Artificial Intelligence Virtual Artist)如何利用卷积神经网络(CNN)捕捉音乐作品中的细节和模式,并生成高质量的音乐,以下是个人理解与浅析: 1. 数据收集与预处理 1.1 …

Oracle 数据库 23ai 新特性: Schema Annotations

Data Use Case Domain (数据用例域)和 Schema Annotation 都属于 Application Data Usage 的范畴。但Data Use Case Domain比Schema Annotation要简单得多,也重要得多。因此我们先讲解简单的。 本文介绍23ai的新特性,Schema Anno…

数据结构之一:复杂度

相关代码:SData/test_22/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 数据结构:在内存当中存储、组织数据的方式。(顺序表、链表、栈、队列、树等)。 算法:与数据结构配合使用,是对数据的处理。&#…

进程间通信5:信号

引入 我们之前学习了信号量,信号量和信号可不是一个东西,不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的,无法预测信号可以临时保存下来,之后再处理信号是异步发送的…

重构代码之将引用类型更改为值类型

将引用类型更改为值类型的目标是将引用类型转换为值类型,通常是为了简化代码,减少副作用,提高代码的可理解性和可维护性。这个重构技术适用于那些引用类型在某些情况下表现得像值类型的场景,尤其是当引用类型不需要共享状态时。通…