使用activiti6.0工作流,驳回到某个节点。
当前思想:获得流程图,找到当前节点和想要驳回到节点,清理掉线,加上新的线,执行完成操作,然后还原线,图也就还原了。相当于临时修改了一下图,执行了complete操作。
问题:高并发下,其他实例提交,驳回操作取到这个还没还原的图了怎么办?加锁又太耗费资源了。。。有没有什么方法是只取到当前实例的这张图,而不是公用的图?
代码如下:跟图中一样
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult(); String currActivityId = task.getTaskDefinitionKey(); String processDefinitionId = task.getProcessDefinitionId(); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);//获得流程图 //获得当前待办节点信息 FlowNode currFlow = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currActivityId); //获得驳回目标节点信息 FlowNode targetFlow = (FlowNode) bpmnModel.getFlowElement(pti.getTaskId()); //如果不是同一个流程(子流程)不能驳回 if (!(currFlow.getParentContainer().equals(targetFlow.getParentContainer()))) { logger.info("此处无法进行驳回操作,抛出异常"); } //记录原活动方向 List<SequenceFlow> oriSequenceFlows = new ArrayList<>(currFlow.getOutgoingFlows()); //清理活动方向 currFlow.getOutgoingFlows().clear(); //建立新的方向 List<SequenceFlow> newSequenceFlows = new ArrayList<>(); SequenceFlow newSequenceFlow = new SequenceFlow(); String uuid = UUID.randomUUID().toString().replace("-", ""); newSequenceFlow.setId(uuid); newSequenceFlow.setSourceFlowElement(currFlow); //原节点 newSequenceFlow.setTargetFlowElement(targetFlow); //目标节点 newSequenceFlows.add(newSequenceFlow); currFlow.setOutgoingFlows(newSequenceFlows); //完成节点任务 //taskService.complete(task.getId(), map条件);动态每次完成的时候设置进去条件,不用一次性开始就设置 taskService.complete(task.getId());//驳回不需要条件 //恢复原方向 currFlow.setOutgoingFlows(oriSequenceFlows);