refactor(log):重构日志报表存储逻辑,使用saveOrUpdate替代原有save与update分离逻辑

- 报表mapper接口新增saveOrUpdate方法,替换原有的save与update分离操作- 日志报表存储逻辑优化,通过ON DUPLICATE KEY UPDATE实现插入或更新- 新增针对saveOrUpdate方法的单元测试用例- 调度中心报表初始化SQL优化,修复小概率情况下的增改竞争问题
- 完善调度组件日志记录,提高边界情况下的问题排查效率
3.3.0-release
xuxueli 1 month ago
parent cfcd293901
commit 760b21ef50

@ -2598,17 +2598,15 @@ public void execute() {
- 2、【优化】执行器任务Bean扫描逻辑优化完善懒加载Bean检测及过滤机制 - 2、【优化】执行器任务Bean扫描逻辑优化完善懒加载Bean检测及过滤机制
- 3、【优化】调度时间轮强化保障不重不漏调度时间轮单刻度数据去重避免极端情况下任务重复执行时间轮转动时校验临近刻度避免极端情况下遗漏刻度 - 3、【优化】调度时间轮强化保障不重不漏调度时间轮单刻度数据去重避免极端情况下任务重复执行时间轮转动时校验临近刻度避免极端情况下遗漏刻度
- 4、【优化】任务调度中心调度锁逻辑优化事务SQL下沉至Mapper层统一管理并增加测试用例提升代码可读性以及可维护性 - 4、【优化】任务调度中心调度锁逻辑优化事务SQL下沉至Mapper层统一管理并增加测试用例提升代码可读性以及可维护性
- 5、【优化】报表统计SQL优化修复小概率情况下查询null值问题 - 5、【优化】报表统计SQL优化修复小概率情况下查询null值问题报表初始化SQL优化修复小概率情况增改竞争问题
- 6、【重构】调度过期策略、调度类型策略逻辑重构代码组件化拆分并完善日志提升健壮性及可维护性 - 6、【优化】任务回调失败日志读写磁盘逻辑优化解决极端情况下大文件读写内存问题
- 7、【重构】任务调度中心底层组件重构组件初始化以及销毁逻辑统一处理任务触发及和回调逻辑优化避免资源泄漏风险 - 7、【重构】调度过期策略、调度类型策略逻辑重构代码组件化拆分并完善日志提升健壮性及可维护性
- 8、【重构】任务调度中心底层组件模块化拆分移除组件单例以及静态代码逻辑提升组件可维护性 - 8、【重构】任务调度中心底层组件重构组件初始化以及销毁逻辑统一处理任务触发及和回调逻辑优化避免资源泄漏风险
- 9、【修复】调度预读任务数量调整改为调度线程池大小x10降低事务颗粒度提升性能及稳定性 - 9、【重构】任务调度中心底层组件模块化拆分移除组件单例以及静态代码逻辑提升组件可维护性
- 10、【修复】合并PR-2369修复脚本任务参数取值问题 - 10、【修复】脚本任务process销毁逻辑优化解决风险情况下脚本进程无法终止问题
- 11、【优化】调度组件日志完善提升边界情况下问题定位效率 - 11、【修复】调度预读任务数量调整改为调度线程池大小x10降低事务颗粒度提升性能及稳定性
- 12、【升级】升级多项maven依赖至较新版本如 netty、groovy、spring、spring-ai、dify 等; - 12、【修复】合并PR-2369修复脚本任务参数取值问题
- 14、【优化】任务回调失败日志读写磁盘逻辑优化解决极端情况下大文件读写内存问题 - 13、【强化】通用HTTP任务httpJobHandler强化支持更丰富请求参数设置完整参数示例如下
- 15、【修复】脚本任务process销毁逻辑优化解决风险情况下脚本进程无法终止问题
- 16、【强化】通用HTTP任务httpJobHandler强化支持更丰富请求参数设置完整参数示例如下
``` ```
{ {
"url": "http://www.baidu.com", "url": "http://www.baidu.com",
@ -2628,10 +2626,12 @@ public void execute() {
"auth": "auth data" "auth": "auth data"
} }
``` ```
- 17、【ING】UI框架重构升级提升交互体验 - 14、【优化】调度组件日志完善提升边界情况下问题定位效率
- 18、【ING】调整资源加载逻辑移除不必要的拦截器逻辑提升页面加载效率 - 15、【升级】升级多项maven依赖至较新版本如 netty、groovy、spring、spring-ai、dify 等;
- 19、【ING】规范API交互协议通用响应结构体调整为Response - 16、【ING】规范API交互协议通用响应结构体调整为Response
- 20、【ING】Http通讯组件升级基于接口代理方式重构 - 17、【ING】Http通讯组件升级基于接口代理方式重构
- 18、【ING】UI框架重构升级提升交互体验
- 19、【ING】调整资源加载逻辑移除不必要的拦截器逻辑提升页面加载效率
### TODO LIST ### TODO LIST

@ -14,9 +14,11 @@ import java.util.List;
@Mapper @Mapper
public interface XxlJobLogReportMapper { public interface XxlJobLogReportMapper {
public int save(XxlJobLogReport xxlJobLogReport); /*public int save(XxlJobLogReport xxlJobLogReport);
public int update(XxlJobLogReport xxlJobLogReport); public int update(XxlJobLogReport xxlJobLogReport);*/
public int saveOrUpdate(XxlJobLogReport xxlJobLogReport);
public List<XxlJobLogReport> queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom, public List<XxlJobLogReport> queryLogReport(@Param("triggerDayFrom") Date triggerDayFrom,
@Param("triggerDayTo") Date triggerDayTo); @Param("triggerDayTo") Date triggerDayTo);

@ -79,11 +79,11 @@ public class JobLogReportHelper {
xxlJobLogReport.setFailCount(triggerDayCountFail); xxlJobLogReport.setFailCount(triggerDayCountFail);
} }
// do refresh // do refresh:
int ret = XxlJobAdminBootstrap.getInstance().getXxlJobLogReportMapper().update(xxlJobLogReport); XxlJobAdminBootstrap.getInstance().getXxlJobLogReportMapper().saveOrUpdate(xxlJobLogReport); // 0-fail; 1-save suc; 2-update suc;
if (ret < 1) { /*if (ret < 1) {
XxlJobAdminBootstrap.getInstance().getXxlJobLogReportMapper().save(xxlJobLogReport); XxlJobAdminBootstrap.getInstance().getXxlJobLogReportMapper().save(xxlJobLogReport);
} }*/
} }
} catch (Throwable e) { } catch (Throwable e) {

@ -19,7 +19,7 @@
t.fail_count t.fail_count
</sql> </sql>
<insert id="save" parameterType="com.xxl.job.admin.model.XxlJobLogReport" useGeneratedKeys="true" keyProperty="id" > <!--<insert id="save" parameterType="com.xxl.job.admin.model.XxlJobLogReport" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_log_report ( INSERT INTO xxl_job_log_report (
`trigger_day`, `trigger_day`,
`running_count`, `running_count`,
@ -31,9 +31,9 @@
#{sucCount}, #{sucCount},
#{failCount} #{failCount}
); );
<!--<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id"> &lt;!&ndash;<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID() SELECT LAST_INSERT_ID()
</selectKey>--> </selectKey>&ndash;&gt;
</insert> </insert>
<update id="update" > <update id="update" >
@ -42,7 +42,25 @@
`suc_count` = #{sucCount}, `suc_count` = #{sucCount},
`fail_count` = #{failCount} `fail_count` = #{failCount}
WHERE `trigger_day` = #{triggerDay} WHERE `trigger_day` = #{triggerDay}
</update> </update>-->
<insert id="saveOrUpdate" parameterType="com.xxl.job.admin.model.XxlJobLogReport" useGeneratedKeys="true" keyProperty="id" >
INSERT INTO xxl_job_log_report (
`trigger_day`,
`running_count`,
`suc_count`,
`fail_count`
) VALUES (
#{triggerDay},
#{runningCount},
#{sucCount},
#{failCount}
)
ON DUPLICATE KEY UPDATE
`running_count` = #{runningCount},
`suc_count` = #{sucCount},
`fail_count` = #{failCount}
</insert>
<select id="queryLogReport" resultMap="XxlJobLogReport"> <select id="queryLogReport" resultMap="XxlJobLogReport">
SELECT <include refid="Base_Column_List" /> SELECT <include refid="Base_Column_List" />

@ -0,0 +1,34 @@
package com.xxl.job.admin.mapper;
import com.xxl.job.admin.model.XxlJobLogReport;
import com.xxl.tool.core.DateTool;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class XxlJobLogReportMapperTest {
private static final Logger logger = LoggerFactory.getLogger(XxlJobLogMapperTest.class);
@Resource
private XxlJobLogReportMapper xxlJobLogReportMapper;
@Test
public void test(){
Date date = DateTool.parseDate("2025-10-01");
XxlJobLogReport xxlJobLogReport = new XxlJobLogReport();
xxlJobLogReport.setTriggerDay(date);
xxlJobLogReport.setRunningCount(444);
xxlJobLogReport.setSucCount(555);
xxlJobLogReport.setFailCount(666);
int ret = xxlJobLogReportMapper.saveOrUpdate(xxlJobLogReport);
logger.info("ret:{}", ret);
}
}
Loading…
Cancel
Save