さまざまなワークフロー エンジンの中でも、Camunda フレームワークはより強力で柔軟なプロセス制御を備えています。
ビジネスニーズに応じてプロセスノードがノード間を自由にジャンプしたいというニーズに応えて、Camunda はコードによるノードジャンプの自由な制御をサポートし、コーディングメソッドを提供します。複数のインスタンスの処理には特別な注意が必要ないくつかの違いがあります。
1. 単一インスタンス ノード、またはセット構成に基づいていないマルチインスタンス ノード。
2. マルチインスタンスuserTask
ノードは、設定<multiInstanceLoopCharacteristics ...>
を通じてcollection
変数参照を提供します。elementVariable
userTask
assignee
ポイント 1 のジャンプ ノードのメイン コード スニペットは次のとおりです。
ProcessInstance processInstance = ...;
runtimeService.createProcessInstanceModification(processInstance.getId())
.cancelAllForActivity("Activity_8dsxc8ds") // 取消当前节点所有活动中的Task任务
.startBeforeActivity("Activity_0qsw8c1") // 目标节点Id,在流程图中看,固定值(一般起一个正规的名字)
.setVariable("带入所需变量key", "变量值Object类型")
.setAnnotation("跳转到目标节点") // 为当前实例的修改添加注释,虽然没有实际业务作用,但是推荐使用
.execute();
マルチインスタンス アクティビティがコレクションに基づいて構成されている場合、startBeforeActivity
ディレクティブの実行時にコレクションは考慮されず、追加のインスタンスに対してコレクション要素変数が設定されません。この場合、次の処理メソッドを使用する必要があります。
ポイント 2: コレクションに基づいてマルチインスタンス ジャンプ ノードにジャンプする場合、ノード ID の後に特定の文字列を追加する必要があります#multiInstanceBody
。例は次のとおりです。
ProcessInstance processInstance = ...;
runtimeService.createProcessInstanceModification(processInstance.getId())
.cancelAllForActivity("Activity_8dsxc8ds")
.startBeforeActivity("Activity_0qsw8c1#multiInstanceBody") // 目标节点是多实例节点,节点Id后面必须增加后缀 #multiInstanceBody
.setVariable("带入所需变量key", "变量值Object类型")
.setAnnotation("跳转到目标节点") // 为当前实例的修改添加注释,虽然没有实际业务作用,但是推荐使用
.execute();
注: 対象ノードがマルチインスタンス ノードの場合、ノード ID の後にフレームワークで合意された文字列が付加されていないと、
#multiInstanceBody
マルチインスタンス ノードの構成をトリガーする<multiInstanceLoopCharacteristics .... >
コレクション変数処理が自動的に実行されません。
ノードがマルチインスタンス ノードであるかどうかを判断する方法については、私が作成した次の判断方法を参照してください。
/**
* 判断一个节点是否为多实例节点
*
* @param execution 监听器 DelegateExecution 对象
* @param activityId 节点Id
* @return 是否多实例节点
*/
public boolean isMultiInstanceActivity(DelegateExecution execution, String activityId){
Activity activity = execution.getBpmnModelInstance().getModelElementById(activityId);
return activity.getLoopCharacteristics() != null;
}
/**
* 判断一个节点是否为多实例节点(不推荐的方法,保留代码仅为参考)
*
* @param repositoryService 可以注入Camunda对象直接使用
* @param processDefinitionId 流程定义Id
* @param activityId 节点Id
* @return 是否多实例节点
*/
@Deprecated
public boolean isMultiInstanceActivity(RepositoryService repositoryService, String processDefinitionId, String activityId){
boolean isMultiInstanceActivity = false;
BpmnModelInstance bpmnModelInstance = repositoryService.getBpmnModelInstance(processDefinitionId);
Optional<Process> processOptional =
bpmnModelInstance.getModelElementsByType(Process.class)
.stream().filter(p -> p.getId().equals(processDefinitionId) || processDefinitionId.startsWith(p.getId().concat(":")))
.findFirst();
if(processOptional.isPresent()){
Process process = processOptional.get();
Optional<FlowElement> activityOptional = process.getFlowElements()
.stream().filter(flowElement -> flowElement.getId().equals(activityId)).findFirst();
if(activityOptional.isPresent()){
isMultiInstanceActivity =
CollectionUtils.isNotEmpty(activityOptional.get().getChildElementsByType(MultiInstanceLoopCharacteristics.class));
}
}
return isMultiInstanceActivity;
}
公式リファレンスドキュメント: https://docs.camunda.org/manual/7.19/user-guide/process-engine/process-instance-modification/#modify-multi-instance-activity-instances
(終わり)