(四)activiti7大服务service详解——2 RuntimeService

2023-11-17

 

前言

 

在 Activiti 中,每当一个流程定义被启动一次之后,都会生成一个相应的流程对象实例。Runtime Service 提供了启动流程、查询流程实例、设置获取流程实例变量等功能。此外它还提供了对流程部署,流程定义和流程实例的存取服务。

目录

目录

前言

一、RuntimeService 是什么?

二、使用步骤

1.产生方式

2.启动流程

2.1代码实现

2.2生成的表数据

3.流程的激活和挂起

4.流程实例的查询

5.流程对象的查询

6.流程实例的删除

7.流程实例的状态查询

总结


 

一、RuntimeService 是什么?

RuntimeService 提供了很多启动流程的API,并且全部的命名规则为startProcessInstanceByXX,比如按照流程定义key值启动的,按照流程定义Id启动的等等。

二、使用步骤

1.产生方式

代码如下(示例):

RuntimeService runtimeService = processEngine.getRuntimeService();

 

2.启动流程

2.1代码实现

//获取service
RuntimeService  runtimeService = processEngine.getRuntimeService();
//流程实例key启动
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("300");

 

在Activiti中,启动了一个流程后,就会创建一个流程实例(ProcessInstance),简单来说流程实例就是根据一次(一条)业务数据用流程驱动的入口 Execution的含义就是一个流程实例(ProcessInstance)具体要执行的过程对象。 两者的对象映射关系:ProcessInstance(1)—>Execution(N),其中N >= 1。 每个流程实例至少会有一个执行流(execution),如果流程中没有分支,则N=1,如果流程中出现了分支,则N>1

2.2生成的表数据

当启动一个流程产生流程实例后:

5.2.1 会在act_ru_execution表产生一条数据,代表正在执行的流程对象,

需要理解的字段

ID_ 正在执行的流程对象的ID
PROC_INST_ID_ 流程实例ID
PROC_DEF_ID_ 流程定义ID
ACT_ID_ 执行到流程任务节点的ID

5.2.2 会在流程实例的历史表act_hi_procinst中产生一条数据

需要理解的字段

ID_ 正在执行的流程对象的ID
PROC_INST_ID_ 流程实例ID
PROC_DEF_ID_ 流程定义ID
ACT_ID_ 执行到流程任务节点的ID
START_TIME_ 流程开始时间
END_TIME_ 流程结束时间

5.2.3 流程启动后,会在act_ru_task任务表生成一条数据(经常用的表),存储的流程上正在运行的节点任务

EXECUTION_ID_ 流程对象id(act_ru_execution表id)
PROC_INST_ID_ 流程实例id
PROC_DEF_ID_ 流程定义id
NAME_

当前流程任务的名称(流程图任务节点自己设置的name)

TASK_DEF_KEY_ 当前流程任务的key(流程图任务节点自己设置的key)
ASSIGNEE_ 当前任务代办人
CREATE_TIME_ 任务节点的创建时间

5.2.4 act_hi_taskinst历史任务实例表,流程所有节点任务历史存储表

生成时机:流程在act_ru_task创建的时候,同时也会在act_hi_taskinst创建一条。endtime暂时还没有。

需要理解的字段同 5.2.3

5.2.5 act_hi_actinst历史所有经过的活动。某个流程实例历史上经过的全部活动节点

所有的活动,在这表中都会有数据

3.流程的激活和挂起

    /**
     * 流程实例的挂起和激活
     */
    @Test
    public void suspendAndActivateProcessInstanceTest(){
        String  processDefinitionKey = "activit_key";
        ProcessInstance processInstance =         runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).variableValueEquals("title","启动流程").singleResult();
        String processInstanceId = processInstance.getProcessInstanceId();

        System.out.println("流程实例是否挂起: " +processInstance.isSuspended());

        //挂起流程实例
        runtimeService.suspendProcessInstanceById(processInstanceId);
        //验证是否挂起
        Assert.assertTrue(runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().isSuspended());

        //激活流程实例
        runtimeService.activateProcessInstanceById(processInstanceId);
        //验证是否激活
        Assert.assertTrue(!runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().isSuspended());
    }

 

4.流程实例的查询

  /**
     * 流程实例查询对象 的创建。
     */
    @Test
    public void qrocessInstanceQuery() {
        String processDefinitionKey = "activit_key";//流程定义key
        //创建 流程实例查询对象
        ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();


        //查询出多条记录
        List<ProcessInstance> processInstanceList = processInstanceQuery
                .processDefinitionKey(processDefinitionKey)//根据流程定义的key来查询
                //.processDefinitionVersion(1)//根据流程定义的版本号查询
                //.processDefinitionId("activit_key:4:1") //根据流程定义的id查询
                .orderByProcessDefinitionKey() //按照流程定义key的排序
                .desc() //降序
                .list();
        for (ProcessInstance processInstance : processInstanceList) {
            System.out.println("流程实例ID: " + processInstance.getId());
            System.out.println("正在活动的节点ID: " + processInstance.getActivityId());
            System.out.println("流程定义的ID: " + processInstance.getProcessDefinitionId());
        }


        //如果能确定数据库查询的结果只有一条记录,可以采用 singleResult
        ProcessInstance processInstance = processInstanceQuery
                .processDefinitionKey(processDefinitionKey)//根据流程定义的key来查询
                .singleResult();
        System.out.println("流程实例ID: " + processInstance.getId());
        System.out.println("正在活动的节点ID: " + processInstance.getActivityId());
        System.out.println("流程定义的ID: " + processInstance.getProcessDefinitionId());




        //查询激活的流程实例
        List<ProcessInstance> activateList = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).active().list();
        Assert.assertTrue(activateList.size()>0);

        //相反 查询挂起的流程则是
        List<ProcessInstance> suspendList = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).suspended().list();
        Assert.assertTrue(suspendList.size()==0);

        //根据变量来查询
        // 根据title='启动流程',以及processDefinitionKey来作为查询条件进行查询
        List<ProcessInstance> varList = runtimeService.createProcessInstanceQuery().variableValueEquals("title","启动流程").list();
        Assert.assertTrue(varList.size()>0);

    }

 

5.流程对象的查询

RuntimeService中有createExecutionQuery方法可以得到一个ExecutionQuery对象,该对象就可以根据执行流的相关数据查询执行流

    /**
     * 执行流(流程对象)的查询
     * 执行流的查询
     * RuntimeService中有createExecutionQuery方法可以得到一个ExecutionQuery对象,该对象就可以根据执行流的相关数据查询执行流
     */
    @Test
    public void executionQueryTest(){
        String  processDefinitionKey = "activit_key";
        List<Execution> executionList = runtimeService.createExecutionQuery().processDefinitionKey(processDefinitionKey).list();
        Assert.assertTrue(executionList.size()>0);
    }

6.流程实例的删除

    /**
     * 流程实例的删除
     */
    @Test
    public void deleteProcessInstanceTest(){
        String  processDefinitionKey = "activit_key";
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).variableValueEquals("title","启动流程").singleResult();
        String processInstanceId = processInstance.getProcessInstanceId();
        runtimeService.deleteProcessInstance(processInstanceId,"删除测试");
    }

7.流程实例的状态查询

注:在流程执行的过程中,创建的流程实例ID在整个流程执行过程中都不会变化,当流程结束后,流程实例会在正在执行的流程对象表中删除act_ru_execution
   /**
     * 流程实例的状态查询(就是查询流程正在执行,还是已经结束)
     *
     * 注:在流程执行的过程中,创建的流程实例ID在整个流程执行过程中都不会变化,当流程结束后,流程实例会在正在执行的流程对象表中删除act_ru_execution
     */
    @Test
    public void queryProcessInstanceState(){
        String  processDefinitionKey = "activit_key";
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processDefinitionKey(processDefinitionKey)
                .singleResult();
        if(processInstance!=null){
            System.out.println("当前流程处在:"+processInstance.getActivityId());
        }else{
            System.out.println("当前流程已结束");
        }
    }

 

 


总结

RuntimeService  主要针对流程实例相关操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(四)activiti7大服务service详解——2 RuntimeService 的相关文章

  • 删除Activiti表单

    DROP TABLE IF EXISTS ACT RE DEPLOYMENT DROP TABLE IF EXISTS ACT GE PROPERTY DROP TABLE IF EXISTS ACT HI ACTINST DROP TAB
  • Activiti之一:部署activiti-admin、activiti-app、activiti-rest

    文章目录 各组件版本下载部署将war包放入tomcat 访问 在网上查找activiti相关资料 xff0c 发现对于activiti rest的使用很少 xff0c 而官网对于api的支持还是比较多的 xff0c 如果考虑的是一个纯粹的工
  • Activiti6.0学习实践(4)-流程引擎配置一

    在上一节 我们进行了一个hello world 的简单应用搭建 本节继续对activiti的一些重要组件进行更进一步的分析 目录 1 activiti工程骨架 1 2 添加demo类到骨架工程 1 3 创建基于骨架的maven工程 2 流程
  • 从Activiti切换到Camunda的5个理由

    原文 5 Reasons to switch from Activiti to Camunda 最近 Alfresco Activiti的前关键工程师宣布辞去Alfresco的职务 他们Fork了Activiti并开始了他们自己的项目 Fl
  • 2023最新版本Activiti7系列-网关服务

    网关篇 网关可控制流程的执行流向 常用于拆分或合并复杂的流程场景 在Activiti7中 有以下几种类型的网关 排他网关 Exclusive Gateway 用于在流程中进行条件判断 根据不同的条件选择不同的分支路径 只有满足条件的分支会被
  • activiti报错:org.activiti.engine.ActivitiTaskAlreadyClaimedException: Task ‘12502‘ is already claimed

    在运行activiti时 报错信息如下 Exception in thread main org activiti engine ActivitiTaskAlreadyClaimedException Task 12502 is alrea
  • activiti-Cancel activity属性(cancelActivity)作用

    流程设计工具 activiti explorer activiti版本 5 22 在使用边界计时器事件时 事件有一个参数 Cancel activity 作用上图 如下 Cancel activity选中 在事件中设置5秒计时 当开始流程后
  • Activiti7 监听器【十四】

    Activiti 7系列文章目录 文章代码下载 Activiti7 工作流设计器 一 Activiti7 创建表 二 Activiti7 表结构介绍 三 Activiti7 设计器创建流程 四 Activiti7 部署流程 五 Activi
  • 计算机专业毕业设计一

    概述 从一个医学生转行成为一名程序员 对于我来说 是一个超前的跨越 好奇的朋友会问了 医学这么吃香的行业 怎么转行做码农呢 这个道理很简单 就是想象和显示差距太大了 距离梦想的专业差了点距离 请允许我去小黑屋哭上半个小时 想当年 我意气风发
  • 关于activiti流程通过、驳回、会签、转办、中止、挂起等核心操作功能的封装

    package com famousPro process service impl import java util ArrayList import java util HashMap import java util List imp
  • springboot整合activiti7

    一 添加依赖
  • 万字详解:Activiti 工作流引擎

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • Activiti启动流程实例,runtimeService.startProcessInstanceByKey

    启动流程实例 添加进businessKey 本质 act ru execution表中的businessKey的字段要存入业务标识 public class BusinessKeyAdd public static void main St
  • activiti学习之服务任务

    写在前面 对于工作流 我们使用最多的是用户任务节点 用户任务节点就是给用户来生成任务的 需要人来手动的处理 而与之对应的还有服务任务节点 这种类型的节点需要人手动的参与而是程序来执行 即执行某个类的某个方法 这个类一般是org activi
  • SpringBoot 整合Activiti(二)——流程审批完整示例

    前两天做了一个SpringBoot整合Activiti的完整示例 功能包括 退回 通过 节点条件 指定办理人 生成流程图 高亮显示已办节点 查询任务列表 办理人 等 下面先简单记录 含完整代码 十六上班后再详细补充 1 画流程图 高亮生成的
  • Activiti-设置全局变量的四种方法

    1 在流程启动的时候设置全局变量 在流程启动时设置全局变量 Test public void startProcessInstance 得到runtimeService RuntimeService runtimeService proce
  • 【工作流Activiti】了解工作流

    1 什么是工作流 工作流 Workflow 就是通过计算机对业务流程自动化执行管理 它主要解决的是 使在多个参与者之间按照某种预定义的规则自动进行传递文档 信息或任务的过程 从而实现某个预期的业务目标 或者促使此目标的实现 通俗来讲 就是业
  • 如何指定应从 BPMN callActivity 调用哪个启动事件

    From http www omg org spec BPMN 2 0 2 PDF http www omg org spec BPMN 2 0 2 PDF第 238 页 如果该进程用作全局进程 可调用进程 可以从其他进程的调用活动中调用
  • 如何将候选用户列表传递给 alfresco 中的 activiti 工作流任务?

    我希望能够传递作为任务候选者的用户列表 用户是从数据列表中检索的 不能作为一个组使用 Activiti candidateUsers 似乎是正确的方法 假设已获取用户并将其设置在变量 ipw reviwers 中
  • 动态设置用户任务受让人

    我必须在 activiti 中创建需要以下用例的流程 1 表单有一个人员搜索字段 2 当有人填写表单并使用填充姓名的人员搜索字段完成任务时 我需要将分配的下一个任务的名称设置为可以对下一个任务执行操作的用户 如何使用 activiti 引擎

随机推荐