一、类结构解析
@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或本地缓存。
四、关键参数与设计
- 定时任务参数:
fixedDelay
:适合需要等待前一次任务完成的场景cron
:精确控制执行时间点(如凌晨低峰期执行大数据量操作)
- 时间计算工具:
DateUtil.beginOfMinute()
/beginOfDay()
/beginOfHour()
:Hutool提供的精确时间截断方法DateUtil.offsetMinute()
/offsetDay()
/offsetHour()
:简化时间偏移计算
- 异常处理:
- 通过
try-catch
捕获并记录异常,避免任务因单次失败终止
- 通过