4

我们有一个工作流,它执行任务以在找不到数据时检查数据库中的记录,它会等待一分钟并执行任务。以下是我们工作流程的摘录。

<intermediateCatchEvent id="BHTimer" name="Wait 1 Minute">
  <incoming>BHNotActive</incoming>
  <outgoing>IsTickOpen</outgoing>
  <timerEventDefinition>
    <timeDuration xsi:type="tFormalExpression">PT1M</timeDuration>
  </timerEventDefinition>
</intermediateCatchEvent>

我们注意到,即使添加了 DB 记录,此任务也会无限循环。奇怪的是,执行任务的频率从 1 分钟变为 ~200 毫秒,导致 ACT_HI_ACTINST 表中累积了数百万条记录。下面是我们系统中许多此类流程之一的表格数据统计信息。

在几秒钟内,该事件已被执行数千次,并继续在数据库表“ACT_HI_ACTINST”和“ACT_RU_EXECUTION”下为同一作业创建数百万个进程条目。

运行下面的查询返回数百万条记录:
1. select * from ACT_HI_ACTINST where PROC_INST_ID_ = 'f33c539a-dfe2-11e8-9d30-0050569941b2'; 2. select * from ACT_RU_EXECUTION where PROC_INST_ID_ = 'f33c539a-dfe2-11e8-9d30-0050569941b2';

以下是我们遇到性能问题时 activiti 表的统计信息。

表名:记录数

ACT_RU_EXECUTION:3435162 ACT_RU_TASK:318122 ACT_RU_IDENTITYLINK:251334 ACT_RU_VARIABLE:265008


表名:记录数

ACT_HI_IDENTITYLINK:2526867 ACT_HI_PROCINST:54564894 ACT_HI_ACTINST:28169298 ACT_HI_TASKINST:4769590 ACT_HI_VARINST:8711507

其中一些进程成为孤立进程(发出关闭时进程尚未结束)。我们注意到的另一件事是此类进程的 act_ru_job 表中的异常消息 - “JobEntity [id=2786e249-dff6-11e8-a9c8-005056990bf2] 被另一个事务同时更新”来自异常消息列的消息。

我们有一个清除作业来删除与已完成进程相关的数据(在 act_hi_procinst 表中填充了 end_time_ 的进程,但这些进程不会被删除,因为它们永远不会无限循环结束)。

我们检查了我们的工作流程,但没有看到任何并行执行路径,因此我们不确定为什么会发生此错误。需要注意的一点是,这部署在 2 节点集群环境中,是否有可能两个节点都在同时执行进程。

我们的问题是:1、activiti如何让流程执行集群安全?是否有任何特定于集群的配置?2. 我们使用设计器生成的工作流程有缺陷?请查看随附的工作流程片段、图表和建议。图表图片:https ://i.stack.imgur.com/xMQWm.jpg 。如果有人需要完整的工作流 XML,我也可以附上。因字数限制而回避。

工作流是使用 BPMN Designer 生成的。Activiti 版本:5.17.0,数据库:Oracle,Web 服务器:Tomcat

这在我们的生产环境中造成了严重的性能问题,非常感谢任何帮助解决这个问题。

4

0 回答 0