记一次性能调优: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. 最终响应时间达到毫秒级别;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭记北宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值