Spring @Scheduled参数区别、组合及应用场景有哪些?
摘要:SpringBoot Scheduled 常见用法: https:www.cnblogs.comvipsoftp15751660.html import cn.hutool.core.date.DateUtil; import o
SpringBoot Scheduled 常见用法: https://www.cnblogs.com/vipsoft/p/15751660.html
import cn.hutool.core.date.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class TestJob {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Scheduled(cron = "*/10 * * * * ?")
public void crontabTask() throws InterruptedException {
logger.info("这是基于 cron -- 按系统时钟算 开始: {}", DateUtil.now());
Thread.sleep(2000);
logger.info("这是基于 cron -- 按系统时钟算 结束: {}", DateUtil.now());
}
@Scheduled(fixedRate = 10 * 1000)
public void fixedRateTask() throws InterruptedException {
logger.info("这是基于 fixedRate -- 从上一次启动开始算 开始: {}", DateUtil.now());
Thread.sleep(2000);
logger.info("这是基于 fixedRate -- 从上一次启动开始算 结束: {}", DateUtil.now());
}
@Scheduled(fixedDelay = 10 * 1000)
public void fixedDelayTask() throws InterruptedException {
logger.info("这是基于 fixedDelay -- 从上一次结束开始算 开始: {}", DateUtil.now());
Thread.sleep(2000);
logger.info("这是基于 fixedDelay -- 从上一次结束开始算 结束: {}", DateUtil.now());
}
}
1. 基本概念对比
cron
定义:使用 Unix/Linux 风格的 cron 表达式
语法:秒 分 时 日 月 周 年(可选)
特点:
基于日历的调度
执行时间固定
适合在特定时间点执行任务
// 每天凌晨1点执行
@Scheduled(cron = "0 0 1 * * ?")
// 每5分钟执行(在每分钟的0秒执行)
@Scheduled(cron = "0 */5 * * * ?")
// 每小时的10分、30分、50分执行
@Scheduled(cron = "0 10,30,50 * * * ?")
fixedRate
定义:固定频率执行,从上一次开始时间开始计算间隔
特点:
固定频率,不关心任务执行时间
如果任务执行时间超过间隔,会立即开始下一次执行
可能造成任务重叠
// 每5分钟执行一次(从上次开始算起)
@Scheduled(fixedRate = 5 * 60 * 1000)
fixedDelay
定义:固定延迟执行,从上一次结束时间开始计算间隔
特点:
保证任务执行间隔
不会出现任务重叠
适合需要保证任务串行执行的场景
// 上次执行结束后,等待5分钟再执行下次
@Scheduled(fixedDelay = 5 * 60 * 1000)
initialDelay
定义:首次执行延迟时间
特点:
只在第一次执行前等待
可以与 fixedRate 或 fixedDelay 组合使用
不影响后续执行间隔
// 应用启动后等待10分钟,然后每5分钟执行一次
@Scheduled(ini
