news 2026/8/25 6:50:33

[063][调度模块]事件驱动的日志记录与高效查询体系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[063][调度模块]事件驱动的日志记录与高效查询体系

[063][调度模块]事件驱动的日志记录与高效查询体系

本文章代码: gitee , gitcode , github

1. 事件驱动架构:解耦调度与日志

任务状态变更时,ScheduleTaskManager发布ChangeStatusEventJobLogEventConsumer异步消费(需配置@Async)。

@Slf4j@Component@RequiredArgsConstructorpublicclassJobLogEventConsumerimplementsChangeStatusEventConsumer{privatefinalJobLogRepositoryjobLogRepository;privatefinalJobRepositoryjobRepository;@Override@Async// ✅ 异步执行,不阻塞主调度线程@Transactional(propagation=Propagation.REQUIRES_NEW)// ✅ 独立事务,不受业务回滚影响publicvoidconsumer(ChangeStatusEventevent){TaskRuntimeDataruntimeData=event.taskRuntimeData();jobRepository.findByTaskCode(runtimeData.taskCode()).ifPresentOrElse(task->{JobLogEntitylog=newJobLogEntity();log.setJob(task);log.setTaskStatus(runtimeData.taskStatus());log.setLotNo(runtimeData.lotNo());log.setTotalCount(runtimeData.totalCount());log.setTotalFailureCount(runtimeData.totalFailureCount());log.setStartTime(runtimeData.startTime());log.setEndTime(runtimeData.endTime());// 异常信息智能截取Throwablethrowable=runtimeData.throwable();if(throwable!=null){log.setHasError(YesNoEnum.Y);log.setMessage(StringUtils.substring(ExceptionUtils.getSelfStackTrace(throwable),0,500));}else{log.setHasError(YesNoEnum.N);log.setMessage(runtimeData.message());}jobLogRepository.save(log);},()->log.warn("任务不存在,无法记录日志,taskCode={}",runtimeData.taskCode()));}}

技术亮点:

  • 异步+独立事务:日志写入不影响调度性能,且即使主业务事务回滚,日志依然留存。
  • 异常堆栈裁剪:500 字符限制防止数据截断异常,同时保留关键堆栈信息。
  • 空值友好:使用ifPresentOrElse优雅处理任务不存在的情况。

2. 日志查询的规格模式组合

JobLogQuery支持多条件动态查询,包括关联表(JobEntity)字段。

publicclassJobLogSpecification{// 关联查询示例:通过 leftJoin 连接 JobEntitypublicstaticSpecification<JobLogEntity>taskCodeEqual(StringtaskCode){return(root,query,cb)->{Join<JobLogEntity,JobEntity>jobJoin=leftJoin(root,"job");returnJobSpecification.taskCodeEqual(jobJoin,taskCode,cb);};}// 时间范围查询publicstaticPredicatecreatedAtBetween(Path<JobLogEntity>path,Instantstart,Instantend,CriteriaBuildercb){Predicatepredicate=cb.conjunction();if(start!=null){predicate=cb.and(predicate,cb.greaterThanOrEqualTo(path.get("createdAt"),start));}if(end!=null){predicate=cb.and(predicate,cb.lessThanOrEqualTo(path.get("createdAt"),end));}returnpredicate;}}

技术亮点:

  • 类型安全:使用 JPA 元模型(Metamodel)或字符串常量,避免硬编码。
  • 可组合性:每个条件都是独立的Specification,可灵活组合复用。

3. VO 组装与关联数据补充

JobLogVO在转换时额外填充任务标识字段,避免前端额外请求。

@DatapublicclassJobLogVOextendsBaseVO{// 日志自身字段privateTaskStatusEnumtaskStatus;privateStringlotNo;privateInstantcreatedAt;// ... 其他日志字段// 关联任务冗余字段(非数据库字段,用于展示)privateStringtaskCode;privateStringclassSimpleName;publicstaticJobLogVOof(JobLogEntityentity){JobLogVOvo=newJobLogVO();BeanUtils.copyProperties(entity,vo);JobEntityjob=entity.getJob();if(job!=null){vo.setTaskCode(job.getTaskCode());vo.setClassSimpleName(job.getClassSimpleName());}returnvo;}}

设计权衡

  • 优点:一次查询返回完整信息,减少网络往返。
  • 注意:若JobEntity中关联数据较大(如metadata含大量 JSON),不建议全部复制,只取必要字段。

4. 日志分页查询接口

@RestController@RequestMapping("/api/job-log")@RequiredArgsConstructorpublicclassJobLogEndpoint{privatefinalJobLogServicejobLogService;@GetMapping("page")publicResponseEntity<PagedModel<JobLogVO>>findPage(JobLogQueryquery,Pageablepageable){Page<JobLogEntity>page=jobLogService.find(query,pageable);returnResponseEntity.ok(newPagedModel<>(page.map(JobLogVO::of)));}}

技术亮点

  • Spring Data 集成Pageable自动解析分页参数,PagedModel封装分页元数据。
  • VO 映射page.map(JobLogVO::of)流式转换,代码简洁。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 6:48:58

2026年智能离子棒将带来哪些惊喜?解密这款科技新宠的魅力

在科技飞速发展的2026年&#xff0c;智能离子棒作为改善生产问题的新宠&#xff0c;正崭露头角。而上海净源机电科技有限公司&#xff08;IONEAS&#xff09;的836/JX和600JL系列离子棒&#xff0c;更是凭借着卓越的技术优势和出色的应用能力&#xff0c;为众多行业带来了新的惊…

作者头像 李华
网站建设 2026/8/25 6:48:15

智慧楼宇安防一体化架构:从烟囱式部署到事件驱动联动引擎的演进

一、传统安防系统的痛点 传统智慧楼宇安防建设长期存在"烟囱式"部署问题。视频监控、门禁管理、入侵报警、消防联动等子系统各自独立运行&#xff0c;数据互不相通&#xff0c;告警难以关联&#xff0c;运维人员需要在多个平台间来回切换&#xff0c;效率低下。核心矛…

作者头像 李华
网站建设 2026/8/25 6:44:15

构建AI个人档案:从模型依赖到可迁移的工作流方法论

你有没有过这样的体验&#xff1a;花了好几天时间&#xff0c;终于让一个AI模型按照你的习惯和偏好&#xff0c;输出了满意的结果。你精心调整了提示词&#xff0c;保存了对话历史&#xff0c;甚至整理了一套专属的工作流程。然后&#xff0c;模型更新了&#xff0c;或者你换用…

作者头像 李华
网站建设 2026/8/25 6:42:18

多Agent系统工程化实战:从架构设计到部署运维

1. 项目概述&#xff1a;从概念到实践&#xff0c;多Agent系统的工程化之路最近两年&#xff0c;AI领域最让人兴奋的突破之一&#xff0c;无疑是智能体&#xff08;Agent&#xff09;从单打独斗走向了“团队协作”。你肯定也注意到了&#xff0c;无论是技术社区的热议&#xff…

作者头像 李华
网站建设 2026/8/25 6:41:27

2026年安全人才核心能力与简历优化指南

1. 安全行业的"科班"与"野路子"之争在安全行业里&#xff0c;学历背景和技术实力之间的争论从未停止。所谓"科班"&#xff0c;通常指那些拥有计算机科学、信息安全等相关专业学历的从业者&#xff1b;而"野路子"则是指通过自学、实战经…

作者头像 李华
网站建设 2026/8/25 6:39:50

技术经纪人如何快速生成科技成果推介书?

观点作者&#xff1a;科易网-国家科技成果转化&#xff08;厦门&#xff09;示范基地在当前科技成果转化加速推进、科技创新资源深度融合的背景下&#xff0c;技术经纪人作为连接科研机构与市场需求的重要桥梁&#xff0c;其专业能力和服务效率直接影响科技成果的转化路径与落地…

作者头像 李华