挂起和激活流程实例

简介: 挂起和激活流程实例

挂起就是流程虽然已经发起了,但是无法进行下面的审批

激活就是流程被激活了,才能继续往下进行,和挂起是反义词

1代表激活 2代表挂起

网络异常,图片无法展示
|

代码实现流程定义的挂起和激活

上面已经介绍了挂起和激活,下面我们就用代码实现

注意:挂起和激活往往是大部分情况下针对全部的实例,总不能同一个流程把你的挂起,他的不挂起,多个人的流程都要被挂起

其实就是修改状态 1代表激活 2代表挂起

全部流程实例的挂起和激活

也就是根据id去批量处理,修改多个数据的挂起状态,代码如下

// 全部流程实例的挂起和激活
@Test
public void suspendAllProcessInstance(){
    // 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 获取service RepositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    // 查询流程定义信息 获取流程定义查询对象
    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
            .processDefinitionKey("myEvection")
            .singleResult();
    // 获取当前流程定义的实例是否都是挂起的状态
    boolean suspended = processDefinition.isSuspended();
    // 获取流程定义的id
    String processDefinitionId = processDefinition.getId();
    // 如果是挂起状态,那么改为激活状态
    if(suspended){
        //如果挂起,执行激活操作,参数1:流程定义ID,参数2:流程是否激活,参数3:激活时间(暂时不传)
        repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);
        System.out.println("流程定义ID:"+processDefinitionId+"已激活");
    }else{
        // 如果是激活状态,那么改为挂起状态 参数1:流程定义ID,参数2:流程是否挂起,参数3:挂起时间(暂时不传)
        repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);
        System.out.println("流程定义ID:"+processDefinitionId+"已挂起");
    }
}

首先第一次执行,一开始是激活的,所以会执行挂起操作

网络异常,图片无法展示
|

数据库act_ru_task表的挂起状态为2,也就是挂起了

网络异常,图片无法展示
|

然后第二次执行,刚才已经被挂起了,所以会执行激活操作

网络异常,图片无法展示
|

再次观察数据库act_ru_task表的挂起状态为1,也就是激活了

网络异常,图片无法展示
|

单个流程实例的挂起和激活

这个业务就好比张三的出差流程需要被挂起,但是李四的不需要,这个时候就需要进行单个的处理了

这个时候就不能使用流程定义的id操作了,要用流程实例的id去操作,根据一个流程对应一个实例,单个流程共享一个流程定义的id

// 挂起或者挂起单个流程实例
@Test
public void suspendSingleProcessInstance(){
    // 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 获取service RuntimeService
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 通过RuntimeService获取流程实例对象
    ProcessInstance instance = runtimeService.createProcessInstanceQuery()
            .processInstanceId("17501")
            .singleResult();
    // 得到当前流程实例的状态 true=挂起 false=激活
    boolean suspended = instance.isSuspended();
    // 获取流程实例的id
    String instanceId= instance.getId();
    // 判断是否挂起,如果挂起就执行激活
    // 判断是否激活,如果挂起就执行挂起
    if(suspended){
        //如果挂起,执行激活操作
        runtimeService.activateProcessInstanceById(instanceId);
        System.out.println("流程定义ID:"+instanceId+"已激活");
    }else{
        // 如果是激活状态,那么改为挂起状态
        runtimeService.suspendProcessInstanceById(instanceId);
        System.out.println("流程定义ID:"+instanceId+"已挂起");
    }
}

开始执行  当前是激活的,所以会做挂起操作 当前数据库的挂起状态为1,也就是挂起

网络异常,图片无法展示
|

再次执行 因为是当前是挂起状态 所以执行激活操作 当前数据库的挂起状态为2,也就是激活

网络异常,图片无法展示
|

流程实例挂起后的流程执行测试

测试目前挂起的流程是否能够被审批,目前轮到zhangsan了

网络异常,图片无法展示
|

审批代码如下

// 根据任务id完成个人任务
@Test
public void completTask() {
    // 1 获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 2 获取service
    TaskService taskService = processEngine.getTaskService();
    // 3 获取zhangsan在myEvection中对应的任务 我们已知只有一个任务 可使用singleResult获取一个结果集
    Task task = taskService.createTaskQuery()
            .processInstanceId("17501") // 流程的key
            .taskAssignee("zhangsan")   // 要查询的负责人
            .singleResult();// 因为可能有多个待办  所以是一个集合
    System.out.println("流程实例ID:"+task.getProcessInstanceId());
    System.out.println("任务ID:"+task.getId());
    System.out.println("任务负责人:"+task.getAssignee());
    System.out.println("任务名称:"+task.getName());
    // 4 根据任务的id完成任务
    taskService.complete(task.getId());
}

执行代码测试报错 提示,不能完成被挂起的任务,很明显被挂起的任务是不能被执行的

网络异常,图片无法展示
|

然后我们执行方法,让这个流程实例变成激活状态

网络异常,图片无法展示
|

再次执行审批代码 没有问题执行成功了

网络异常,图片无法展示
|

数据库里面下一个审批人和挂起状态都改变了

网络异常,图片无法展示
|

相关文章
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
2769 0
你的应用进入了中断状态,但无任何代码显示,因为所有线程之前都在执行外部代码
|
4月前
|
Windows
Acunetix——本地计算机上的Acunetix服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止
Acunetix——本地计算机上的Acunetix服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止
196 0
|
6月前
|
Java
Flowable流程的挂起与激活详解
Flowable流程的挂起与激活详解
307 1
|
6月前
|
Java API 调度
线程的生命周期和状态控制
线程的生命周期和状态控制
|
6月前
Acitiviti7基本使用-3、流程实例挂起与激活
Acitiviti7基本使用-3、流程实例挂起与激活
Flowable 流程实例的挂起(暂停)与激活
Flowable 流程实例的挂起(暂停)与激活
Flowable 流程实例的挂起(暂停)与激活
|
虚拟化 Windows
禁用vmware虚拟机自动挂起功能
禁用vmware虚拟机自动挂起功能
1182 0
|
Java 程序员 调度
线程的创建方式,状态周期管理
进程是计算机中的程序,关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
122 0
线程的创建方式,状态周期管理
|
消息中间件 缓存 监控
Java线程生命周期与状态切换
最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。
151 0
Java线程生命周期与状态切换

热门文章

最新文章