PowerJob的CleanService清理服務(wù)流程
引言
本文主要研究一下PowerJob的CleanService

CleanService
@Slf4j
@Service
public class CleanService {
private final DFsService dFsService;
private final InstanceInfoRepository instanceInfoRepository;
private final WorkflowInstanceInfoRepository workflowInstanceInfoRepository;
private final WorkflowNodeInfoRepository workflowNodeInfoRepository;
private final LockService lockService;
private final int instanceInfoRetentionDay;
private final int localContainerRetentionDay;
private final int remoteContainerRetentionDay;
private static final int TEMPORARY_RETENTION_DAY = 3;
/**
* 每天凌晨3點(diǎn)定時(shí)清理
*/
private static final String CLEAN_TIME_EXPRESSION = "0 0 3 * * ?";
private static final String HISTORY_DELETE_LOCK = "history_delete_lock";
public CleanService(DFsService dFsService, InstanceInfoRepository instanceInfoRepository, WorkflowInstanceInfoRepository workflowInstanceInfoRepository,
WorkflowNodeInfoRepository workflowNodeInfoRepository, LockService lockService,
@Value("${oms.instanceinfo.retention}") int instanceInfoRetentionDay,
@Value("${oms.container.retention.local}") int localContainerRetentionDay,
@Value("${oms.container.retention.remote}") int remoteContainerRetentionDay) {
this.dFsService = dFsService;
this.instanceInfoRepository = instanceInfoRepository;
this.workflowInstanceInfoRepository = workflowInstanceInfoRepository;
this.workflowNodeInfoRepository = workflowNodeInfoRepository;
this.lockService = lockService;
this.instanceInfoRetentionDay = instanceInfoRetentionDay;
this.localContainerRetentionDay = localContainerRetentionDay;
this.remoteContainerRetentionDay = remoteContainerRetentionDay;
}
//......
}CleanService提供了timingClean、cleanLocal方法
timingClean
@Async(PJThreadPool.TIMING_POOL)
@Scheduled(cron = CLEAN_TIME_EXPRESSION)
public void timingClean() {
// 釋放本地緩存
WorkerClusterManagerService.cleanUp();
// 釋放磁盤(pán)空間
cleanLocal(OmsFileUtils.genLogDirPath(), instanceInfoRetentionDay);
cleanLocal(OmsFileUtils.genContainerJarPath(), localContainerRetentionDay);
cleanLocal(OmsFileUtils.genTemporaryPath(), TEMPORARY_RETENTION_DAY);
// 刪除數(shù)據(jù)庫(kù)歷史的數(shù)據(jù)
cleanByOneServer();
}timingClean先執(zhí)行WorkerClusterManagerService.cleanUp()釋放本地緩存,之后通過(guò)cleanLocal釋放本地磁盤(pán)空間,最后執(zhí)行cleanByOneServer刪除歷史數(shù)據(jù)
cleanLocal
@VisibleForTesting
public void cleanLocal(String path, int day) {
if (day < 0) {
log.info("[CleanService] won't clean up {} because of offset day <= 0.", path);
return;
}
Stopwatch stopwatch = Stopwatch.createStarted();
File dir = new File(path);
if (!dir.exists()) {
return;
}
File[] logFiles = dir.listFiles();
if (logFiles == null || logFiles.length == 0) {
return;
}
// 計(jì)算最大偏移量
long maxOffset = day * 24 * 60 * 60 * 1000L;
for (File f : logFiles) {
long offset = System.currentTimeMillis() - f.lastModified();
if (offset >= maxOffset) {
if (!f.delete()) {
log.warn("[CleanService] delete file({}) failed.", f.getName());
}else {
log.info("[CleanService] delete file({}) successfully.", f.getName());
}
}
}
log.info("[CleanService] clean {} successfully, using {}.", path, stopwatch.stop());
}cleanLocal會(huì)刪除指定目錄中l(wèi)astModified距離當(dāng)前時(shí)間大于等于1天的文件
cleanByOneServer
private void cleanByOneServer() {
// 只要第一個(gè)server搶到鎖其他server就會(huì)返回,所以鎖10分鐘應(yīng)該足夠了
boolean lock = lockService.tryLock(HISTORY_DELETE_LOCK, 10 * 60 * 1000L);
if (!lock) {
log.info("[CleanService] clean job is already running, just return.");
return;
}
try {
// 刪除數(shù)據(jù)庫(kù)運(yùn)行記錄
cleanInstanceLog();
cleanWorkflowInstanceLog();
// 刪除無(wú)用節(jié)點(diǎn)
cleanWorkflowNodeInfo();
// 刪除 GridFS 過(guò)期文件
cleanRemote(Constants.LOG_BUCKET, instanceInfoRetentionDay);
cleanRemote(Constants.CONTAINER_BUCKET, remoteContainerRetentionDay);
} finally {
lockService.unlock(HISTORY_DELETE_LOCK);
}
}cleanByOneServer先加鎖,然后執(zhí)行cleanInstanceLog、cleanWorkflowInstanceLog、cleanWorkflowNodeInfo等
小結(jié)
PowerJob的CleanService提供了timingClean、cleanLocal方法,其中timingClean先執(zhí)行WorkerClusterManagerService.cleanUp()釋放本地緩存,之后通過(guò)cleanLocal釋放本地磁盤(pán)空間,最后執(zhí)行cleanByOneServer刪除歷史數(shù)據(jù);cleanLocal會(huì)刪除指定目錄中l(wèi)astModified距離當(dāng)前時(shí)間大于等于1天的文件。
以上就是PowerJob的CleanService清理服務(wù)流程的詳細(xì)內(nèi)容,更多關(guān)于PowerJob CleanService流程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中常見(jiàn)隊(duì)列舉例詳解(非線(xiàn)程安全)
隊(duì)列用于模擬隊(duì)列這種數(shù)據(jù)結(jié)構(gòu),隊(duì)列通常是指先進(jìn)先出的容器,這篇文章主要介紹了Java中常見(jiàn)隊(duì)列(非線(xiàn)程安全)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-06-06
Java的super關(guān)鍵字與instanceof運(yùn)算符使用方法
這篇文章主要介紹了Java的super關(guān)鍵字與instanceof運(yùn)算符使用方法,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
詳解SpringBoot同時(shí)可以處理多少請(qǐng)求
在日常操作中,相信很多人在SpringBoot能同時(shí)處理多少請(qǐng)求問(wèn)題上存在疑惑,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-06-06
SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件
這篇文章主要介紹了SpringBoot如何基于POI-tl和word模板導(dǎo)出龐大的Word文件,poi-tl是一個(gè)基于Apache?POI的Word模板引擎,也是一個(gè)免費(fèi)開(kāi)源的Java類(lèi)庫(kù)2022-08-08
利用Spring Social輕松搞定微信授權(quán)登錄的方法示例
這篇文章主要介紹了利用Spring Social輕松搞定微信授權(quán)登錄的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
java 中sleep() 和 wait() 的對(duì)比
這篇文章主要介紹了java 中sleep() 和 wait() 的對(duì)比的相關(guān)資料,需要的朋友可以參考下2017-04-04

