You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SpringBoot中获取@Scheduled定时任务的上次执行时间

获取@Scheduled定时任务的上次执行时间

要在Spring Boot默认调度器下获取任务的上次执行时间,无需依赖Quartz或数据库存储,直接用Java标准库的原子类或volatile变量即可实现,核心思路是在内存中记录每次任务执行的时间戳。

方案实现

使用AtomicLong存储时间戳(保证多线程环境下的原子性,若任务是单线程执行,用volatile long也可以),每次执行任务时先获取上次时间,执行完成后更新当前时间:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicLong;

@Component
public class ReportGenerator {
    // 初始化值设为应用启动时间,可根据业务调整为第一次执行前的合理时间
    private final AtomicLong lastExecutionTime = new AtomicLong(System.currentTimeMillis());

    @Scheduled(cron = "${cron expression}")
    public void generateReport() {
        // 获取上次执行时间戳
        long previousExecutionTime = lastExecutionTime.get();
        
        // 业务逻辑:基于previousExecutionTime检索数据库记录
        // TODO: 实现数据库查询及报告生成逻辑

        // 执行完成后更新上次执行时间为当前时间
        lastExecutionTime.set(System.currentTimeMillis());
    }
}

异常场景处理

如果任务可能抛出异常中断执行,建议将更新时间的操作放在finally块中,确保无论任务成功与否都能记录执行时间:

@Scheduled(cron = "${cron expression}")
public void generateReport() {
    long previousExecutionTime = lastExecutionTime.get();
    try {
        // 业务逻辑:检索数据库、生成报告
    } finally {
        // 确保时间更新操作始终执行
        lastExecutionTime.set(System.currentTimeMillis());
    }
}

注意事项

  • 这种方式是内存存储,应用重启后上次执行时间会重置为初始值,需根据业务场景考虑重启后的补偿逻辑(比如从应用启动时间开始检索,或设置一个固定的初始时间)。
  • 默认情况下@Scheduled任务是单线程执行的,若配置了多线程调度器,AtomicLong的原子性可以避免并发更新问题。

内容的提问来源于stack exchange,提问作者Karkala Srikanth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:13:08