Spring boot定时任务-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

前言

在 Spring Boot 中有多种方法来编写定时任务以执行周期性或延迟执行的任务。下面是几种常见的方式

一、使用 @Scheduled 注解

Spring Boot 提供了 @Scheduled 注解可以将该注解应用在方法上以指定方法的执行时间这也是最简单的开启定时任务的方法。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {
    @Scheduled(fixedRate = 10000) // 每10秒执行一次
    public void doTask() {
        // 你的任务逻辑
    }
}

这种方式非常简单适用于简单的定时任务需求下面是 @Scheduled 注解的常用参数

fixedRate以固定的速率执行任务。例如@Scheduled(fixedRate = 10000) 表示每隔 10 秒执行一次任务。

fixedDelay以固定的延迟执行任务。例如@Scheduled(fixedDelay = 5000) 表示在上一个任务完成后延迟 5 秒再执行下一个任务。

initialDelay在应用程序启动后首次执行任务的延迟时间。例如@Scheduled(initialDelay = 3000, fixedRate = 10000) 表示在应用启动后等待 3 秒然后每隔 10 秒执行一次任务。

cron使用 Cron 表达式来定义任务的执行时间。Cron 表达式非常灵活可以指定精确的执行时间和日期。例如@Scheduled(cron = “0 * * * * ?”) 表示每小时执行一次任务。

cron表达式语法

[秒(0-59)] [分(0-59)] [时(0-23)] [日(1-31)] [月(1-12或英文缩写)] [周(0-7或英文缩写)]

Cron 表达式还支持一些特殊字符和符号用于更复杂的时间规则

*星号: 表示匹配该字段的任意值例如* 在秒钟字段中表示每秒都触发。
,逗号: 表示一个列表可以包含多个数值例如1,3,5 在分钟字段中表示每小时的第1、3、5分钟触发。
-连字符: 表示一个范围例如1-5 在分钟字段中表示每小时的第1到5分钟触发。
/斜杠: 表示步长例如*/5 在分钟字段中表示每隔5分钟触发一次。
?问号: 通常用在日期和星期几字段表示不指定值。
L大写字母L: 通常用在日期和星期几字段表示最后一天或最后一周。
W大写字母W: 通常用在日期字段表示工作日周一到周五最接近指定日期但可能不是准确的日期。
#井号: 通常用在星期几字段表示一个月中的第几个星期几例如6#3 表示每月的第三个星期五。

Cron 表达式含义
* * * * * ?每秒钟执行一次任务
0 * * * * ?每分钟的第0秒执行任务
0 0 * * * ?每小时的第0分0秒执行任务
0 0 12 * * ?每天中午12:00执行任务
0 0 12 * * MON每周一中午12:00执行任务
0 0 12 1 * ?每月1日中午12:00执行任务
0 0 12 1 1 ?每年1月1日中午12:00执行任务
0 0 * * 1-5 ?工作日周一至周五的每小时执行任务
0 0 0 * * ?每天凌晨00:00执行任务
0 0 * * SUN每周日的每小时执行任务
0 0 8-17 * * ?每天上午8点到下午5点的每小时执行任务
0 0/15 * * * ?每15分钟执行一次任务

二、使用 ScheduledExecutorService

Java 自带了 ScheduledExecutorService 接口它允许创建并执行定时任务。可以使用 ScheduledThreadPoolExecutor 类来创建一个线程池以执行周期性任务。这种方式更加灵活可以处理复杂的任务。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class ScheduledTasks {
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public void scheduleTask() {
        scheduler.scheduleAtFixedRate(this::doTask, 0, 10, TimeUnit.SECONDS);
    }

    public void doTask() {
        // 你的任务逻辑
    }
}

这种方式适用于需要更多控制的任务如动态任务创建、取消等。

三、使用 Spring 的 TaskScheduler

Spring 提供了 TaskScheduler 接口它允许你执行定时任务。你可以使用 Spring 提供的实现类如 ThreadPoolTaskScheduler。

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTasks {
    private final ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();

    public ScheduledTasks() {
        scheduler.initialize();
        scheduler.schedule(this::doTask, new CronTrigger("0/10 * * * * ?")); // 每10秒执行一次
    }

    public void doTask() {
        // 你的任务逻辑
    }
}

这种方式适用于需要更高级的任务调度如使用 Cron 表达式等。

四、使用第三方调度框架

除了内置的方式你还可以选择使用第三方调度框架如 Quartz Scheduler。Quartz 提供了高度灵活的调度功能允许你配置复杂的任务计划和调度策略。

选择哪种方法取决于你的具体需求。对于简单的定时任务@Scheduled 注解通常足够但如果需要更高级的控制和灵活性可能需要考虑其他方式。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring