在多实例(会签或者并行网关)时如果使用以下代码来进行驳回时,使用
**List activeActivityIds = runtimeService.getActiveActivityIds(instanceId);**来获取当前活动的节点会出现获取不到情况。
runtimeService.createProcessInstanceModification(instanceId)
.cancelActivityInstance(instanceId)
.startBeforeActivity(taskDefinitionKey)
.execute();
原因可能如下:
当任务进行到并行节点时,会产生一个主执行实例与多个子执行实例,主执行实例的is_active字段一直都是0。当子执行实例全部完成,主执行实例is_active字段就会变成1。
当子执行实例全部完成(使用complete()正常完成),主执行实例is_active字段就会变成1。
但是如果使用这几个api时,当子执行实例全部结束(节点是被取消的),主执行实例is_active字段还是0,没变成1。
然后runtimeService.getActiveActivityIds查询的就是根据act_ru_execution表的is_active字段的值。因此无法获取到值。
//.cancelActivityInstance(instanceId)
//这里传入的参数准确来说应该是act_ru_execution当中的act_ins_id字段
//可以通过runtimeService.getActivityInstance()来获取所有的ActivityInstance;然后调用ActivityInstance.getid()作为参数传入
//在多实例的情况下ActivityInstance为树结构。这里传入instanceId会直接删除主流程和子流程的所有执行实例。
this.runtimeService.createProcessInstanceModification(instanceId)
.cancelActivityInstance(instanceId)
.startBeforeActivity(taskDefinitionKey)
.execute();
以下代码与本文无关,我只是做个记录。
//
// ActivityInstance tree = runtimeService.getActivityInstance(instanceId);
// if(tree.getChildActivityInstances()!=null){
// for (ActivityInstance childActivityInstance : tree.getChildActivityInstances()) {
// this.runtimeService.createProcessInstanceModification(instanceId)
// .cancelActivityInstance(childActivityInstance.getId())
// .execute();
// }
// } else {
// this.runtimeService.createProcessInstanceModification(instanceId)
// .cancelActivityInstance(tree.getId())
// .startBeforeActivity(taskDefinitionKey)
// .execute();
// }
//
可以试试这种方案
//获取act_hi_actinst表中endtime为null的节点
List<HistoricActivityInstance> historicActivityInstanceList = this.historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.unfinished()
.list();
List<String> activeActivityIds = historicActivityInstanceList.stream()
.map(HistoricActivityInstance::getActivityId).collect(Collectors.toList());
相关文章
作者神一般的配色。要选中文字来看。
camunda驳回到第一个任务节点示例