Spring Task 使用详解

news2024/11/23 21:37:25

在应用开发中,定时任务扮演着至关重要的角色,例如定时数据同步、定时邮件发送、定时清理缓存等。Spring Framework 提供了一个强大而灵活的定时任务框架——Spring Task,它可以帮助我们轻松地实现各种定时任务,而无需依赖复杂的第三方库。本文将深入探讨 Spring Task 的使用方法,并结合 Spring Boot 项目进行演示,涵盖 @Scheduled 注解的多种用法、Cron 表达式的详细解释、SchedulingConfigurer 接口的灵活配置以及异步任务的处理。

1. Spring Task 简介

Spring Task 基于 @Scheduled 注解和 ScheduledExecutorService 线程池,提供了两种主要方式来实现定时任务:

  • 基于注解 @Scheduled: 简洁易用,适用于大多数场景。通过在方法上添加 @Scheduled 注解,并配置 cron 表达式、fixedRate、fixedDelay 或 fixedRateString/fixedDelayString 参数,即可实现定时执行。

  • 基于接口 SchedulingConfigurer: 提供更灵活的配置方式,可以自定义线程池,适用于对任务调度有更高要求的场景,例如需要控制并发线程数、设置线程池队列大小等。

2. 基于 @Scheduled 注解的使用

2.1 添加依赖 (Spring Boot 项目通常无需额外添加,因为自带该依赖)

非 Spring Boot 的 Spring 项目中,需要添加 spring-context 依赖:

***Spring Boot 项目中无需添加依赖***

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>

2.2 开启定时任务支持

在 Spring Boot 项目的配置类上添加 @EnableScheduling 注解:

@SpringBootApplication
@EnableScheduling   //开启定时任务
public class MyApplication {
    // ...
}

2.3 创建定时任务

采用注解方式,主要是cron表达式

@Component
public class ScheduledTasks {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    // 每5秒执行一次
    @Scheduled(fixedRate = 5000)
    public void fixedRateTask() {
        System.out.println("Fixed Rate Task : " + dateFormat.format(new Date()));
    }

    // 每分钟执行一次
    @Scheduled(cron = "0 * * * * ?") // 注意:此处纠正了cron表达式
    public void cronTask() {
        System.out.println("Cron Task : " + dateFormat.format(new Date()));
    }

    // 上一次任务执行完成后,延迟10秒再执行
    @Scheduled(fixedDelay = 10000)
    public void fixedDelayTask() {
        System.out.println("Fixed Delay Task : " + dateFormat.format(new Date()));
        try {
            Thread.sleep(5000); // 模拟任务执行时间
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 使用字符串配置,更灵活,支持占位符
    @Scheduled(fixedRateString = "${my.fixedRate}") // application.properties 中配置 my.fixedRate=6000
    public void fixedRateStringTask() {
        System.out.println("Fixed Rate String Task : " + dateFormat.format(new Date()));
    }
}

2.4 Cron 表达式详解

Cron 表达式由6或7个字段组成,用空格分隔,分别表示:

秒   分   时   日   月   周   年
  • 秒 (0-59)

  • 分 (0-59)

  • 时 (0-23)

  • 日 (1-31)

  • 月 (1-12)

  • 周 (0-7) (0 和 7 都代表星期天)

  • 年20XX

举例:(周 和 日 不能同时出现,若一定要同时出现,则其中一个必须为“ ?”,因为会产生冲突)

特殊字符:

  • *:代表所有可能的值

  • ?:不指定值,用于日和周字段,表示不关心具体值

  • -:指定一个范围

  • ,:列出多个值

  • /:指定增量

  • L:表示最后一个,例如月的最后一个星期日

  • W:表示最接近指定日期的工作日

  • #:表示第几个,例如周的第几个星期日

更详细的 Cron 表达式示例:

  • 0 0 12 * * ?:每天中午12点触发

  • 0 15 10 ? * MON-FRI:周一至周五每天上午10:15触发

  • 0 0/5 * * * ?:每5分钟触发

  • 0 0 1,12 * * ?:每天凌晨1点和中午12点触发

  • 0 10 1 * * 6L:每个月的最后一个星期五上午10:10触发

  • 0 0 10 ? * 2#3:每个月的第三个星期二上午10:00触发

3. 基于 SchedulingConfigurer 接口的使用

@Configuration
public class TaskSchedulerConfig implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(5); // 设置线程池大小为5
        executor.setRemoveOnCancelPolicy(true); // 设置取消策略
        executor.setThreadNamePrefix("MyScheduled-"); // 设置线程名前缀
        return executor;
    }
}

4. 异步任务

为了避免阻塞主线程,可以将耗时的定时任务设置为异步执行。

@Component
public class AsyncScheduledTasks {

    @Async
    @Scheduled(fixedRate = 5000)
    public void asyncTask() {
        // ... 执行耗时操作 ...
    }
}

@Configuration
@EnableAsync // 开启异步任务支持
public class AsyncConfig implements AsyncConfigurer {
    // ... 配置异步任务线程池 ...
}

5. 简单使用示例

编写MyTask 定时任务

5.1 首先启动类添加注解 @EnableScheduling

5.2 编写task定时方法

/**
 * 自定义定时任务类
 */
@Component
@Slf4j
public class MyTask {

    /**
     * 定时任务 每隔5秒触发一次
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void executeTask(){
        log.info("定时任务开始执行:{}",new Date());
    }
}

运行:每隔五秒执行定时任务

6. 总结

Spring Task 提供了强大且灵活的定时任务管理功能,@Scheduled 注解的便捷性和 SchedulingConfigurer 接口的灵活性可以满足各种定时任务的需求。结合异步任务处理,可以进一步优化应用性能。

希望本文能帮助各位看官更深入地理解和使用 Spring Task,在你的项目中优雅地实现定时任务。 感谢各位看官的观看,下期见,谢谢~

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

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

相关文章

光影魔术手 0.1.5 | 免费的修图神器,支持AI智能美颜、证件照制作等功能

光影魔术手是一款完全免费的修图软件、AI智能调色软件、证件照制作软件。支持的功能包括&#xff1a;AI智能美颜、AI人脸变清晰、AI智能调色、AI滤镜、拼图、证件照制作、图片裁剪。证件照制作功能提供了丰富的证件照尺寸&#xff0c;支持7种背景颜色切换。拼图功能支持横向长图…

XXl-JOB 安装使用,服务注册

一、下载源码 xxl-job源码地址&#xff1a; GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任务调度平台XXL-JOB&#xff09; 2.4.2版本为例&#xff1a;https://github.com/xuxueli/xxl-job/archive/refs/tags/2.4.1.tar.gz xx…

2013年国赛高教杯数学建模C题古塔的变形解题全过程文档及程序

2013年国赛高教杯数学建模 C题 古塔的变形 由于长时间承受自重、气温、风力等各种作用&#xff0c;偶然还要受地震、飓风的影响&#xff0c;古塔会产生各种变形&#xff0c;诸如倾斜、弯曲、扭曲等。为保护古塔&#xff0c;文物部门需适时对古塔进行观测&#xff0c;了解各种变…

【交通标志识别系统】Python+卷积神经网络算法+人工智能+深度学习+机器学习+算法模型

一、介绍 交通标志识别系统。本系统使用Python作为主要编程语言&#xff0c;在交通标志图像识别功能实现中&#xff0c;基于TensorFlow搭建卷积神经网络算法模型&#xff0c;通过对收集到的58种常见的交通标志图像作为数据集&#xff0c;进行迭代训练最后得到一个识别精度较高…

C语言中的文件操作(一)

目录 一、为什么要使用文件 二、什么是文件 1、程序文件 2、数据文件 文件名 三、文件打开和关闭 1、文件指针 2、文件打开关闭 &#xff08;1&#xff09;fopen 打开 &#xff08;2&#xff09;fclose 关闭文件 &#xff08;3&#xff09;路径 1.绝对路径 2.相对路…

子网掩码、网络地址、广播地址、子网划分及计算

1. IPV4地址分类及组成 IP地址网络地址主机地址&#xff0c;&#xff08;又称&#xff1a;主机号和网络号&#xff09; 由上图可见网络号和主机号之和是32&#xff0c;而且此多彼少。 例&#xff1a;IP地址为192.168.2.131&#xff0c;转换成二进制1111 1111.1010 1000.0000 00…

编译原理——扫描器设计与实现

非常详细&#xff08;包括跳过注释部分&#xff09;&#xff0c;不多说直接上代码&#xff08;结合代码讲解&#xff09; #include<bits/stdc.h>using namespace std;#define ARRAY_LENGTH(arr) (sizeof(arr) / sizeof(arr[0]))//关键词集合 string KEY_WORD[] {"…

vue+ant解决弹窗可以拖动的问题

通过自定义指令实现拖拽功能 在main.js里加入drag自定义指令 Vue.directive(drag, {bind(el) {// 获取弹窗头部const header el.querySelector(.ant-modal-header)const modal el.querySelector(.ant-modal)// 弹窗头部鼠标变为移动header.style.cursor move// 头部鼠标按…

心觉:别再让你的精力流浪,精准掌控每一刻

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作197/1000天 昨天写了一篇文章心觉&#xff1a;生理欲望转化的奥秘&#xff1a;提升创造力的法则 核心观点是来自于拿破仑希尔的《…

ICML 2024 | 牛津提出合作图神经网络Co-GNNs,更灵活的消息传递新范式

引用次数:9 引用格式:Finkelshtein B, Huang X, Bronstein M, et al. Cooperative graph neural networks[J]. arXiv preprint arXiv:2310.01267, 2023. 一、摘要 本文提出了一种训练图神经网络的新框架“合作图神经网络”(Co-GNNs),其中每一个节点可以被看作一个独立的玩…

【数据结构】邻接表

一、概念 邻接表是一个顺序存储与链式存储相结合的数据结构&#xff0c;用于描述一个图中所有节点之间的关系。 若是一个稠密图&#xff0c;我们可以选择使用邻接矩阵&#xff1b;但当图较稀疏时&#xff0c;邻接矩阵就显得比较浪费空间了&#xff0c;此时我们就可以换成邻接…

grpc的python使用

RPC 什么是 RPC &#xff1f; RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;是一种计算机通信协议&#xff0c;允许一个程序&#xff08;客户端&#xff09;通过网络向另一个程序&#xff08;服务器&#xff09;请求服务&#xff0c;而无需了解…

JDK17常用新特性

目前国内大部分开发人员都是在使用jdk8&#xff0c;甚至是jdk6&#xff0c;但是随着jdk的更新迭代&#xff0c;jdk8我觉得可能就会慢慢的淡出舞台&#xff0c;随着目前主流框架最新版推出明确说明了不再支持jdk8&#xff0c;也促使我不得不抓紧学习了解一波jdk17的新特性&#…

手写mybatis之解析和使用ResultMap映射参数配置

前言 学习源码是在学习什么呢&#xff1f; 就是为了通过这些源码级复杂模型中&#xff0c;学习系统框架的架构思维、设计原则和设计模式。在这些源码学习手写的过程中&#xff0c;感受、吸收并也是锻炼一种思维习惯&#xff0c;并尝试把这些思路技术迁移到平常的复杂业务设计开…

MD5消息摘要算法学习

MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种广泛使用的哈希函数&#xff0c;它用于生成128位的哈希值&#xff08;也称为消息摘要&#xff09;。MD5主要用于确保信息的完整性&#xff0c;即可以通过对数据生成的哈希值来验证数据是否被篡改。尽管MD5在过去被…

60. 排列序列【回溯】

文章目录 60. 排列序列解题思路Go代码 60. 排列序列 60. 排列序列 给出集合 [1,2,3,...,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; “123”“132”“213”“231”“31…

SpringBoot 集成GPT实战,超简单详细

Spring AI 介绍 在当前的AI应用开发中&#xff0c;像OpenAI这样的GPT服务提供商主要通过HTTP接口提供服务&#xff0c;这导致大部分Java开发者缺乏一种标准化的方式来接入这些强大的语言模型。Spring AI Alibaba应运而生&#xff0c;它作为Spring团队提供的一个解决方案&…

Spring Boot 3 文件管理:上传、下载、预览、查询与删除(全网最全面教程)

在现代Web应用中&#xff0c;文件管理是一个非常重要的功能。Spring Boot作为Java开发领域的热门框架&#xff0c;提供了丰富的工具和API来简化文件管理的操作。本文将详细介绍如何使用Spring Boot 3进行文件的上传、下载、预览、查询与删除操作&#xff0c;并提供一个完整的示…

OpenCV 环境配置

首先下载opencv&#xff0c;在opencv官网进行下载。 按照上面的步骤&#xff0c;点击进去 滑至底部&#xff0c;不切换至不同页&#xff0c;选择合适的版本进行下载(Window系统选择Windows版本进行下载)。 接下来以4.1.2版本为例&#xff1a; 点击之后会进入这个页面&#xff…

聚类分析 | NRBO-GMM聚类优化算法

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 (创新)NRBO-GMM聚类优化算法 (NRBO聚类优化&#xff0c;创新&#xff0c;独家) 牛顿-拉夫逊优化算法优化GMM高斯混合聚类优化算法 matlab语言&#xff0c;一键出图&#xff0c;直接运行 1.牛顿-拉夫逊优化算法(New…