flowable 多实例动态添加人

本文介绍如何使用Flowable工作流引擎的API动态地为多实例任务添加人员。通过XML配置和Java代码示例,展示了如何设置并启动一个多实例并行用户任务,以及如何使用runtimeService.addMultiInstanceExecution方法动态添加任务执行者。

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

1.背景:

由于在日常情况下,我们的多实例要动态添加人员的场景,有没有这样的api呢?新的flowable有这样的功能。

2.具体实现
xml
<userTask id="miTasks" name="My Task ${loopCounter}" activiti:assignee="${assignee}">
      <multiInstanceLoopCharacteristics isSequential="false">
        <loopDataInputRef>assigneeList</loopDataInputRef>
        <inputDataItem name="assignee" />
        <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6 }</completionCondition>
      </multiInstanceLoopCharacteristics>
    </userTask>
3.具体实现
List<String> assigneeList = Arrays.asList("kermit", "gonzo", "mispiggy", "fozzie", "bubba");
String procId = runtimeService.startProcessInstanceByKey("miParallelUserTasksBasedOnCollection", CollectionUtil.singletonMap("assigneeList", assigneeList)).getId();
        
List<org.flowable.task.api.Task> tasks = taskService.createTaskQuery().orderByTaskAssignee().asc().list();
assertEquals(5, tasks.size());
assertEquals("bubba", tasks.get(0).getAssignee());
assertEquals("fozzie", tasks.get(1).getAssignee());
assertEquals("gonzo", tasks.get(2).getAssignee());
assertEquals("kermit", tasks.get(3).getAssignee());
assertEquals("mispiggy", tasks.get(4).getAssignee());
            
runtimeService.addMultiInstanceExecution("miTasks", procId, Collections.singletonMap("assignee", (Object) "johndoe"));
tasks = taskService.createTaskQuery().orderByTaskAssignee().asc().list();
assertEquals(6, tasks.size());
说明:

runtimeService.addMultiInstanceExecution(要加签的节点id,流程实例id, Collections.singletonMap(“单个对象的别名”, (Object) “对象值”));

### 如何在Flowable动态添加子任务 在Flowable框架中,可以通过编程方式动态地向已有的流程实例中添加子任务。这通常涉及使用`RuntimeService`、`TaskService`以及自定义的任务监听器来实现动态行为。以下是具体方法: #### 1. 使用 `RuntimeService` 和 `TaskService` 创建子任务 通过调用 Flowable 提供的服务 API 来手动创建子任务并将其关联到当前运行中的流程实例。 ```java @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; public void addSubTask(String processInstanceId, String parentTaskId, String subTaskName) { // 获取父任务对象 Task parentTask = taskService.createTaskQuery() .processInstanceId(processInstanceId) .taskId(parentTaskId) .singleResult(); if (parentTask != null) { // 创建新的子任务 Task newSubTask = taskService.newTask(); newSubTask.setName(subTaskName); newSubTask.setParentTaskId(parentTask.getId()); newSubTask.setProcessInstanceId(processInstanceId); // 设置其他属性(可选) Map<String, Object> variables = new HashMap<>(); variables.put("subTaskOwner", "John Doe"); taskService.complete(parentTask.getId(), variables); // 保存新子任务 taskService.saveTask(newSubTask); } } ``` 此代码片段展示了如何基于现有的父任务 ID 动态创建一个新的子任务,并将其绑定到指定的流程实例中[^3]。 --- #### 2. 利用多实例任务特性 如果需要更复杂的场景支持(如批量生成多个子任务),可以利用 Flowable 的 **多实例任务** 特性。这种方式允许在一个任务节点下自动扩展出多个子任务实例。 以下是一个简单的 BPMN 配置示例: ```xml <userTask id="multiInstanceTask" name="Multi Instance Sub Tasks"> <multiInstanceLoopCharacteristics isSequential="false" flowable:collection="${candidateUsers}" flowable:elementVariable="currentCandidate"/> </userTask> ``` 在此配置中: - 属性 `isSequential=false` 表明这些子任务将并发执行; - 变量 `${candidateUsers}` 是一个集合列表,用于决定要创建多少个子任务实例; - 每个子任务都可以访问变量 `currentCandidate`,表示当前分配给该子任务的具体候选[^4]。 对于 Java 后端逻辑部分,则需设置好对应的候选用户数据集: ```java // 假设我们有一个包含三个用户的列表作为输入参数 List<String> candidateUsers = Arrays.asList("Alice", "Bob", "Charlie"); runtimeService.startProcessInstanceByKey("dynamicProcessKey", Collections.singletonMap("candidateUsers", candidateUsers)); ``` --- #### 3. 结合动态流程定义功能 当业务需求更加灵活时,还可以借助 Flowable动态流程定义能力来自由调整整个流程结构。例如,在某些条件下临时插入额外的任务节点。 下面展示了一个 RESTful 接口样例,用来接收前端传来的 JSON 数据并将之转化为实际可用的新流程模型: ```java @RestController @RequestMapping("/flowable/dynamic-process") public class DynamicProcessController { @Resource private DynamicProcessDefinition dynamicProcessDefinition; @PostMapping("/create") public ResponseEntity<?> createDynamicProcess(@RequestBody ProcessEntity requestPayload) { try { // 调用服务层完成动态流程构建 String newlyCreatedModelId = dynamicProcessDefinition.createProcessDefinition(requestPayload).getData(); return ResponseEntity.ok(Map.of("modelId", newlyCreatedModelId)); } catch (Exception e) { log.error("Failed to generate dynamic process definition.", e); throw new RuntimeException(e.getMessage()); } } } ``` 这里的关键在于实现了接口 `/save` 方法的部分逻辑[^5]。 --- #### 总结 以上三种方案分别适用于不同层次的需求复杂度。简单情况下可以直接通过标准 API 添加单个子任务;而对于大规模批处理或者高度定制化的要求则推荐采用多实例模式甚至完全重构流程设计的方式加以应对。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值