栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记一次性能调优:SpringBoot+Activiti

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记一次性能调优:SpringBoot+Activiti

【问题描述】

工单详情页面显示流程概况缓慢,10s左右,流程链越长越慢;

【问题定位】

  1. 通过浏览器开发者工具,定位响应慢的请求:/wo/list/hisComment/list
  2. 后台采用的SpringBoot,直接在Controller中查询`/wo/list`
    定位到wo/controller/WoListController.java的方法list()

  3. 通过控制台输出来确定导致缓慢的代码位置:
  4. 深入方法实现的地方:
    wo/service/WoProcessEngineImpl.java
    通过控制台输出来确定导致缓慢的代码位置:
  5. 深入方法实现的地方:
    workflow/utils/ProcessKit.java
    通过控制台输出来确定最终导致缓慢的代码位置:

【问题分析】

  1. 该方法遍历每个驳回节点的上级节点是否完成,来确定是否能驳回该节点;
  2. 通过控制台输出看到每个驳回节点会查询出2万多条记录,而相关表的记录总量已经达到百万;每次查询耗时1-3s,所以节点越多速度越慢;
  3. 再复杂的流程,它的的相关节点也不可能这么多,肯定查询条件不对;
  4. 最终确定问题代码:
     long historicActivityInstances = historyService
        .createHistoricActivityInstanceQuery()
        .processDefinitionId(processDefId)
        .activityId(canBackNodes.get(i).getNodeId())
        .finished()
        .count();

【问题解决】

  1. 查询一个流程的相关节点,最主要的一个条件就是流程实例的ID,查询修改为:
    long historicActivityInstances = historyService
        .createHistoricActivityInstanceQuery()
        .processInstanceId(getProcessInstanceId)//增加流程实例ID
        .processDefinitionId(processDefId)
        .activityId(canBackNodes.get(i).getNodeId())
        .finished()
        .count();
  2. 需要注意的地方:
    利用多态特性,复制原方法,增加了一个参数getProcessInstanceId,不要修改原来方法,以免影响项目中其他功能;
  3. 同时发现调用/wo/list/hisComment/list的页面有17处,大段代码重复,重构了组件,方便页面需要时直接应用,也便于维护;
  4. 当然,要想解决问题,你得知道activiti的基本概念;
  5. 最终响应时间达到毫秒级别;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351072.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号