挂起和激活流程实例

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

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

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

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());
}

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

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

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

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

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

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

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

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

相关文章
|
存储 XML 数据库
Flowable 完整表结构说明(一)
Flowable 完整表结构说明
2523 0
|
XML JSON Java
SpringMVC中HttpMessageConverter使用实践详解
SpringMVC中HttpMessageConverter使用实践详解
797 0
|
Java API 数据库
Spring Boot(16)——使用DataSource
使用DataSource 需要使用DataSource可以在pom.xml中添加spring-boot-starter-jdbc依赖,这会自动加入Spring Jdbc的依赖。还需要加入相应的JDBC驱动包的依赖,笔者这里使用的是MySQL的驱动。
9202 0
|
10月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
937 3
|
11月前
|
JSON 数据可视化 API
玩转数据科学:Python实战分析天气预报变动趋势
【10月更文挑战第1天】随着气候变化对日常生活的影响日益显著,理解和预测天气模式变得越来越重要。本文将引导您如何使用Python来抓取和分析天气预报数据,从而揭示天气变化的趋势。我们将介绍从获取公开气象API的数据到清洗、处理以及可视化整个过程的技术方法。
738 2
|
存储 关系型数据库 MySQL
【阿里规约】阿里开发手册解读——数据库和ORM篇
从命名规范、建表规范、查询规范、索引规范、操作规范等角度出发,详细阐述MySQL数据库使用过程中所需要遵循的各种规范。
【阿里规约】阿里开发手册解读——数据库和ORM篇
|
存储 移动开发 前端开发
ruoyi-nbcio-plus基于多租户的flowable设计考虑
ruoyi-nbcio-plus基于多租户的flowable设计考虑
426 1
|
前端开发 C# 图形学
unity按钮绑定与场景切换
unity按钮绑定与场景切换
225 0
|
前端开发 芯片 索引
技术好文共享:色彩之RGB和灰阶
技术好文共享:色彩之RGB和灰阶
921 0
|
消息中间件 Java RocketMQ
Spring Boot与RocketMQ的集成
Spring Boot与RocketMQ的集成