Alfresco Activiti - 创建同一个子流程的多个实例
Alfresco Activiti - Create multiple instances of the same subprocess
我有一个看似相当简单的流程要求,我开始质疑它是否可行。
下图是我目前的流程。我正在努力实现两件事:
用户创建了一个初始用户任务来添加一条笔记,他们应该能够添加任意数量的笔记,每个笔记一个用户任务
为用户创建的每个新笔记(用户任务)生成一个新的子流程。
以上过程存在以下问题:
应该为每个任务生成一个子流程,但它们似乎会相互覆盖
我不确定子流程是否需要为每个新的子流程生成一个唯一的 ID
作为每个任务的结果,您似乎只更新了一个变量(或一组变量)。这将覆盖以前的值。使用不同的变量,或者在每个变量之前附加一些东西来标记它对于完成的任务/子流程是唯一的。参见 collapsed sub-process
是的,每个子流程都有自己唯一的执行ID,但主执行ID或流程实例ID保持不变
原来这个问题的解决方案需要一些使用 groovy
的脚本。
下面是更新后的流程模型图,在其中我使用脚本任务启动了 Complete Task
流程的新实例,然后如果用户希望添加更多任务,独占网关可以 return用户向Create task(用户任务)OR完成进程。
在将范围传回用户任务之前,我清除了脚本任务中用户任务中保留的字段中的所有值。
下图显示了我的 Complete Task 进程,主进程使用脚本调用该进程
在这里,我避免使用 parallel gateways
,而是优先创建 Create Task(用户任务)的新实例和 的新实例通过脚本完成任务 流程(不是子流程)。
要启动完成任务进程的新实例,我们必须在进程的 runtimeService
实例下使用函数 startProcessInstanceByKeyAndTenantId()
启动进程,尽管我也可以使用 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
作为每个任务的结果,您似乎只更新了一个变量(或一组变量)。这将覆盖以前的值。使用不同的变量,或者在每个变量之前附加一些东西来标记它对于完成的任务/子流程是唯一的。参见 collapsed sub-process
是的,每个子流程都有自己唯一的执行ID,但主执行ID或流程实例ID保持不变
原来这个问题的解决方案需要一些使用 groovy
的脚本。
下面是更新后的流程模型图,在其中我使用脚本任务启动了 Complete Task
流程的新实例,然后如果用户希望添加更多任务,独占网关可以 return用户向Create task(用户任务)OR完成进程。
在将范围传回用户任务之前,我清除了脚本任务中用户任务中保留的字段中的所有值。
下图显示了我的 Complete Task 进程,主进程使用脚本调用该进程
在这里,我避免使用 parallel gateways
,而是优先创建 Create Task(用户任务)的新实例和 的新实例通过脚本完成任务 流程(不是子流程)。
要启动完成任务进程的新实例,我们必须在进程的 runtimeService
实例下使用函数 startProcessInstanceByKeyAndTenantId()
启动进程,尽管我也可以使用 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", "");
使用这种方法,我避免从父进程创建多个子进程,而是创建多个 运行 与父进程分开的进程。这对我有好处,就好像父进程完成了其他进程继续 运行。