任务回退

suaxi
2024-08-15 / 0 评论 / 83 阅读 / 正在检测是否收录...

1. 串行的回退

流程图

1.1串行的回退.png

测试

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author Suaxi
 * @Date 2024/8/13 21:27
 * @Description
 */
@SpringBootTest
public class FlowRollbackTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("任务回退-串行的回退")
                .addClasspathResource("flow/35.任务回退-串行的回退.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startFlow() {
        String processId = "Process_15y1ksp:1:f147328e-5977-11ef-8eb4-10ffe00abd05";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void taskRollback() {
        String processInstanceId = "076d6028-597c-11ef-98e6-10ffe00abd05";
        runtimeService.createProcessInstanceModification(processInstanceId)
                //.startBeforeActivity("Activity_0l16yzx") //跳转到指定结点之前
                .startAfterActivity("Activity_0l16yzx") //跳转到指定结点之后
                .cancelAllForActivity("Activity_0azdt7x") //取消某个指定节点
                .execute();
    }
}



此处以人事审批节点回退至项目经理审批节点为例,执行回退方法后,历史任务表数据如下

1.2串行的回退.png


1.3串行的回退.png

补充:

类别方法
在活动前启动回退到这个节点
startBeforeActivity(String activityId);
startBeforeActivity(String activityId, String ancestorActivityInstanceId);
在活动后启动通过 startAfterActivity() 方法,跳转到指定节点之后的节点
startAfterActivity(String activityId);
startAfterActivity(String activityId, String ancestorActivityInstanceId);
启动一个过渡通过 startTransition() 方法,在一个指定的序列流上开始执行,当有多个流出的序列流时,此时可以与 startAfterActivity() 方法一起使用
startTransition(String activityId);
startTransition(String activityId, String ancestorActivityInstanceId);
取消活动实例通过 cancelActivityInstance() 方法取消指定的活动实例
cancelActivityInstance(String activityInstanceId);
取消过渡实例过渡实例表示即将以异步延续的形式进入/离开一个活动的执行流,一个已经创建但尚未执行的异步延续Job被表示为一个过渡实例,可以通过 cancelTransitionInstance() 方法来操作
cancelTransitionInstance(String transitionInstanceId);
取消指定活动的所有活动实例通过 cancelAllForActivity() 方法操作
cancelAllForActivity(String activityId);


2. 并行的回退

流程图

2.1并行的回退.png

测试

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author Suaxi
 * @Date 2024/8/13 21:27
 * @Description
 */
@SpringBootTest
public class FlowRollbackTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("任务回退-并行的回退")
                .addClasspathResource("flow/36.任务回退-并行的回退.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startFlow() {
        String processId = "Process_08oudkn:1:61e0cbaf-5a45-11ef-a08c-10ffe00abd05";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void taskRollback() {
        //例一:从技术总监审批、人事审批回退到组长审批
        //String processInstanceId = "765f3a01-5a45-11ef-b89b-10ffe00abd05";
        //runtimeService.createProcessInstanceModification(processInstanceId)
        //        .startAfterActivity("StartEvent_1")
        //        .cancelAllForActivity("Activity_04lzlma")
        //        .cancelAllForActivity("Activity_1cy7zrd")
        //        .execute();

        //例二:从总经理审批回退到技术总监审批、人事审批
        String processInstanceId = "f3d6dd13-5a46-11ef-9eef-10ffe00abd05";
        runtimeService.createProcessInstanceModification(processInstanceId)
                .startAfterActivity("Activity_1u47ggy")
                .startBeforeActivity("Activity_1cy7zrd")
                .cancelAllForActivity("Activity_1vpmtcx")
                .execute();
    }
}



例一历史流程实例表数据

2.2并行的回退.png

例二历史流程实例表数据

2.3并行的回退.png

3. 排他网关的回退

流程图

3.1排他网关的回退.png

测试

此处以项目经理审批回退到排他网关之前,并让流程重新走到人事审批为例

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author Suaxi
 * @Date 2024/8/13 21:27
 * @Description
 */
@SpringBootTest
public class FlowRollbackTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("任务回退-排他网关的回退")
                .addClasspathResource("flow/37.任务回退-排他网关的回退.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startFlow() {
        String processId = "Process_1we1amp:1:3b817685-5a48-11ef-b838-10ffe00abd05";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void taskRollback() {
        String processInstanceId = "4b4fc9b1-5a48-11ef-90d7-10ffe00abd05";
        runtimeService.createProcessInstanceModification(processInstanceId)
                .startBeforeActivity("Gateway_0v6gm4b")
                .setVariable("day", 5)
                .cancelAllForActivity("Activity_13amaw8")
                .execute();
    }
}



历史流程实例表数据

3.2排他网关的回退.png

4. 子流程的回退

流程图

4.1子流程的回退.png

测试

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author Suaxi
 * @Date 2024/8/13 21:27
 * @Description
 */
@SpringBootTest
public class FlowRollbackTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("任务回退-子流程的回退")
                .addClasspathResource("flow/38.任务回退-子流程的回退.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startFlow() {
        String processId = "Process_0unlfrp:1:ff5ff077-5b0b-11ef-9419-10ffe00abd05";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void taskRollback() {
        //例一:子任务-项目经理审批回退至组长审批
        //String processInstanceId = "31f21b1b-5b0c-11ef-990e-10ffe00abd05";
        //runtimeService.createProcessInstanceModification(processInstanceId)
        //       .startBeforeActivity("Activity_0jscehr")
        //        .cancelAllForActivity("Activity_0uodo09")
        //        .execute();

        //例二:人事审批回退至子任务-项目经理审批
        String processInstanceId = "31f21b1b-5b0c-11ef-990e-10ffe00abd05";
        runtimeService.createProcessInstanceModification(processInstanceId)
                .startBeforeActivity("Activity_093vft3")
                .cancelAllForActivity("Activity_1bf56np")
                .execute();
    }
}


5. 重启/恢复实例

流程实例终止后,其历史数据仍然存在,并且可以访问,且可以重启该历史流程实例(前提是历史级别设置为 FULL)。例:

  • 当执行中的流程实例没有以期望的方式结束时,此时可以使用重启流程实例的方法
  • 恢复被错误地取消的流程实例到最后的状态
  • 由于错误路由导致流程实例被终止后重启

重启流程实例API runtimeService.restartProcessInstances()

流程图

5.1任务回退-重启、恢复流程实例.png

测试

package com.sw.camundademo;

import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.RuntimeService;
import org.camunda.bpm.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author Suaxi
 * @Date 2024/8/13 21:27
 * @Description
 */
@SpringBootTest
public class FlowRollbackTest {

    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("任务回退-重启、恢复流程实例")
                .addClasspathResource("flow/39.任务回退-重启、恢复流程实例.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startFlow() {
        String processId = "Process_0f17ijs:1:30fc859e-5b0e-11ef-97d6-10ffe00abd05";
        runtimeService.startProcessInstanceById(processId);
    }

    @Test
    public void deleteProcessInstance() {
        //流程启动后,执行到组长审批、项目经理审批时,删除该流程实例,模拟流程执行过程中的异常中断
        String processInstanceId = "400eb4ef-5b0e-11ef-8abb-10ffe00abd05";
        runtimeService.deleteProcessInstance(processInstanceId, "deleted");
    }

    @Test
    public void recoveryProcessInstance() {
        //恢复流程实例至组长审批、项目经理审批
        String processDefinitionId = "Process_0f17ijs:1:30fc859e-5b0e-11ef-97d6-10ffe00abd05";
        runtimeService.restartProcessInstances(processDefinitionId)
                .startBeforeActivity("Activity_1590vkg")
                .startBeforeActivity("Activity_14mdtr0")
                .processInstanceIds("400eb4ef-5b0e-11ef-8abb-10ffe00abd05")
                .execute();
    }

}



注:恢复后的流程实例从用户角度来说中断前是什么样,恢复后也是什么样;但从系统层面来说,恢复后的流程实例是一个全新的数据(流程实例id已经不同)

此处可以参考历史流程实例表数据

5.2任务回退-重启、恢复流程实例.png

0

评论 (0)

取消