对于我开始质疑的过程,我有一个似乎相当简单的要求,甚至是可能的。
下图显示了我当前的过程。我正在努力实现两件事:
用户创建一个初始用户任务来添加注释,他们应该能够添加任意数量的注释,每个注释一个用户任务
为用户创建的每个新笔记(用户任务)生成一个新的子流程。
上述过程存在以下问题:
应该为每个任务生成一个子流程,但是它们似乎相互覆盖
我不确定子进程是否需要为每个新子进程生成的唯一 ID
对于我开始质疑的过程,我有一个似乎相当简单的要求,甚至是可能的。
下图显示了我当前的过程。我正在努力实现两件事:
用户创建一个初始用户任务来添加注释,他们应该能够添加任意数量的注释,每个注释一个用户任务
为用户创建的每个新笔记(用户任务)生成一个新的子流程。
上述过程存在以下问题:
应该为每个任务生成一个子流程,但是它们似乎相互覆盖
我不确定子进程是否需要为每个新子进程生成的唯一 ID
所以事实证明,这个问题的解决方案需要一些使用groovy
.
下面是更新的流程模型图,其中我Complete Task
使用脚本任务启动流程的新实例,然后如果用户希望添加更多任务,专用网关可以将用户返回到创建任务(用户任务)或完成流程.
在将范围传递回用户任务之前,我清除了脚本任务中用户任务中保存的字段中的所有值。
下图显示了我的Complete Task进程,该进程由主进程使用脚本调用
在这里,我避免parallel gateways
优先使用通过脚本创建创建任务(用户任务)的新实例和完成任务流程(不是子流程)的新实例。
要启动 Complete Task 流程的新实例,我们必须使用流程实例startProcessInstanceByKeyAndTenantId()
下的函数来启动runtimeService
流程,尽管我也可以使用startProcessInstanceByIdAndTenantId()
:
//Import required libraries
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
//instantiate RunTimeService instance
RuntimeService runtimeService = execution.getEngineServices().getRuntimeService();
//get tenant id
String tenantId = execution.getTenantId();
//variables Map
Map<String, Object> variables = runtimeService.getVariablesLocal(execution.getProcessInstanceId());
//start process (processId, variables, tenantId)
ProcessInstance completeTask = runtimeService.startProcessInstanceByKeyAndTenantId("CompleteTask", variables, tenantId);
//Clear variables to create a fresh task
execution.setVariable("title", "");
execution.setVariable("details", "");
使用这种方法,我避免从父进程创建多个子进程,而是创建多个独立于父进程运行的进程。这让我受益匪浅,就好像父进程完成了其他进程继续运行一样。
作为每个任务的结果,您似乎只更新一个变量(或一组变量)。这将覆盖以前的值。使用不同的变量,或在每个变量之前附加一些内容,以将其标记为对于已完成的任务/子流程而言是唯一的。查看折叠的子流程
是的,每个子流程都有自己唯一的执行ID,但主执行ID或流程实例ID保持不变