activity非会签节点并行执行

本文深入解析了并行流程的工作机制,阐述了从候选人设置节点出发,如何同时触发并行一和并行二两个独立任务,以及在使用ExclusiveGateway条件下,流程如何仅流向满足条件的第一个节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先上图:

1.

"并行一"和“并行二”两个节点是由上一个节点流转,两个的流转条件是一致的,也就是说“候选人设置”节点审批完毕之后,“并行一”和”并行二“两个节点会产生两个并行任务,每个的流转互不影响。

如图,"并行二"的任务审批通过,到达“汇总”节点,接着审批该节点,到达流程结束点,此时只是这个并行节点流转完毕,整个流程并未完成,还生效"并行一"的任务还在流转,需要等待所有并行的流程都流转完毕,整个流程才会完毕。

2.默认情况下当"候选人设置"节点审批完毕后,因为 outgoing sequence flow 均没有流转条件,所以会同时执行到"并行一"和"并行二"节点,如下图。

3.若“候选人设置”节点与“并行一”和“并行二”以Exclusive Gateway节点关联,即使同时满足“并行一”和”并行二“两个节点也只能流转到其中一个节点,自动选择满足条件的第一个节点。

 

<think>好的,我现在需要解决用户在Activiti7与SpringBoot集成中实现动态增加会签人时遇到的问题。用户提到两个主要问题:1. 申请人节点设置的工艺主管会签人员导致流程直接结束;2. 使用addSignUser方法新增会签人后,任务创建成功但流程无法正确结束。需要修改addSignUser方法以确保流程正常结束。 首先,我需要回顾一下Activiti会签机制。会签(即多实例任务)通常分为并行(parallel)和串行(sequential)。用户的问题可能涉及多实例任务的配置是否正确。根据引用[2],当isSequential设置为false时,任务并行执行,这可能影响流程的结束条件。 用户提到的第一个问题,申请人节点设置的会签人员导致流程直接结束。可能的原因是在设置会签人员时,没有正确配置多实例属性,导致系统认为没有任务需要处理,从而直接结束流程。需要检查会签节点的XML配置,确保activiti:collection正确指向存储会签人列表的流程变量,比如signerList。同时,需要确认是否在任务监听器中正确设置了signerList,如引用[1]中的示例,通过TaskListener的notify方法设置userList到流程变量中。如果这里没有正确设置,可能导致会签人员列表为空,流程无法生成任务而结束。 第二个问题,使用addSignUser方法新增会签人后流程无法正确结束。这可能是因为动态添加用户后,没有更新多实例任务的相关变量,如nrOfInstances(总实例数)和nrOfActiveInstances(当前活动的实例数)。根据Activiti的文档,当动态添加会签用户时,需要手动增加nrOfInstances的值,否则流程引擎认为所有实例已经完成,即使新增的任务还未处理。例如,在addSignUser方法中,除了调用runtimeService.addUserIdentityLink外,还需要更新这些变量。例如: runtimeService.setVariable(task.getExecutionId(), "nrOfInstances", nrOfInstances + 1); 同时,可能需要调整完成条件,确保只有当所有实例完成时流程才继续。此外,检查会签节点的completionCondition是否正确设置,如${nrOfCompletedInstances/nrOfInstances >= 1}表示所有实例完成后继续。 另外,需要考虑会签节点的类型是否正确。并行会签需要确保所有任务完成后流程才能继续,而串行则按顺序处理。如果配置为并行,但新增用户后未正确调整实例数,可能导致流程提前结束。 还需要检查动态添加会签人的方法是否正确。用户可能使用了runtimeService.addUserIdentityLink来添加审批人,但这可能不会自动触发任务实例的增加。正确的方法可能需要修改会签任务的集合变量,并通知引擎重新计算实例数。例如,在添加用户后,更新signerList流程变量,并手动调整nrOfInstances和nrOfActiveInstances。 另外,参考引用[3],在SpringBoot中可能需要通过代理调用方法,如使用${taskExecutionServiceImpl.findProcessUsers('applicant')}来获取会签人员列表,确保在动态添加时使用正确的服务和方法。 总结可能的解决方案步骤: 1. 检查会签节点的XML配置,确保多实例属性正确,尤其是collection、elementVariable和completionCondition。 2. 在任务监听器中正确设置会签人员列表到流程变量,如signerList。 3. 在动态添加会签人时,不仅要添加用户身份链接,还要更新nrOfInstances和nrOfActiveInstances变量。 4. 确保完成条件正确,可能需要调整completionCondition表达式。 5. 在添加新会签人后,可能需要重新触发任务创建或流程变量更新,以通知引擎有新的实例需要处理。 现在需要将这些思考转化为结构化的回答,包括配置示例、代码修改建议以及可能的问题排查点。</think>### Activiti7与SpringBoot动态会签实现方案 #### 一、会签节点配置关键点 在BPMN文件中需配置多实例会签属性: ```xml <userTask id="signTask" name="会签任务" activiti:assignee="${signUser}"> <multiInstanceLoopCharacteristics activiti:isSequential="false" activiti:collection="signerList" activiti:elementVariable="signUser"> <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 1}</completionCondition> </multiInstanceLoopCharacteristics> </userTask> ``` *关键参数说明*: - `isSequential="false"` 表示并行会签[^2] - `collection="signerList"` 绑定流程变量中的审批人列表 - `completionCondition` 定义完成条件(此处为全部同意) #### 二、初始化会签人员配置 通过任务监听器注入初始审批人: ```java public class SignTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { List<String> signers = new ArrayList<>(); signers.add("主管A"); signers.add("主管B"); delegateTask.setVariable("signerList", signers); delegateTask.setVariable("nrOfInstances", signers.size()); // 必须显式设置实例数 } } ``` *注意事项*: - 必须同时设置`signerList`和`nrOfInstances`变量 - 建议在`create`事件触发时初始化[^1] #### 三、动态添加会签人方法改造 修正后的addSignUser方法实现: ```java public void addSignUser(String taskId, String newUser) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); // 添加用户身份关联 taskService.addUserIdentityLink(taskId, newUser, "approver"); // 更新会签实例参数 Integer instanceCount = (Integer) runtimeService.getVariable(task.getExecutionId(), "nrOfInstances"); runtimeService.setVariable(task.getExecutionId(), "nrOfInstances", instanceCount + 1); // 更新审批人列表 List<String> signers = (List<String>) runtimeService.getVariable(task.getExecutionId(), "signerList"); signers.add(newUser); runtimeService.setVariable(task.getExecutionId(), "signerList", signers); } ``` *关键修改点*: 1. 同步更新`nrOfInstances`计数器 2. 维护动态变化的`signerList`集合 3. 保持身份关联与流程变量同步更新 #### 四、流程无法结束问题排查 若出现新增会签人后流程无法结束,请检查: 1. **多实例参数同步**: ```bash # 通过API验证变量状态 GET /runtime/executions/{executionId}/variables ``` 确认`nrOfInstances`与`signerList.size()`一致 2. **完成条件表达式**: 推荐使用安全阈值表达式: ```xml <completionCondition> ${nrOfCompletedInstances >= 2 || (nrOfCompletedInstances/nrOfInstances) >= 0.8} </completionCondition> ``` 3. **历史数据处理**: 检查ACT_RU_IDENTITYLINK表是否记录新增审批人: ```sql SELECT * FROM ACT_RU_IDENTITYLINK WHERE TASK_ID_ = #{taskId} ``` #### 五、最佳实践建议 1. 使用监听器统一管理流程变量 2. 添加会签人后触发任务刷新: ```java taskService.trigger(taskId, variables); ``` 3. 对并行会签建议设置超时机制: ```xml <boundaryEvent id="timeoutEvent" cancelActivity="true"> <timerEventDefinition> <timeDuration>PT24H</timeDuration> </timerEventDefinition> </boundaryEvent> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值