当前位置: 首页 > news >正文

聊聊PowerJob的CleanService

本文主要研究一下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点定时清理*/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();// 释放磁盘空间cleanLocal(OmsFileUtils.genLogDirPath(), instanceInfoRetentionDay);cleanLocal(OmsFileUtils.genContainerJarPath(), localContainerRetentionDay);cleanLocal(OmsFileUtils.genTemporaryPath(), TEMPORARY_RETENTION_DAY);// 删除数据库历史的数据cleanByOneServer();}

timingClean先执行WorkerClusterManagerService.cleanUp()释放本地缓存,之后通过cleanLocal释放本地磁盘空间,最后执行cleanByOneServer删除历史数据

cleanLocal

    @VisibleForTestingpublic 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;}// 计算最大偏移量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会删除指定目录中lastModified距离当前时间大于等于1天的文件

cleanByOneServer

    private void cleanByOneServer() {// 只要第一个server抢到锁其他server就会返回,所以锁10分钟应该足够了boolean lock = lockService.tryLock(HISTORY_DELETE_LOCK, 10 * 60 * 1000L);if (!lock) {log.info("[CleanService] clean job is already running, just return.");return;}try {// 删除数据库运行记录cleanInstanceLog();cleanWorkflowInstanceLog();// 删除无用节点cleanWorkflowNodeInfo();// 删除 GridFS 过期文件cleanRemote(Constants.LOG_BUCKET, instanceInfoRetentionDay);cleanRemote(Constants.CONTAINER_BUCKET, remoteContainerRetentionDay);} finally {lockService.unlock(HISTORY_DELETE_LOCK);}}

cleanByOneServer先加锁,然后执行cleanInstanceLog、cleanWorkflowInstanceLog、cleanWorkflowNodeInfo等

小结

PowerJob的CleanService提供了timingClean、cleanLocal方法,其中timingClean先执行WorkerClusterManagerService.cleanUp()释放本地缓存,之后通过cleanLocal释放本地磁盘空间,最后执行cleanByOneServer删除历史数据;cleanLocal会删除指定目录中lastModified距离当前时间大于等于1天的文件。

http://www.lryc.cn/news/298450.html

相关文章:

  • Qt QML学习(一):Qt Quick 与 QML 简介
  • Kylin系统下Qt的各种中文问题解决思路
  • C 练习实例69-约瑟夫环
  • 【Qt Design】界面介绍
  • Makefile编译原理 make 中的路径搜索_1
  • 蓝桥杯每日一题------背包问题(一)
  • 面试 JavaScript 框架八股文十问十答第八期
  • 【机器学习】单变量线性回归
  • 《计算思维导论》笔记:10.4 关系模型-关系运算
  • QT+OSG/osgEarth编译之八十四:osgdb_osg+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_osg)
  • 【Redis快速入门】初识Redis、Redis安装、图形化界面
  • Linux(Ubuntu) 环境搭建:Nginx
  • 快速手动完成 VS 编写脚本自动化:如何选取最高效的工作方式?
  • FAST角点检测算法
  • Python中使用opencv-python进行人脸检测
  • 牛客网 DP3跳台阶扩展问题
  • ARM汇编[1] 打印格式化字符串(printf
  • Java 集合、迭代器
  • 在 Docker 中启动 ROS2 里的 rivz2 和 rqt 出现错误的解决方法
  • 使用securecrt+xming通过x11访问ubuntu可视化程序
  • 红队打靶练习:HEALTHCARE: 1
  • Java IO:概念和分类总结
  • 【Linux】基本命令(下)
  • 腾讯云游戏联机服务器配置价格表,4核16G/8核32G/4核32G/16核64G
  • 面试经典150题——长度最小的子数组
  • 业务流程
  • ChatGPT Plus如何升级?信用卡付款失败怎么办?如何使用信用卡升级 ChatGPT Plus?
  • Spring 如何配置 bean (XML 方式)
  • 揭秘外观模式:简化复杂系统的关键设计策略
  • Nginx 命令(Ubuntu)