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

 

前言

 

在 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  主要针对流程实例相关操作

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Activiti7是一个基于Spring Boot的开源工作流引擎,它提供了一系列的服务来支持工作流的实现。其中,大服务(Service)是Activiti7中的一种重要的服务类型,它承担了很多核心功能。下面我们来详细介绍一下Activiti7大服务的各种类型及其作用。 1. Identity Service Identity ServiceActiviti7中的一个重要服务,它提供了用户和组的管理功能。通过Identity Service,我们可以创建、删除、更新用户和组,以及查询用户和组的信息。在Activiti7中,用户和组是与任务和流程实例相关联的,因此Identity Service对于工作流的实现非常关键。 2. Runtime Service Runtime ServiceActiviti7中的另一个重要服务,它提供了流程实例的管理功能。通过Runtime Service,我们可以启动、暂停、恢复、删除流程实例,以及查询流程实例的状态。在Activiti7中,每个流程实例都有一个唯一的标识符,我们可以通过Runtime Service来管理这些流程实例。 3. Task Service Task ServiceActiviti7中的一个重要服务,它提供了任务的管理功能。通过Task Service,我们可以创建、完成、删除任务,以及查询任务的信息。在Activiti7中,任务是流程实例中的一个环节,它需要被分配给具体的用户或组去执行。 4. Form Service Form ServiceActiviti7中的一个服务,它提供了表单的管理功能。通过Form Service,我们可以查询、创建、更新和删除表单。在Activiti7中,表单是与任务和流程实例相关联的,它可以用来展示和收集用户输入的数据。 5. History Service History ServiceActiviti7中的一个服务,它提供了历史数据的管理功能。通过History Service,我们可以查询已经完成的流程实例、任务和变量的历史数据。在Activiti7中,历史数据包括流程实例的启动时间、结束时间,任务的创建时间、完成时间,以及变量的修改历史等信息。 6. Management Service Management ServiceActiviti7中的一个服务,它提供了管理功能。通过Management Service,我们可以查询Activiti7的配置信息,管理数据库表,以及执行一些系统级别的操作。在Activiti7中,Management Service需要有管理员权限才能使用。 总之,Activiti7大服务Activiti7引擎的核心组成部分,它提供了许多重要的功能,包括用户和组的管理、流程实例的管理、任务的管理、表单的管理、历史数据的管理以及管理功能等。这些服务使得Activiti7成为了一个功能强大、易于使用的工作流引擎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青苔猿猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值