Springboot 开发之 Scheduled 定时任务详解及实战

news2024/11/15 9:50:33

引言

Spring Boot中的@Scheduled注解用于配置定时任务,使得方法可以按照规定的时间间隔或特定的时间点定时执行。下面将详细解释@Scheduled注解的使用方法及其实战应用。

在这里插入图片描述

一、@Scheduled注解的基本用法

@Scheduled注解可以应用于方法上,并通过不同的参数来指定任务的执行时间、循环周期等。它主要支持以下几种时间配置方式:

  • fixedRate:表示固定频率执行,即上一次开始执行时间点后,再经过固定的时间间隔才执行下一次任务。例如,@Scheduled(fixedRate = 5000)表示每隔5秒执行一次任务。
  • fixedDelay:表示固定延迟时间执行,即上一次执行结束后,再经过固定的时间间隔才执行下一次任务。例如,@Scheduled(fixedDelay = 10000)表示在上一次任务执行完毕后,延迟10秒再执行下一次任务。
  • initialDelay:表示初始延迟时间,即在Spring容器启动后,需要等待一段时间才开始执行定时任务。它可以与fixedRate或fixedDelay一起使用。
  • cron:使用Cron表达式配置定时任务的执行时间。Cron表达式是一种强大的时间配置方式,可以指定复杂的执行计划。例如,@Scheduled(cron = “0 0 12 * * ?”)表示每天中午12点执行任务。

cron 表达式在线解析可以参考 https://cron.qqe2.com/

二、@Scheduled注解的实战应用

1. 启用定时任务

要在Spring Boot项目中启用定时任务,首先需要在启动类上添加@EnableScheduling注解。这个注解会开启Spring的任务调度功能,使得被@Scheduled注解的方法能够按照指定的时间规则执行。


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

2. 创建定时任务

接下来,可以创建一个定时任务类,并在其中定义被@Scheduled注解的方法。这个类通常会被@Component注解标记,以便Spring容器能够扫描到它。

@Component  
public class ScheduledTasks {  
  
    @Scheduled(fixedRate = 5000)  
    public void fixedRateTask() {  
        System.out.println("Fixed rate task - " + System.currentTimeMillis() / 1000);  
    }  
  
    @Scheduled(fixedDelay = 10000)  
    public void fixedDelayTask() {  
        System.out.println("Fixed delay task - " + System.currentTimeMillis() / 1000);  
    }  
  
    @Scheduled(cron = "0 0 1 * * ?")  
    public void cronTask() {  
        System.out.println("Cron task - " + System.currentTimeMillis() / 1000);  
    }  
}

3. 异步执行定时任务

Spring支持异步执行定时任务,只需在方法上添加@Async注解,并确保在配置类上添加@EnableAsync注解。

@Configuration
@EnableAsync
@EnableScheduling
public class AsyncScheduleConfig {
    // 配置类内容
}

@Component
public class AsyncScheduledTasks {

    @Async
    @Scheduled(fixedRate = 10000)
    public void asyncTask() {
        System.out.println("Async Task - 异步执行的定时任务");
    }
}

4. 注意事项

  • 被@Scheduled注解的方法不能有返回值,且必须为public
  • 如果任务的执行时间过长,超过了设定的时间间隔(如fixedRate或fixedDelay),Spring会等待当前任务完成后,再开始下一个任务的执行,这可能会导致任务堆积。
  • 如果任务需要访问数据库等资源,需要注意线程安全问题。
  • 在集群环境中,需要考虑分布式锁等机制,避免多个节点同时执行同一个任务

三、解决@Scheduled任务不执行的问题

如果@Scheduled任务没有按预期执行,可能是由以下几个原因造成的:

  • Cron表达式设置错误:检查Cron表达式是否正确无误。
  • 线程池配置问题:如果任务线程池已满,新的任务可能无法执行。可以通过调整线程池配置来解决这个问题。
  • 任务方法异常:任务方法中可能出现了异常,导致任务执行失败。可以在任务方法中添加异常处理逻辑。
  • Spring容器未扫描到@Scheduled注解:确保在启动类上添加了@EnableScheduling注解,并且Spring容器能够扫描到包含@Scheduled注解的类。

四、@Scheduled的多线程使用

1. @Scheduled多线程机制

在Spring Boot中,@Scheduled注解是基于Java的ThreadPoolExecutorScheduledThreadPoolExecutor实现的。Spring Boot会创建一个ScheduledThreadPoolExecutor线程池,并将定时任务添加到该线程池中等待执行。在指定的时间到来后,线程池会为定时任务分配一个线程来执行。

2. @Scheduled加入线程池处理定时任务

为了避免多线程问题,可以将@Scheduled任务交给线程池进行处理。以下是两种常见的方法:

(1) 使用@EnableScheduling + @Configuration配置ThreadPoolTaskScheduler


@Configuration
@EnableScheduling
public class TaskSchedulerConfig {
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);  // 设置线程池大小
        scheduler.initialize();
        return scheduler;
    }
}

在这个配置中,通过ThreadPoolTaskScheduler创建了一个线程池,并设置了线程池的大小。

(2) 使用ThreadPoolTaskExecutor

@Configuration
@EnableScheduling
public class TaskExecutorConfig {
    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);  // 设置核心线程池大小
        executor.setMaxPoolSize(50);   // 设置最大线程池大小
        executor.setQueueCapacity(1000);  // 设置队列容量
        executor.setKeepAliveSeconds(60);  // 设置线程存活时间
        executor.setThreadNamePrefix("task-executor-");  // 设置线程名称前缀
        return executor;
    }
}

在这个配置中,通过ThreadPoolTaskExecutor创建了一个线程池,并配置了线程池的核心参数。

在这里插入图片描述

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

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

相关文章

无心剑七绝《潘展乐神》

七绝潘展乐神 潘江陆海忘情游 展志凌云筑玉楼 乐创全球新纪录 神姿英发舞金钩 2024年8月1日 平水韵十一尤平韵 潘展乐神,这四个字,如同四座矗立的丰碑,分别代表了潘展乐在游泳领域的卓越成就、豪情壮志、快乐创新和非凡风采。无心剑的这首…

日本央行首次加息,同时缩减国债购买规模

KlipC报道:7月31日,日本央行在结束了为期两天的货币政策会议上决定加息,这也是日本央行从今年3月19日结束负利率政策后的首次加息。同时,将逐步缩减国债购买规模,还列出了具体的时间表。 对于加息,日本央行…

第十八天内容

上午 1、复习 (1)tomcat服务器需要jdk环境 版本对应 tomcat9》jdk1.8 tomcat10》jdk17 配置系统变量JAVA_HOME spring-boot3 > jdk17以上的版本 (2)nginx平滑升级,不停服升级nginx服务1.26.1> 1.27.0 1、…

RabbitMQ知识总结(基本概念)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 基本概念 Producer: 消息的生产者,是一个向…

数据结构与算法-二分搜索树节点的查找

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、二分搜…

【源码+文档+调试讲解】学生党务学习系统的设计与实现

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统大学生党务学习平台信息管理难度大,容错率低&…

MySQL基础练习题7-销售分析

题目:报告 2019年春季 才售出的产品。即 仅 在 2019-01-01 (含)至 2019-03-31 (含)之间出售的商品。 准备数据 分析数据 方法一:group by having 第一步:先找到要求的列 第二步&#xff1…

手持式洗地机该怎么选购?多款性能超好的洗地机推荐

传统的清洁方式,不仅费时费力,而且清洁效果也真的很一般,很多地方都清洁不到位。好在洗地机的出现很好的解决了这些问题,因为一款好的洗地机不仅能够让家务清洁事半功倍,而且还能有效除菌,地板更干净卫生&a…

某RED书旋转验证码识别(一)

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 本文的验证码网址如下,使用base64解码获得 因为旋转验证码能够处理的方式实在太多了,我将以处理的难度和方式依次讲解最简单到最难,到精度最高的方式,本文还是延续之前使用梯度计算的方式…

视频编辑SDK提供配套DEMO源码,提高开发效率

面对日益增长的视频制作需求,如何快速、高效且低成本地生产出专业级视频,成为众多企业面临的共同挑战。美摄科技,作为视频编辑技术的领航者,携其强大的视频编辑SDK及配套DEMO源码,为企业视频创作带来了革命性的解决方案…

Ubuntu系统下,截图软件(飞书,flameshot等)无法正常截图与编辑

Ubuntu系统下,截图软件(飞书,flameshot等)无法正常截图与编辑 问题描述: ubuntu系统下,飞书(设置截图快捷键),flameshot等截图工具无法正常使用,每次按快捷…

iOS ------ 持久化

一,数据持久化的目的 1,快速展示,提升体验 已经加载过的数据,用户下次查看时,不需要再次从网络(磁盘)加载,直接展示给用户 2.节省用户流量 对于较大的资源数据进行缓存&#xff…

2024小卷Spring Boot3.0教程思维导图整理

这是2024年小卷整理的最新spring Boot3.0实战教程的思维导图,后续将开始更新相关的笔记,欢迎新手朋友加入一起学习,如果您感兴趣不妨点赞关注下,您的支持是我更新的动力~加油!

【视觉SLAM】 G2O库编写步骤介绍

介绍G2O,并阐述基本使用方法。 G2O以稀疏优化器(SparseOptimizer)为核心,分为图的构建与求解器构建两部分,分别对应该图的上下两部分。 G2O编程步骤共分七步,如图所示: 构建求解器 1、创建一…

英飞凌 TC3XX单片机HSM内核开发-Secure Boot(七)

HSM UCB配置 UCB_HSM_ORIG 和 UCB_HSM_COPY配置描述 HSMCOTP保护配置了专用HSM闪存扇区的HSM独占和一次性可编程(OTP)保护。它提供了通过两个配置集增量添加此类保护到闪存扇区的可能性: 从UCB_HSMCOTP0_ORIG和UCB_HSMCOTP0_COPY派生的HSM…

day8 Excel教程——利用数据验证规范单元格输入!(超多干货)

day8 Excel教程——利用数据验证规范单元格输入! 本章目录 day8 Excel教程——利用数据验证规范单元格输入!1. 整数,小数和文本长度1.1 限制用户输入1(最小)和10(最大)之间的数字1.2 限制用户应输入小于或等于3%的小数(百分比)值1.3 限制用户应输入文本长度为18位的身份…

【卫星载荷之QF项目-001】Vivado 2018.3安装

1.简介 Vivado 是 FPGA 厂商赛灵思公司(Xilinx)于 2012 年起发布的集成设计环境。Vivado2018.3 是 2018 年 Xilinx 推出的 Vivado 最后一个版本,相对稳定。 2.软件下载 网上自己去官网即可获取安装资源包。 3.软件安装 解压缩安装包&…

来未来面试真题:根据树形表输出树形结构

根据以下所给代码补充完printNode方法,要求输出如下形式的树形结构 package com.ting.sort;import java.util.ArrayList; import java.util.HashMap; import java.util.List;public class Menu {static class Node{Integer id;Integer parentId;String name;Node(In…

【PyTorch】多对象分割项目

对象分割任务的目标是找到图像中目标对象的边界。实际应用例如自动驾驶汽车和医学成像分析。这里将使用PyTorch开发一个深度学习模型来完成多对象分割任务。多对象分割的主要目标是自动勾勒出图像中多个目标对象的边界。 对象的边界通常由与图像大小相同的分割掩码定义&#xf…