package com.ruoyi.quartz.task;
|
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import com.ruoyi.system.service.IVehicleGpsService;
|
|
/**
|
* 清理车辆GPS历史数据任务
|
*/
|
@Component("cleanVehicleGpsTask")
|
public class CleanVehicleGpsTask {
|
private static final Logger log = LoggerFactory.getLogger(CleanVehicleGpsTask.class);
|
|
/** 每批删除数量 */
|
private static final int BATCH_SIZE = 10000;
|
/** 每批间隔时间(毫秒),避免连续删除对数据库压力过大 */
|
private static final long BATCH_INTERVAL_MS = 500;
|
|
@Autowired
|
private IVehicleGpsService vehicleGpsService;
|
|
/**
|
* 清理车辆GPS历史数据(保留最近2个月,分批删除)
|
*/
|
public void cleanVehicleGpsData() {
|
try {
|
log.info("开始清理车辆GPS历史数据(保留最近2个月,每批 {} 条)", BATCH_SIZE);
|
int totalCount = 0;
|
int batchCount;
|
int round = 0;
|
do {
|
batchCount = vehicleGpsService.deleteVehicleGpsBeforeDateBatch(BATCH_SIZE);
|
totalCount += batchCount;
|
round++;
|
log.info("第 {} 批清理完成,本批删除 {} 条,已删除合计 {} 条", round, batchCount, totalCount);
|
if (batchCount == BATCH_SIZE) {
|
// 还有数据,稍作休眠再继续
|
Thread.sleep(BATCH_INTERVAL_MS);
|
}
|
} while (batchCount == BATCH_SIZE);
|
|
log.info("清理车辆GPS历史数据完成,共 {} 批,删除 {} 条记录", round, totalCount);
|
|
if (totalCount > 0) {
|
log.info("开始执行 OPTIMIZE TABLE,回收磁盘空间(此操作耗时较长,请勿中断)");
|
vehicleGpsService.optimizeVehicleGpsTable();
|
log.info("OPTIMIZE TABLE 执行完成");
|
} else {
|
log.info("本次无可清理的记录,跳过 OPTIMIZE TABLE");
|
}
|
} catch (Exception e) {
|
log.error("清理车辆GPS历史数据异常", e);
|
}
|
}
|
}
|