通过@Scheduled注解实现文件的定时保存

一、类结构解析​

@Component
public class CloudCacheTask {
    // 类作用:通过定时任务从MongoDB中查询指定时间范围的Cloud数据,并缓存到DataCacheUtil
}
  • @Component​:声明为Spring管理的Bean,使定时任务生效

  • MongoTemplate​:Spring提供的MongoDB操作工具,用于构建查询条件
     

​二、定时任务配置​

1. ​​每分钟保存前5分钟数据​

fixedDelay

上一次执行完毕时间点之后多长时间再执行。如:

@Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行

@Scheduled(fixedDelay = 1000 * 60 * 1)
public void saveActData() {
    Date endTime = DateUtil.beginOfMinute(new Date()); // 当前分钟起始(如15:30:00)
    Date startTime = DateUtil.offsetMinute(endTime, -5); // 前5分钟(如15:25:00)
    saveCacheData(endTime, startTime);
}
  • fixedDelay​:任务结束后间隔1分钟(60秒)再次执行,确保任务串行不重叠
2. ​​每天2点保存前一天数据​

cron
该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。

cron表达式语法

[秒] [分] [小时] [日] [月] [周] [年]

注:[年]不是必须的域,可以省略[年],则一共6个

@Scheduled(cron = "0 0 2 * * ?")
public void saveDayData() {
    Date endTime = DateUtil.beginOfDay(new Date()); // 当天0点(如2025-05-04 00:00:00)
    Date startTime = DateUtil.offsetDay(endTime, -1); // 前一天0点(如2025-05-03 00:00:00)
    saveCacheData(endTime, startTime);
}
  • cron表达式​​:0 0 2 * * ? 表示每天凌晨2点执行
  • ​时间计算​​:通过beginOfDay获取当天0点,偏移-1天得到前一天范围
3. ​​每小时保存前一小时数据​
@Scheduled(cron = "0 10 0/1 * * ?")
public void saveHourData() {
    Date endTime = DateUtil.beginOfHour(new Date()); // 当前小时起始(如15:00:00)
    Date startTime = DateUtil.offsetHour(endTime, -1); // 前一小时(如14:00:00)
    saveCacheData(endTime, startTime);
}
  • cron表达式​​:0 10 0/1 * * ? 表示每小时的第10分钟执行(如01:10, 02:10)

  • ​时间计算​​:beginOfHour获取整点时间,偏移-1小时得到前一小时范围。

​三、数据查询与缓存逻辑​

private void saveCacheData(Date endTime, Date startTime) {
    // 构建MongoDB查询条件:dataTime在[startTime, endTime]范围内
    Query query = new Query(Criteria.where("dataTime").gte(startTime).lte(endTime));
    List<Cloud> finalClouds = mongoTemplate.find(query, Cloud.class);
    
    try {
        log.info("保存缓存数据!条数:{}", finalClouds.size());
        DataCacheUtil.saveCache(finalClouds); // 调用外部缓存工具类
        log.info("缓存数据成功!条数:{}", finalClouds.size());
    } catch (Exception e) {
        log.error("保存缓存数据失败!", e); // 异常处理及日志记录
    }
}
  • ​查询条件​​:使用Criteria.where("dataTime").gte().lte()构建时间范围查询,匹配MongoDB中的dataTime字段
  • mongoTemplate.find​:执行查询并返回Cloud实体列表。
  • ​缓存逻辑​​:DataCacheUtil.saveCache(外部工具类)实现数据持久化,可能是Redis或本地缓存。

​四、关键参数与设计​

  1. ​定时任务参数​​:
    • fixedDelay:适合需要等待前一次任务完成的场景
    • cron:精确控制执行时间点(如凌晨低峰期执行大数据量操作)
  2. ​时间计算工具​​:
    • DateUtil.beginOfMinute() / beginOfDay() / beginOfHour():Hutool提供的精确时间截断方法
    • DateUtil.offsetMinute() / offsetDay() / offsetHour():简化时间偏移计算
       
  3. ​异常处理​​:
    • 通过try-catch捕获并记录异常,避免任务因单次失败终止

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值