activity工作流一个SQL高消耗的问题
activity工作流一个SQL高消耗的问题
工作流中运行时任务节点表ACT_RU_TASK,如果在应用场景中,并没有使用子任务的情况,那么表中数据的parent_task_id_ 字段生成的数据均为空。在运行时,如果节点发生变动,activity的机制是删除元任务节点数据并生成新的任务节点数据。在删除时,会用task_id,去检索一次该任务是否存在子任务节点数据。
那么将会产生这个SQL执行:select * from ${prefix}ACT_RU_TASK where PARENT_TASK_ID_ = #{parameter}
由于parent_task_id_ 为空列,当该表数据较大时,该SQL将会耗时比较严重。
注:本人使用的activity版本是5.15.1,其他版本是否也有这个问题暂未研究
解决办法
- 使用拦截器拦截该SQL,未试;
- activiti通过扩展点重写节点行为,给parent_task_id_ 赋特定值,已试,可行;
- 重写TaskEntity类,给parent_task_id_ 赋特定值,已试,不建议。因为本地测试无问题但是打包到容器中执行时,由于容器加载jar,根据字母顺序加载jar包时,可能会activity-engine先加载,工程本身打出来的jar后加载,于是activity-engine的jar中的TaskEntity类先加载,导致重写的TaskEntity类无法加载,会导致无法实现赋值;
activiti通过扩展点重写节点行为遇到的问题
在按照https://blog.csdn.net/sadoshi/article/details/106913164 配置,实际上运行时,还是发生如图所示的错误:
java.lang.NullPointerException
at org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory.createCallActivityBehavior(DefaultActivityBehaviorFactory.java:304)
debug跟进去一看,expressionManager对象为空了
往上跟进的时候发现,这个expressionManager对象是ProcessEngineConfigurationImpl给其赋值的。当没有重写默认的事件工厂的时候,这个activityBehaviorFactory是为空的,所以会new 一个DefaultActivityBehaviorFactory,并且将ProcessEngineConfigurationImpl的expressionManager对象赋值给默认的事件工厂,后续调用DefaultActivityBehaviorFactory.createCallActivityBehavior就不会为空。但是我们重写了之后,这里就不再为空了,所以也就是ProcessEngineConfigurationImpl的expressionManager不会赋值给我们重写的工厂,所以才会报错null异常。
于是在重写的工厂里面,直接注入这个对象就好啦,问题就解决啦~~~~