Activiti学习笔记六 流程实例 任务 执行对象控制流程执行

2023-05-16

上一篇我们看了流程定义,我们接下来看一下流程实例,任务,和执行对象。

 

流程实例 任务的执行

1.流程图

2.部署流程定义

    private final ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

    /**
     * 功能: 部署流程定义zip.<br/>
     * date: 2014年12月16日 下午2:09:03 <br/>
     * 
     * @author xzzhao@wisdombud.com
     */
    @Test
    public void deploymentProcessDefinitionByZip() {
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
        ZipInputStream zipInputStream = new ZipInputStream(in);
        Deployment deployment = processEngine.getRepositoryService()
        // 与流程定义和部署相关的Service
                .createDeployment()
                // 创建部署对象
                .name("流程定义")
                // 部署名称
                .addZipInputStream(zipInputStream) // 指定zip文件
                .deploy(); // 部署
        System.out.println("部署ID:" + deployment.getId());
        System.out.println("部署名称:" + deployment.getName());
    }


3.启动流程实例

/**
     * 功能: 启动流程实例.<br/>
     * date: 2014年12月15日 下午5:25:37 <br/>
     * 
     * @author xzzhao@wisdombud.com
     */
    @Test
    public void startProcessInstance() {
        // 流程定义的key
        String processDefinitionKey = "helloworld";
        ProcessInstance pi = processEngine.getRuntimeService()// 获取正在执行的流程实例和执行对象相关的Service
                .startProcessInstanceByKey(processDefinitionKey); // 使用流程定义的key启动流程实例
                                                                  // key
                                                                  // 对应helloworld.bpmn中的Id属性
        System.out.println(pi.getId()); // 流程实例Id 601
        System.out.println(pi.getProcessDefinitionId()); // 流程定义Id
                                                         // helloworld:1:504
    }

操作数据库的act_ru_execution表,如果是用户任务节点,同时也会在act_ru_task添加一条记录

 

act_ru_execution #正在执行的执行对象表

   执行对象ID                                                                           流程实例ID

act_hi_procinst   #流程实例的历史表

   执行对象ID                              流程实例ID

 
结论
1.如果是单例流程(没有分支和聚合),那么流程实例ID和执行对象ID是相同的
2.一个流程流程实例只有一个,执行对象可以存在多个(如果存在分支和聚合)
注意:本例是单例流程,要想测试第二个结论,可以再画一张有分支的流程图来测试。

 

4.查询个人任务 

/**
     * 功能: 查询当前人的个人任务.<br/>
     * date: 2014年12月16日 上午11:00:46 <br/>
     * 
     * @author xzzhao@wisdombud.com
     */
    @Test
    public void queryMyTask() {
        String assignee = "李四";
        List<Task> list = processEngine.getTaskService()// 获取正在执行的任务相关的Service
                .createTaskQuery()// 创建任务查询对象
                .taskAssignee(assignee)// 指定任务办理人
                // .taskCandidateUser(candidateUser) //组任务的办理人查询
                // .processDefinitionId(processDefinitionId)//使用流程定义Id查询
                // .processInstanceId(processInstanceId) //使用流程实例Id查询
                // .executionId(executionId) //使用执行对象Id查询
                /** 排序 */
                .orderByTaskCreateTime().asc() // 使用创建时间的升序
                /** 返回结果集 */
                // .singleResult()// 返回唯一结果集
                // .count() // 返回结果集的数量
                // .listPage(firstResult, maxResults)//分页查询
                .list();
        if (null != list && list.size() > 0) {
            for (Task task : list) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务创建时间:" + task.getCreateTime());
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("执行对象ID:" + task.getExecutionId());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("################################");
            }
        }
    }


说明:

        1)因为是任务查询,所以从processEngine中应该得到TaskService

        2)使用TaskService获取到任务查询对象TaskQuery

        3)为查询对象添加查询过滤条件,使用taskAssignee指定任务的办理者(即查询指定用户的代办任务),同时可以添加分页排序等过滤条件

        4)调用list方法执行查询,返回办理者为指定用户的任务列表

        5)任务ID、名称、办理人、创建时间可以从act_ru_task表中查到

        6)单例流程中ProcessInstance相当于Execution

        7)如果assignee属性为部门经理,结果为空。因为现在流程只到了”填写请假申请”阶段,后面的任务还没有执行,即在数据库中没有部门经理可以办理的任务,所以查询不到

        8)一个Task节点和Execution节点是1对1的情况,在task对象中使用Execution_来表示他们之间的关系

        9)任务ID在数据库表act_ru_task中对应“ID_”列

 

附加

activiti任务中,主要分为两大类查询任务(个人任务和组任务):

1.确切指定了办理者的任务,这个任务将成为指定者的私有任务,即个人任务。

2.无法指定具体的某一个人来办理的任务,可以把任务分配给几个人或者一到多个小组,让这个范围内的用户可以选择性(如有空余时间时)来办理这类任务,即组任务。

act_ru_task  #正在执行的任务表

任务ID                                                                                   执行对象ID                          流程实例ID

 

act_hi_taskinst #任务历史表

                                                                                                                                         办理人                       开始时间                                                       结束时间

 

act_hi_actinst #所有活动节点的历史表

 

5.办理任务

/**
     * 功能: 完成任务.<br/>
     * date: 2014年12月17日 下午5:24:44 <br/>
     * 
     * @author xzzhao@wisdombud.com
     */
    @Test
    public void completeMyTask() {
        String taskId = "1402";
        processEngine.getTaskService()// 获取任务相关Service
                .complete(taskId);
        System.out.println("完成任务:任务ID:" + taskId);
    }

说明:

        1)是办理任务,所以从ProcessEngine得到的是TaskService

        2)当执行完这段代码,再以员工的身份去执行查询的时候,会发现这个时候已经没有数据了,因为正在执行的任务中没有数据

        3)对于执行完的任务,activiti将从act_ru_task表中删除该任务,下一个任务会被插入进来

        4)以”部门经理”的身份进行查询,可以查到结果。因为流程执行到部门经理审批这个节点了

        5)再执行办理任务代码,执行完以后以”部门经理”身份进行查询,没有结果、

        6)重复第3和4步直到流程执行完

 

6.查询流程状态

/**
     * 功能: 查询流程状态(判断流程正在执行,还是结束).<br/>
     * date: 2014年12月22日 下午3:52:22 <br/>
     * 
     * @author xzzhao@wisdombud.com
     */
    @Test
    public void isProcessEnd() {
        String processInstanceId = "1201";
        ProcessInstance pi = processEngine.getRuntimeService()// 正在执行的流程实例和执行对象相关Service
                .createProcessInstanceQuery() // 创建流程实例查询
                .processInstanceId(processInstanceId) // 使用流程实例ID查询
                .singleResult();
        if (null == pi) {
            System.out.println("流程已经结束!");
        } else {
            System.out.println("流程正在执行!");
        }
    }

在流程执行的过程中,创建的流程实例ID在整个过程中都不会变,当流程结束后,流程实例将会在正在执行的执行对象表中(act_ru_execution)被删除

 

说明:

       1)因为是查询流程实例,所以先获取runtimeService

       2)创建流程实例查询对象,设置实例ID过滤参数

       3)由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大于1,则抛出异常

       4)判断指定ID的实例是否存在,如果结果为空,则代表流程结束,实例在正在执行的执行对象表中已被删除,转换成历史数据

 
7.查询历史任务 

/**
     * 功能: 查询历史任务.<br/>
     * date: 2014年12月22日 下午4:15:55 <br/>
     * 
     * @author xzzhao@wisdombud.com
     */
    @Test
    public void findHistoryTask() {
        String taskAssignee = "张三";
        List<HistoricTaskInstance> list = processEngine.getHistoryService()// 与历史数据相关的Service
                .createHistoricTaskInstanceQuery() // 创建历史任务实例查询
                .taskAssignee(taskAssignee) // 指定办理人
                .list();
        if (null != list && list.size() > 0) {
            for (HistoricTaskInstance hist : list) {
                System.out.println(hist.getId() + "   " + hist.getName() + "   " + hist.getProcessInstanceId() + "   "
                                   + hist.getStartTime());
                System.out.println("#########################");
            }
        }
    }

 

8.查询历史流程实例 

/**
     * 功能: 查询历史流程实例.<br/>
     * date: 2014年12月22日 下午4:25:13 <br/>
     * 
     * @author xzzhao@wisdombud.com
     */
    @Test
    public void findHistoryProcessInstance() {
        String processInstanceId = "1201";
        HistoricProcessInstance hpi = processEngine.getHistoryService()// 与历史数据相关的Service
                .createHistoricProcessInstanceQuery() // 创建历史流程实例查询
                .processInstanceId(processInstanceId) // 使用流程实例Id查询
                .singleResult();
        System.out.println(hpi.getId() + "    " + hpi.getProcessDefinitionId() + "   " + hpi.getStartTime() + "   "
                           + hpi.getEndTime());
    }


总结:

Execution  执行对象

 按流程定义的规则执行一次的过程.

 对应的表:

 act_ru_execution:正在执行的信息

 act_hi_procinst:已经执行完的历史流程实例信息

 act_hi_actinst:存放历史所有完成的活动

 

ProcessInstance 流程实例

 特指流程从开始到结束的那个最大的执行分支,一个执行的流程中,流程实例只有1个。

注意

1)如果是单例流程,执行对象ID就是流程实例ID

2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同

3)一个流程中,流程实例只有1个,执行对象可以存在多个

 

Task任务

 执行到某任务环节时生成的任务信息

 对应的表:

  act_ru_task:正在执行的任务信息

  act_hi_taskinst:已经执行完的历史任务信息

 



              

 

 

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

Activiti学习笔记六 流程实例 任务 执行对象控制流程执行 的相关文章

  • jar文件双击不能打开

    注册表 在Windows开始菜单的搜索框中输入 regedit xff0c 在上方搜索出的文件regedit上点击鼠标右键 xff0c 在弹出的菜单中选择 以管理员身份运行 在注册表编辑器中 xff0c 找到 HKEY CLASSES RO
  • 深入理解JS中的变量作用域

    在 JS 当中一个变量的作用域 xff08 scope xff09 是程序中定义这个变量的区域 变量分为两类 xff1a 全局 xff08 global xff09 的和局部的 其中全局变量的作用域是全局性的 xff0c 即在 JavaSc
  • SystemUI返回键手势和launcher上滑手势

    背景描述 最近修改bug和需求 xff0c 接触到系统手势这一块 xff0c 发现是一个薄弱点 xff0c 以前只是简单知道 xff0c 没有深入了解 手势这一块涉及的模块和流程比较多 xff0c 记录一下别人写的比较好的文章参考一下 初步
  • Android Studio 展开、折叠代码块快捷键

    展开 折叠代码块的方法 xff1a 折叠单个方法 xff1a 34 ctrl 34 43 34 34 展开单个方法 xff1a 34 ctrl 34 43 34 43 34 折叠全部方法 xff1a 34 ctrl 34 43 34 shi
  • Android Studio 重写父类方法的快捷键

    快速重写父类方法的快捷键 xff1a ctrl 43 o
  • 门面(外观)模式和代理模式区别

    本文只讲门面模式和代理模式的区别 今天用旅游吃饭来区分下门面模式和代理模式 门面模式是给用户提供一种服务 xff0c 就相当于我们的饭店 xff0c 可以给顾客提供美味的食物 代理模式是根据用户的需求 xff0c 提供解决该需求的方案 xf
  • 传输层TCP的流量控制和拥塞控制(图文详解)

    TCP的流量控制和拥塞控制 TCP流量控制流量控制中的死锁问题 x1f512 持续计时器 TCP的拥塞控制增加资源能解决拥塞吗 xff1f 拥塞往往会趋于恶化拥塞控制方法慢开始和拥塞避免慢开始拥塞避免 快重传和快恢复快重传快恢复 TCP流量
  • 数据链路层的子层MAC层(图文详解)

    数据链路层的子层MAC层 MAC层MAC层的硬件地址单站地址 xff0c 组地址 xff0c 广播地址全球管理与本地管理适配器检查MAC地址 MAC帧的格式 MAC层 MAC不是物理层 xff01 MAC不是物理层 xff01 MAC不是物
  • 补码一位乘法(Booth算法)和补码二位乘法详解

    文章目录 补码一位乘法补码二位乘法布斯算法的硬件实现 A D Booth提出了一种算法 xff1a 相乘二数用补码表示 xff0c 它们的符号位与数值为一起参与乘法运算的过程 xff0c 直接得出用补码表示的乘法结果 xff0c 且正数和负
  • 计算机原理中的字,位扩展,都给老子进来学,看不懂算我输!

    文章目录 涉及到的几个概念地址线与数据线 字扩展与位扩展 涉及到的几个概念 MDR xff1a 数据寄存器 xff0c 用来存入内存中读入 写出的信息 MAR xff1a 地址寄存器 xff0c 用来存放当前CPU访问的内存单元地址 地址线
  • 计算机组成原理中指令的四个工作周期

    文章目录 执行过程取指周期带有间址寻址的指令周期带有中断的指令周期 间指周期执行周期中断周期 执行过程 执行过程 xff1a 在取址周期后 xff0c 需要判断是否有间址周期 xff0c 如果没有就进入到了执行周期 xff0c 在执行周期过
  • Uncaught TypeError: $(...).modal is not a function

    项目场景 xff1a ssm框架配合bootstrap和AJAX xff0c 点击按钮弹出模态框 问题描述 xff1a Uncaught TypeError modal is not a function 原因分析 xff1a 没有引入bo
  • Lock锁及获取锁的四种方法

    为什么使用LOCK xff1f LOCK锁LOCK锁的上锁与解锁 为什么使用LOCK xff1f 传统的Synchronized锁有非常多的缺点 xff1a 锁的唤醒和阻塞代价较高 xff0c 线程的阻塞和唤醒 xff0c 操作系统需要在用
  • Chrome浏览器无法安装插件的解决办法

    国内不翻墙情况下 xff0c 无法正常登录谷歌账户 无法访问谷歌应用商店 xff0c 无法同步个人数据和安装使用各类插件 本文解决方法 xff1a 开发模式安装 步骤 xff1a 1 将xxx crx插件的扩展名改成 zip或者 rar并解
  • java8的ConcurrentHashMap为何放弃分段锁,为什么要使用CAS+Synchronized取代Segment+ReentrantLock

    原文地址 xff1a https cloud tencent com developer article 1509556 今天突然被一个同事问到java8为何放弃分段锁 xff0c 于是花了点时间针对这个问题进行了小小的总结 jdk1 7分
  • 8-17小记

    Comparator比较器的使用 435 无重叠区间 力扣 xff08 LeetCode xff09 leetcode cn com 给定一个区间的集合 xff0c 找到需要移除区间的最小数量 xff0c 使剩余区间互不重叠 注意 可以认为
  • Java关键字小记

    Static静态内部类静态变量和方法导包静态代码块 final用来修饰数据用来修饰方法参数修饰方法修饰类 abstractabstract类abstract方法 extendsthrow和throwsvolatile 本篇是Java关键字的
  • Java 通过反射获取方法与变量

    0 反射技术 反射技术是Java生态中的重要内容 xff0c 在Spring以及其他框架中得到了广泛的应用 有了反射技术 xff0c 我们可以在程序运行的过程中 xff1a 构建任意一个类的对象 xff0c 了解任意一个对象所属的类 xff
  • 分享一个免费版本库可以建私库

    别的不多说 目前这个行业小团队比较多 xff0c 想要版本库的话 看下面 反正我个人一直在用 所以就推荐给你们 我不介绍github xff0c 和gitorious 因为github在私人库的时候是收费的 而最早的gitorious是没办
  • ibm服务器故障诊断面板报警信息解释|亮黄灯了

    诊断面板如下图 xff1a ps 指示灯 xff1a 当此指示灯发亮时 xff0c 表明电源 出现故障 xff0c 需要及时更换电源 temp 指示灯 xff1a 当此指示灯发亮时 xff0c 表明系统温度超出阈值级别 xff0c 检查风扇

随机推荐