记一次性能调优:SpringBoot+Activiti

【问题描述】

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

记一次性能调优:SpringBoot+Activiti_第1张图片

【问题定位】

  1. 通过浏览器开发者工具,定位响应慢的请求:/wo/list/hisComment/list
  2. 后台采用的SpringBoot,直接在Controller中查询`/wo/list`
    定位到wo/controller/WoListController.java的方法list()
    记一次性能调优:SpringBoot+Activiti_第2张图片
    记一次性能调优:SpringBoot+Activiti_第3张图片
  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. 最终响应时间达到毫秒级别;

记一次性能调优:SpringBoot+Activiti_第4张图片

你可能感兴趣的:(Java,SpringBoot,ProblemResolve,spring,boot,java,后端)