网站前台右侧怎么做二维码,wordpress 主题文件夹,滁州做网站的公司,郑州大学现代远程教育 《网页设计与网站建设》个人主页在多种工作流引擎中#xff0c;Camunda框架对流程的处理控制更为强大、灵活。
在应对流程节点按业务需要进行自由跨节点跳转的需求时#xff0c;通过代码自由控制节点的跳转在Camunda中是支持的#xff0c;并且提供了编码方法#xff0c;其中多实例的处理上有一些区别要特…在多种工作流引擎中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类型).execute();如果多实例活动是基于集合配置的则执行 startBeforeActivity 指令时不会考虑集合并且不会为附加实例填充集合元素变量针对这种情况需要使用下面的处理方法。
第2点基于集合的多实例跳转节点的跳转时需要在节点Id后追加特定字符串 #multiInstanceBody示例如下
ProcessInstance processInstance ...;
runtimeService.createProcessInstanceModification(processInstance.getId()).cancelAllForActivity(Activity_8dsxc8ds).startBeforeActivity(Activity_0qsw8c1#multiInstanceBody) // 目标节点是多实例节点节点Id后面必须增加后缀 #multiInstanceBody.setVariable(带入所需变量key, 变量值Object类型).execute();注对于目标节点是多实例的节点如果不在节点Id后面追加框架约定的字符串 #multiInstanceBody则不能自动执行触发多实例节点配置的 multiInstanceLoopCharacteristics .... 中的集合变量处理。 对于如何判断一个节点是多实例节点可以参考使用下面我写好的一个判断方法 /*** 判断一个节点是否为多实例节点* * param repositoryService 可以注入Camunda对象直接使用* param processDefinitionId 流程定义Id* param activityId 节点Id* return 是否多实例节点*/public boolean isMultiInstanceActivity(RepositoryService repositoryService, String processDefinitionId, String activityId){boolean isMultiInstanceActivity false;BpmnModelInstance bpmnModelInstance repositoryService.getBpmnModelInstance(processDefinitionId);OptionalProcess processOptional bpmnModelInstance.getModelElementsByType(Process.class).stream().filter(p - p.getId().equals(processDefinitionId)).findFirst();if(processOptional.isPresent()){Process process processOptional.get();OptionalFlowElement activityOptional process.getFlowElements().stream().filter(flowElement - flowElement.getId().equals(activityId)).findFirst();if(activityOptional.isPresent()){isMultiInstanceActivity CollectionUtils.isEmpty(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 END