Spring Boot实现定时任务

目录

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");

    }

    }

  2. 启动任务

    //启动任务

    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)

  1. fixedRate:上一次开始执行时间和下次开始时间间隔10s。如:

    @Scheduled(fixedRate = 10000)

  1. initialDelay:第一次延迟多长时间后再执行。

    @Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

  2. 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 注解标记它以实现异步执行:

相关推荐
axng pmje19 分钟前
Java语法进阶
java·开发语言·jvm
uzong24 分钟前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan30 分钟前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv730 分钟前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫33 分钟前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879233 分钟前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本35 分钟前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab1 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
yaoxin5211231 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯3 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图