activiti 一个节点指定多个用户并发完成进入下一步

本文介绍了使用Activiti工作流引擎实现流程实例的创建、监听与管理。通过创建监听器类`Process2Listener`和`Process4Listener`,分别在任务创建和完成时进行日志输出。在测试类`MyTest2`中,展示了如何部署流程、启动流程实例、分配任务以及完成任务的过程。测试结果显示了流程的不同阶段和变量状态。

1.流程图

step2的相关配置

 

 

 

2.监听类

package com.knife.testActivity;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class Process2Listener implements TaskListener {

	@Override
	public void notify(DelegateTask paramDelegateTask) {
		// TODO Auto-generated method stub
		System.out.println("############task create ... "+paramDelegateTask.getAssignee());
	}

	

}
package com.knife.testActivity;

import java.util.Map;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class Process4Listener implements TaskListener {

	@Override
	public void notify(DelegateTask paramDelegateTask) {
		// TODO Au
### Activiti 工作流中并行回退解决方案 在处理 Activiti 工作流中的并行回退问题时,主要挑战在于如何正确清理所有分支任务以及确保主线流程能够正常继续执行。以下是针对该问题的具体分析和解决方案。 #### 1. 并行网关的工作机制 Activiti 的并行网关允许多个任务同时运行,在遇到回退需求时,如果仅清除当前分支的任务而未同步清理其他分支,则可能导致 `act_ru_task` 表中残留余任务记录[^2]。这不仅会影响后续逻辑判断,还可能引发异常行为。 #### 2. 清理所有相关任务 为了防止上述情况发生,需采取措施彻底移除涉及的所有子任务实例。具体方法如下: - **获取当前活动节点 ID 和目标回退节点 ID** 使用 API 查询当前任务对应的节点信息及其父级流程实例状态。 - **暂停主线程以锁定资源** 调用命令模式接口(CommandExecutor),通过自定义 Command 实现事务控制下的批量更新操作[^1]。 ```java // 自定义 Command 示例代码片段 public class CustomTaskCleaner implements Command<Void> { private final String processInstanceId; public CustomTaskCleaner(String processInstanceId) { this.processInstanceId = processInstanceId; } @Override public Void execute(CommandContext commandContext) { TaskEntityManager taskManager = commandContext.getTaskEntityManager(); List<TaskEntity> tasks = taskManager.findTasksByProcessInstanceId(processInstanceId); for (TaskEntity task : tasks) { if (!task.isSuspended()) { // 确保不会影响已挂起的状态 task.delete("Parallel rollback cleanup"); } } return null; } } ``` - **重新设置历史路径标记** 修改流程变量或存储额外元数据来指示已完成的阶段已被重置,从而避免重复触发相同环节。 #### 3. 完成当前节点并向指定位置跳转 利用 Service Task 或 Script Task 执行脚本逻辑完成必要的前置条件准备之后再调用以下函数实现跳跃动作: ```java runtimeService.createChangeActivityStateBuilder() .processInstanceId(processInstanceId) .moveActivityIdTo(activityInstanceId, targetActivityId) .changeState(); ``` 以上步骤综合考虑了线程环境下的并发安全性及持久化层交互细节,有效解决了因部分任务遗留所造成的功能性障碍。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值