Spring Boot实现定时任务

news2024/11/15 15:53:19

目录

  • 1.什么是定时任务
  • 2.Timer的使用
  • 3.Spring Task的使用
    • Api说明
    • 配置类启用定时任务支持
    • 配置定时任务
    • 多线程(异步)定时任务

1.什么是定时任务

定时任务是指在预定的时间点或按照特定的时间间隔自动执行的任务。

定时任务的应用场景:

  • 操作系统维护:例如,定期清理临时文件、更新系统补丁等。
  • 数据备份:定期对重要数据进行备份,以防数据丢失。
  • 自动化测试:例如,在每天凌晨自动运行软件测试脚本。
  • 网站维护:比如定时发布新内容、定时发送邮件提醒等。
  • 数据分析:例如,定期汇总和分析业务数据,生成报告。

2.Timer的使用

  1. 在特定时间执行任务,只执行一次
    public void schedule(TimerTask task,Date time)
    
  2. 在特定时间之后执行任务,只执行一次
    public void schedule(TimerTask task,long delay)
    
  3. 指定第一次执行的时间,然后按照间隔时间,重复执行
    public void schedule(TimerTask task,Date firstTime,long period)
    
  4. 在特定延迟之后第一次执行,然后按照间隔时间,重复执行
    public void schedule(TimerTask task,long delay,long period)
    
  5. 第一次执行之后,特定频率执行,与3同
    public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
    
  6. 在delay毫秒之后第一次执行,后按照特定频率执行
    public void scheduleAtFixedRate(TimerTask task,long delay,long period)
    

参数:

  • delay: 延迟执行的毫秒数,即在delay毫秒之后第一次执行
  • period:重复执行的时间间隔

示例:

  1. 配置任务类
//配置任务类
public class MyTask1 extends TimerTask {
    @Override
    public void run(){
        System.out.println("task1 run");
    }
}
  1. 启动任务
//启动任务
  public static void main(String[] args) {
        Timer timer = new Timer();
        延迟1秒启动,每1秒执行一次
        timer.schedule(new MyTask1(), 1000, 1000);
    }

3.Spring Task的使用

Spring Task 是 Spring 框架提供的一种轻量级的任务调度解决方案,主要用于在 Java 应用程序中执行定时任务。Spring Task 提供了简单且强大的任务调度功能,适用于各种规模的应用程序。

Api说明

  1. fixedDelay :上次结束到下次开始执行时间间隔:
@Scheduled(fixedDelay = 4000)

fixedDelay

  1. fixedRate:上一次开始执行时间和下次开始时间间隔10s。如:
@Scheduled(fixedRate = 10000)

fixedEate

  1. initialDelay:第一次延迟多长时间后再执行。
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
  1. Cron表达式

Cron表达式是:由若干数字、空格、符号按一定的规则,组成的一组字符串,从而表达时间的信息

Cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义

Cron 有如下两种语法格式:

  1. [秒] [分] [小时] [日] [月] [周] [年]
  2. [秒] [分] [小时] [日] [月] [周]
字段是否必填允许填写的值允许的通配符
0-59, - \* /
0-59, - \* /
小时0-23, - \* /
1-31, - \* ? / L W
1-12 or JAN-DEC, - \* /
1-7 or SUN-SAT, - \* ? / L #
留空 或 1970-2099, - \* /

通配符说明:

星号(*):表示所有值      ~~~~     例如:在分的字段上设置 “*”,表示每一分钟都会触发。

减号(-):表示区间        ~~~~~~       例如在小时上设置 “10-12”,表示 10,11,12点都会触发。

逗号(,):列出枚举        ~~~~~~       例如在分钟里,"5,15"表示5分钟和20分钟触发

斜杠(/):指定增量         ~~~~~~~        例如在分钟里,"3/15”表示从3分钟开始,没隔15分钟执行一次

问号(?): 只在日期域和星期域中使用,表示忽略该字段      ~~~~     例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?

L: 表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示一个星期五

W: 只能用在月份中,表示最接近指定天的工作日

#: 只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五

可通过在线生成Cron表达式的工具:https://www.bejson.com/othertools/cron/来生成自己想要的表达式。

常用示例:

表达式含义
0 * * * * ?每1分钟触发一次
0 0 * * * ?每天每1小时触发一次
0 0 10 * * ?每天10点触发一次
0 * 14 * * ?在每天下午2点到下午2:59期间的每1分钟触发
0 30 9 1 * ?每月1号上午9点半
0 15 10 15 * ?每月15日上午10:15触发
*/5 * * * * ?每隔5秒执行一次
0 */1 * * * ?每隔1分钟执行一次
0 0 5-15 * * ?每天5-15点整点触发
0 0/3 * * * ?每三分钟触发一次
0 0 0 1 * ?每月1号凌晨执行一次

配置类启用定时任务支持

@EnableScheduling
public class App {
}

配置定时任务

@Component
@Slf4j
public class ScheduledTask {

        //上一次开始执行时间和下次开始时间间隔5s
        @Scheduled(fixedRate = 5000)
        public void fixedRateTask() {
            log.debug("fixedRateTask");
        }

		//上次结束到下次开始执行时间间隔5s
        @Scheduled(fixedDelay = 5000)
        public void fixedDelayTask() {
               log.debug("fixedDelayTask");

        }
		//第一次延迟6秒后执行,然后每2s循环执行
        @Scheduled(initialDelay = 6000,fixedDelay = 2000)
        public void initialDelayTask() {
            log.debug("initialDelayTask");
        }

        //使用corn表达式每5s执行一次
        @Scheduled(cron = "0/5 * * * * ?")
        public void cron() {
              log.debug("cronTask执行");
        }      

}

多线程(异步)定时任务

  1. 配置线程池

    @Component
    public class ExecutorConfig {
        //定义核心线程数
        public static final  int CORE_POOL_SIZE = 10;
        // 最大线程数
        public static final  int MAX_POOL_SIZE = 20;
        // 任务队列容量大小
        public static final  int QUEUE_MAX_COUNT = 100;
    
        @Bean("asyncScheduledPool")
        public Executor asyncScheduledPool(){
            //自定义线程池
            ThreadPoolTaskExecutor threadPoolExecutor = new ThreadPoolTaskExecutor();
            //设置核心线程数
            threadPoolExecutor.setCorePoolSize(CORE_POOL_SIZE);
            //设置最大线程数 : 长工 +  临时工
            threadPoolExecutor.setMaxPoolSize(MAX_POOL_SIZE);
            //设置任务队列容量大小
            threadPoolExecutor.setQueueCapacity(QUEUE_MAX_COUNT);
            //设置线程的名称前缀
            threadPoolExecutor.setThreadNamePrefix("myTask-");
            //设置拒绝策略
            threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
            return  threadPoolExecutor;
        }
    }
    
  2. 开启异步支持:

    要在 Spring Boot 应用中启用异步方法调用,需在启动类上添加 @EnableAsync 注解。
    注解

  3. 定义异步方法:

    在服务类中定义一个方法,并使用 @Async 注解标记它以实现异步执行:
    在这里插入图片描述

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

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

相关文章

系统调用学习29

#include<iostream> #include<signal.h> #include<unistd.h> #include<vector> // 定义信号屏蔽常量 #define BLOCK_SIGNAL 2 #define MAX_SIGNUM 31// 定义需要屏蔽的信号数组 int sigarr[]{2,3,4}; // 展示当前线程未处理的信号状态 static void sho…

TortoiseGit修改差异查看器为BeyondCompare

1. TortoiseGit修改差异查看器 比较文件&#xff1a;”C:\Program Files\Beyond Compare 4\BComp.exe” %base %mine /title1%bname /title2%yname /leftreadonly差异文件&#xff1a;”C:\Program Files\Beyond Compare 4\BCompare.exe2. TortoiseGit修改合并工具 解决冲突&…

【嵌入式开发之网络编程】TCP端口和UDP端口

目录 网络端口的定义及作用 运输层的作用 运输层的两个主要协议 用户数据报协议UDP (User Datagram Protocol) 传输控制协议TCP (Transmission Control Protocol) 运输层的端口及分类 按照端口号分类 按照协议类型分类 BSD端口 网络端口的定义及作用 在网络技术中…

低代码平台的优势与挑战:现代开发的革新之路

在数字化转型的浪潮中&#xff0c;低代码平台&#xff08;Low-Code Platforms&#xff09;成为了开发者和企业的重要工具。低代码平台通过可视化界面和拖拽式功能&#xff0c;简化了应用程序的开发过程&#xff0c;使得即使是没有编程背景的用户也能够构建功能丰富的应用。然而…

ubuntu18.04下安装nvidia3090显卡驱动

前言&#xff1a;之前安装过4090的显卡&#xff0c;但是是使用20.04直接在第三方驱动里面安装的&#xff0c;这回使用的是18.04&#xff0c;版本估计是21年以前的&#xff0c;附加驱动直接没有&#xff0c;整整卡了两天&#xff0c;最后再查询多篇资料后最终安装好&#xff0c;…

软考-软件设计师 (计算机网络习题)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Impala 与 Hive 的比较

Impala 与 Hive 的关系 impala是基于hive的大数据分析查询引擎&#xff0c;直接使用hive的元数据库metadata&#xff0c;意味着impala元数据都存储在hive的metastore当中&#xff0c;并且impala兼容hive的绝大多数sql语法。所以需要安装impala的话&#xff0c;必须先安装hive&…

​高德离线API如何加载高清卫星影像

我们有客户遇到这样一个问题&#xff0c;现有平台基于高德API开发&#xff0c;但希望将地图更新为高清卫星影像。 我估计你可能也会遇到这个问题&#xff0c;因此特撰此文与大家分享。 项目背景 高德API有着比较广泛的用户群体&#xff0c;有不少系统为了业务数据的呈现&…

大数据应用整理

1.架构划分 1.1.数据抽取转换加载层&#xff08;ETL&#xff09; 从源系统抽取、转换、加载到所需的源数据&#xff0c;存储到系统的数据仓库中。ETL的设计和实施占整体工作的50%以上。ETL层的主要职责是将原始数据源中的数据提取出来&#xff0c;经过清洗、转换等处理后&…

小白学AI,新手也能轻松掌握的LLM Agent工作原理基础知识全览!

摘要 本文深入解释了大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;代理&#xff08;Agent&#xff09;的工作原理&#xff0c;详细阐述了它们的结构、能力和应用。 摘要 LLM代理是一种先进的数字助手&#xff0c;它们超越了传统的聊天机器人&am…

Postman数据驱动之CSV文件和JSON文件的处理

数据驱动 数据驱动&#xff1a;通过在测试过程中使用不同的输入数据来执行相同的测试脚本或流程。 适用场景&#xff1a;当一个接口需要测试多个场景用例&#xff08;正例、反例&#xff09;&#xff0c;可以使用数据驱动的形式实现。 CSV文件 CSV&#xff08;Comma-Separ…

verilog实现STFT

短时傅里叶变换&#xff08;STFT, Short Time Fourier Transform&#xff09;&#xff0c;是处理采样数据、获取信号时频特征的一种常用方法。然而其消耗的计算资源较为庞大&#xff0c;在数据采集设备全速运行时&#xff0c;若在上位机进行 STFT 的计算&#xff0c;则很难做到…

vue2使用天地图

需求&#xff1a;用vue2使用天地图展示对应点位数据以及开发中出现的问题等&#xff0c;其实天地图的写法和百度地图差不多 注意&#xff01;&#xff01;&#xff01;天地图的接口不稳定&#xff0c;时常报错418&#xff0c;官网也是一样的情况&#xff0c;推荐还是使用百度或…

一种基于物联网(IoT)的生物多样性监测系统

目录 摘要 第一部分&#xff1a;引言 第二部分&#xff1a;相关工作 第三部分&#xff1a;贡献 第四部分&#xff1a;提出的系统架构 第五部分&#xff1a;BN使用的消息框架 第六部分&#xff1a;系统实施 第七部分&#xff1a;实验场景和结果 第八部分&#xff1a;结…

游戏开发之性能优化

游戏开发中的性能优化是一个复杂且多方面的过程&#xff0c;涉及到多个层面的改进和调整。以下是一些主要的优化技巧和方法&#xff1a; 代码优化&#xff1a; 缓存计算结果&#xff1a;对于那些耗费大量CPU计算而计算结果无需每帧变化的逻辑&#xff0c;使用缓存可以显著提高性…

Java——反射(4/4):反射的作用、应用场景(案例需求、实现步骤、代码实现)

目录 作用 应用场景 案例需求 实现步骤 代码实现 作用 基本作用&#xff1a;可以得到一个类的全部成分然后操作。可以破坏封装性。最重要的用途是&#xff1a;适合做Java的框架&#xff0c;基本上&#xff0c;主流的框架都会基于反射设计出一些通用的功能。 通过反射能够…

Springboot+vue 建筑资质证书管理系统

建筑企业资证管理系统&#xff0c;简称证书管理软件&#xff0c;基于springbootvue开发&#xff0c;数据库采用mysql&#xff0c;。以建筑企业证书管理为核心&#xff0c;包含投证书管理、证书过期提醒&#xff0c;辅助建筑企业高效完成证书管理、人员信息、投标经营活动等管理…

全功能知识付费小程序源码系统 支持视频课程、音频课程、图文课程 附带代码包以及搭建部署教程

系统概述 “全功能知识付费小程序源码系统”是一款专为知识创作者、教育机构及企业内训部门设计的全方位解决方案。该系统基于当前最流行的小程序技术构建&#xff0c;无需下载安装&#xff0c;用户只需通过微信等社交平台即可轻松访问&#xff0c;极大地降低了使用门槛。同时…

CentOS 7 安装流程详细教程

目录 前言1. CentOS 7 概述2. 安装环境准备2.1 硬件要求2.2 安装介质准备 3. CentOS 7 安装步骤3.1 引导安装程序3.2 选择语言和键盘布局3.3 配置安装源和软件包3.4 配置分区3.5 设置网络和主机名3.6 设置时间和日期3.7 设置 root 密码和创建用户3.8 开始安装并完成配置 4. 安装…

8-11章节复习总结

文章目录 数据库技术三级模式两级映射数据设计数据模型E-R模型关系模型练习题 关系代数关系代数运算符练习题 SQL语句练习题 数据库控制练习题 数据库故障和备份函数依赖函数依赖的公理系统键与约束 规范化第一范式1NF第二范式2NF第三范式3NF练习题 模式分解练习题 标准化与知识…