聊聊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天的文件。
相关文章:
聊聊PowerJob的CleanService
序 本文主要研究一下PowerJob的CleanService CleanService Slf4j Service public class CleanService {private final DFsService dFsService;private final InstanceInfoRepository instanceInfoRepository;private final WorkflowInstanceInfoRepository workflowInstance…...
Qt QML学习(一):Qt Quick 与 QML 简介
参考引用 QML和Qt Quick快速入门全面认识 Qt Widgets、QML、Qt Quick 1. Qt Widgets、QML、Qt Quick 区别 1.1 QML 和 Qt Quick 是什么关系? 1.1.1 从概念上区分 QML 是一种用户界面规范和标记语言,它允许开发人员创建高性能、流畅的动画和具有视觉吸引…...
Kylin系统下Qt的各种中文问题解决思路
一、编译生成的程序运行,中文乱码 这个比较简单。 Windows下基本就是编码格式设置。ini中文问题,见QSettings读取ini中文key方法。 其他Linux版本没玩过,不清楚。Kylin系统下基本就是缺中文的字库。找个好的中文字库,放到目录下即可,系统目录/usr/lib/fonts,qt的安装目…...
C 练习实例69-约瑟夫环
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 代码: #include <stdio.h> int main() {int n8;int table[n]…...
【Qt Design】界面介绍
文章目录 前言Widget Box(工具箱)对象查看器Qt Design属性编译器sizePolicy内容 信号/槽编辑器资源浏览器ui文件编辑完窗口后查看代码在Pycharm中添加QtDesign 前言 Widget Box(工具箱) 提供很多控件 对象查看器 对象查看区域…...
Makefile编译原理 make 中的路径搜索_1
一.make中的路径搜索 问题:在实际的工程项目中,所有的源文件和头文件都放在同一个文件夹中吗? 实验1 : VPATH 引子 mhrubuntu:~/work/makefile1/17$ ll total 28 drwxrwxr-x 4 mhr mhr 4096 Apr 22 00:46 ./ drwxrwxr-x 7 mhr m…...
蓝桥杯每日一题------背包问题(一)
点击可观看配套视频讲解 背包问题 阅读小提示:这篇文章稍微有点长,希望可以对背包问题进行系统详细的讲解,在看的过程中如果有任何疑问请在评论区里指出。因为篇幅过长也可以进行选择性阅读,读取自己想要的那一部分即可。 前言…...
面试 JavaScript 框架八股文十问十答第八期
面试 JavaScript 框架八股文十问十答第八期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)实现call、apply…...
【机器学习】单变量线性回归
文章目录 线性回归模型(linear regression model)损失/代价函数(cost function)——均方误差(mean squared error)梯度下降算法(gradient descent algorithm)参数(parame…...
《计算思维导论》笔记:10.4 关系模型-关系运算
《大学计算机—计算思维导论》(战德臣 哈尔滨工业大学) 《10.4 关系模型-关系运算》 一、引言 本章介绍数据库的基本数据模型:关系模型-关系运算。 二、什么是关系运算 在数据库理论中,关系运算(Relational Operatio…...
QT+OSG/osgEarth编译之八十四:osgdb_osg+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_osg)
文章目录 一、osgdb_osg介绍二、文件分析三、pro文件四、编译实践一、osgdb_osg介绍 osgDB是OpenSceneGraph(OSG)库中的一个模块,用于加载和保存3D场景数据。osgDB_osg是osgDB模块中的一个插件,它提供了对OSG格式的支持。 OSG格式是OpenSceneGraph库使用的一种二进制文件…...
【Redis快速入门】初识Redis、Redis安装、图形化界面
个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…...
Linux(Ubuntu) 环境搭建:Nginx
注:服务器默认以root用户登录 NGINX 官方网站地址:https://nginx.org/en/NGINX 官方安装文档地址:https://nginx.org/en/docs/install.html服务器的终端中输入以下指令: # 安装 Nginx apt-get install nginx # 查看版本信息 ngi…...
快速手动完成 VS 编写脚本自动化:如何选取最高效的工作方式?
那些不懂技术的朋友们可能会觉得,写代码写脚本不就是敲敲键盘嘛,搞那么高科技做什么,直接手工点点鼠标不就完事了。 这种看法很常见,但实际情况要复杂得多。 首先,手工操作虽然对于短期和小规模的任务来说似乎更快&am…...
FAST角点检测算法
FAST(Features from Accelerated Segment Test)角点检测算法是一种快速且高效的角点检测方法。它通过检测每个像素周围的连续像素集合,确定是否为角点。以下是 FAST 角点检测算法的基本流程: FAST 角点检测算法的基本过程主要包括…...
Python中使用opencv-python进行人脸检测
Python中使用opencv-python进行人脸检测 之前写过一篇VC中使用OpenCV进行人脸检测的博客。以数字图像处理中经常使用的lena图像为例,如下图所示: 使用OpenCV进行人脸检测十分简单,OpenCV官网给了一个Python人脸检测的示例程序,…...
牛客网 DP3跳台阶扩展问题
在原始跳台阶问题上,我们知道只走1,2阶台阶的话,可以推出来斐波那契数列的形式进行计算操作。但是,在这里就是1,2,3,...n阶台阶了。其实思路是一样的。 在原始台阶问题,我们的状态方…...
ARM汇编[1] 打印格式化字符串(printf
文章目录 写在前面关键知识简单加减乘除函数调用和循环系统调用栈的使用 GDB调试示例代码 写在前面 如果您对ARM汇编还一无所知的话请先参考ARM汇编hello world 本篇不会广泛详细的列举各种指令,仍然只讲解最关键的部分,然后使用他们来完成一个汇编程序…...
Java 集合、迭代器
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection 接口又有 3 种子类型,List、Set 和 Queu…...
在 Docker 中启动 ROS2 里的 rivz2 和 rqt 出现错误的解决方法
1. 出现错误: 运行 ros2 run rivz2 rivz2 ,报错如下 : No protocol specified qt.qpa.xcb: could not connect to display :1 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was f…...
OpenClaw+GLM-4.7-Flash:自动化内容创作全流程实战
OpenClawGLM-4.7-Flash:自动化内容创作全流程实战 1. 为什么需要自动化内容创作 作为一个经常需要产出技术文档的开发者,我发现自己总是陷入类似的困境:每次开始写作前,要花大量时间收集资料、整理思路、调整格式。最痛苦的是&a…...
深入解析DSP的多通道缓冲串口McBSP数据通路与控制通路
1. McBSP基础概念与核心功能 多通道缓冲串口(McBSP)是数字信号处理器(DSP)中用于高速串行通信的关键外设模块。我第一次接触这个模块是在开发音频处理系统时,当时为了搞定I2S音频数据传输,花了整整两周时间…...
自动化数据标注:OpenClaw+Qwen3.5-9B加速AI模型训练
自动化数据标注:OpenClawQwen3.5-9B加速AI模型训练 1. 数据标注的痛点与自动化机遇 作为一名长期奋战在机器学习一线的开发者,我深知数据标注环节的折磨。去年参与一个图像分类项目时,团队花费了整整三周时间手工标注5万张图片,…...
嵌入式硬件设计核心要点与实战技巧
嵌入式硬件设计关键要点解析1. 嵌入式系统硬件架构概述嵌入式系统的硬件架构以CPU为核心,所有外围设备都围绕CPU进行配置。这种架构最显著的特点是硬件可裁剪性,设计者可以根据具体应用需求灵活调整系统组成。在典型的嵌入式硬件设计中,需要重…...
STM32实战:IO-Link物理层编码配置避坑指南(附逻辑分析仪抓包技巧)
STM32实战:IO-Link物理层编码配置避坑指南(附逻辑分析仪抓包技巧) 在工业自动化领域,IO-Link作为点对点通信协议正快速普及。对于嵌入式开发者而言,使用STM32等通用MCU实现IO-Link主站/从站功能时,物理层编…...
S32K144新手避坑指南:用S32DS for RAM配置GPIO输入输出,别再搞错推挽使能了
S32K144 GPIO配置实战:从原理到避坑的完整指南 第一次接触NXP S32K144的开发者,往往会在GPIO配置这个看似简单的环节栽跟头。特别是当你在调试按键检测或传感器信号读取时,明明硬件连接正确,代码逻辑也没问题,可就是无…...
【从零开始学Java | 第二十二篇】List集合
目录 前言 一、List集合的三大特点 二、List集合的特有方法 1.add(int index, E element) 2.remove(int index) 3.set(int index, E element) 4.get(int index) 三、List集合的遍历方式 1.迭代器遍历 2.增强for遍历 3.Lambda表达式遍历 4.普通for循环遍历 5.列表迭…...
汽车ECU BootLoader开发:基于CAN总线与MPC57XX系列MCU
汽车ECU BootLoader开发基于CAN总线通信MPC57XX系列MCU bootloader开发 文档54页 在汽车电子领域,ECU(Electronic Control Unit)的重要性不言而喻,而BootLoader则是ECU中关键的一环。今天咱们就来聊聊基于CAN总线通信,…...
从协作机器人到手术刀:深入拆解阻抗/导纳控制在真实工业与医疗场景下的选型指南
从协作机器人到手术刀:深入拆解阻抗/导纳控制在真实工业与医疗场景下的选型指南 当UR10e协作机器人的机械臂以0.1毫米的重复定位精度在汽车底盘上完成螺栓锁付时,当达芬奇手术机器人的EndoWrist器械在跳动的心脏表面完成微米级血管缝合时,背后…...
FxSound驱动开发详解:从Version11到Version14的完整演进历程
FxSound驱动开发详解:从Version11到Version14的完整演进历程 【免费下载链接】fxsound-app FxSound application and DSP source code 项目地址: https://gitcode.com/gh_mirrors/fx/fxsound-app FxSound驱动开发是音频增强技术的核心,从Version1…...
