From e38b1dbbfbc6715cb86c3293438b2447214c5b7a Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 21 Nov 2025 10:43:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(scheduled):=20=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=95=B0=E6=8D=AE=E6=B8=85=E7=90=86=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 LogDataCleanSchedule 定时任务类 - 实现每天凌晨2点自动清理六个月前的日志数据 - 使用 cron 表达式 "0 0 2 * * ?" 配置执行时间 - 通过 LambdaQueryWrapper 构造删除条件 - 添加任务执行日志记录和异常处理 - 继承 BaseSchedule 实现任务幂等性和缓存控制 --- .../scheduled/LogDataCleanSchedule.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 business/src/main/java/com/fizz/business/scheduled/LogDataCleanSchedule.java diff --git a/business/src/main/java/com/fizz/business/scheduled/LogDataCleanSchedule.java b/business/src/main/java/com/fizz/business/scheduled/LogDataCleanSchedule.java new file mode 100644 index 0000000..669b250 --- /dev/null +++ b/business/src/main/java/com/fizz/business/scheduled/LogDataCleanSchedule.java @@ -0,0 +1,55 @@ +package com.fizz.business.scheduled; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fizz.business.domain.LogData; +import com.fizz.business.service.LogDataService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +/** + * 日志数据清理定时任务 + * 每天凌晨2点执行,删除六个月前的日志数据 + */ +@Slf4j +@Component +public class LogDataCleanSchedule extends BaseSchedule { + + @Autowired + private LogDataService logDataService; + + /** + * 每天凌晨2点执行日志清理任务 + * cron表达式: 秒 分 时 日 月 周 + */ + @Scheduled(cron = "0 0 2 * * ?") + public void cleanOldLogData() { + String taskName = "日志数据清理任务"; + String cacheKey = "log_data_clean_task"; + + execute(taskName, 3600, cacheKey, () -> { + actionCatchException(() -> { + // 计算六个月前的时间 + LocalDateTime sixMonthsAgo = LocalDateTime.now().minusMonths(6); + + log.info("开始清理六个月前的日志数据,截止时间: {}", sixMonthsAgo); + + // 删除六个月前的日志数据 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.lt(LogData::getTimestamp, sixMonthsAgo); + + Long deletedCount = logDataService.count(queryWrapper); + boolean result = logDataService.remove(queryWrapper); + + if (result) { + log.info("日志数据清理完成,共删除 {} 条记录", deletedCount); + } else { + log.warn("日志数据清理失败"); + } + }); + }); + } +}