news 2026/7/1 18:51:46

Activiti7工作流(六)流程实例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Activiti7工作流(六)流程实例

文章目录

    • 1、概念解释
    • 2、启动流程实例
    • 3、操作数据库表
    • 4、查询流程实例
    • 5、关联BusinessKey
    • 6、挂起、激活流程实例
      • 6.1、全部流程实例挂起
      • 6.2、单个流程实例挂起

1、概念解释

流程实例(ProcessInstance)代表流程定义的执行实例。

一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。

例如:用户或程序按照流程定义内容发起一个流程,这就是一个流程实例。

流程定义和流程实例的图解:

2、启动流程实例

启动流程实例 并添加Businesskey(业务标识)

流程定义部署在activiti后,就可以在系统中通过activiti去管理该流程的执行,执行流程表示流程的一次执行。

比如部署系统出差流程后,如果某用户要申请出差这时就需要执行这个流程,如果另外一个用户也要申请出差则也需要执行该流程,每个执行互不影响,每个执行是单独的流程实例。

启动流程实例时,指定的businesskey,就会在act_ru_execution #流程实例的执行表中存储businesskey。

Businesskey:业务标识,通常为业务表的主键,业务标识和流程实例一一对应。业务标识来源于业务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据。

比如:出差流程启动一个流程实例,就可以将出差单的id作为业务标识存储到activiti中,将来查询activiti的流程实例信息就可以获取出差单的id从而关联查询业务系统数据库得到出差单信息。

/** * 启动流程实例,添加businessKey */@TestpublicvoidaddBusinessKey(){// 1、得到ProcessEngineProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 2、得到RunTimeServiceRuntimeServiceruntimeService=processEngine.getRuntimeService();// 3、启动流程实例,同时还要指定业务标识businessKey,也就是出差申请单id,这里是1001ProcessInstanceprocessInstance=runtimeService.startProcessInstanceByKey("myEvection","1001");// 4、输出processInstance相关属性System.out.println("业务id=="+processInstance.getBusinessKey());}

Activiti的act_ru_execution中存储业务标识:

3、操作数据库表

启动流程实例,操作如下数据库表:

SELECT*FROMact_ru_execution#流程实例执行表,记录当前流程实例的执行情况


说明:

流程实例执行,如果当前只有一个分支时,一个流程实例只有一条记录且执行表的主键id和流程实例id相同,如果当前有多个分支正在运行则该执行表中有多条记录,存在执行表的主键和流程实例id不相同的记录。

不论当前有几个分支总会有一条记录的执行表的主键和流程实例id相同 。

一个流程实例运行完成,此表中与流程实例相关的记录删除。

SELECT*FROMact_ru_task#任务执行表,记录当前执行的任务

说明:启动流程实例,流程当前执行到第一个任务结点,此表会插入一条记录表示当前任务的执行情况,如果任务完成则记录删除。

SELECT*FROMact_ru_identitylink#任务参与者,记录当前参与任务的用户或组

SELECT*FROMact_hi_procinst#流程实例历史表

流程实例启动,会在此表插入一条记录,流程实例运行完成记录也不会删除。

SELECT*FROMact_hi_taskinst#任务历史表,记录所有任务


开始一个任务,不仅在act_ru_task表插入记录,也会在历史任务表插入一条记录,任务历史表的主键就是任务id,任务完成此表记录不删除。

SELECT*FROMact_hi_actinst#活动历史表,记录所有活动


活动包括任务,所以此表中不仅记录了任务,还记录了流程执行过程的其它活动,比如开始事件、结束事件。

4、查询流程实例

流程在运行过程中可以查询流程实例的状态,当前运行结点等信息。

@TestpublicvoidqueryProcessInstance(){// 流程定义keyStringprocessDefinitionKey="evection";ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 获取RunTimeServiceRuntimeServiceruntimeService=processEngine.getRuntimeService();List<ProcessInstance>list=runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey)//.list();for(ProcessInstanceprocessInstance:list){System.out.println("----------------------------");System.out.println("流程实例id:"+processInstance.getProcessInstanceId());System.out.println("所属流程定义id:"+processInstance.getProcessDefinitionId());System.out.println("是否执行完成:"+processInstance.isEnded());System.out.println("是否暂停:"+processInstance.isSuspended());System.out.println("当前活动标识:"+processInstance.getActivityId());}}

5、关联BusinessKey

需求:

在activiti实际应用时,查询流程实例列表时可能要显示出业务系统的一些相关信息,比如:查询当前运行的出差流程列表需要将出差单名称、出差天数等信息显示出来,出差天数等信息在业务系统中存在,而并没有在activiti数据库中存在,所以是无法通过activiti的api查询到出差天数等信息。

实现:

在查询流程实例时,通过businessKey(业务标识 )关联查询业务系统的出差单表,查询出出差天数等信息。

通过下面的代码就可以获取activiti中所对应实例保存的业务Key。而这个业务Key一般都会保存相关联的业务操作表的主键,再通过主键ID去查询业务信息,比如通过出差单的ID,去查询更多的请假信息(出差人,出差时间,出差天数,出差目的地等)

StringbusinessKey=processInstance.getBusinessKey();

在activiti的act_ru_execution表,字段BUSINESS_KEY就是存放业务KEY的。

6、挂起、激活流程实例

某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会继续执行。

6.1、全部流程实例挂起

操作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停:

流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行。

/** * 全部流程实例挂起与激活 */@TestpublicvoidSuspendAllProcessInstance(){// 获取processEngineProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 获取repositoryServiceRepositoryServicerepositoryService=processEngine.getRepositoryService();// 查询流程定义的对象ProcessDefinitionprocessDefinition=repositoryService.createProcessDefinitionQuery().processDefinitionKey("myEvection").singleResult();// 得到当前流程定义的实例是否都为暂停状态booleansuspended=processDefinition.isSuspended();// 流程定义idStringprocessDefinitionId=processDefinition.getId();// 判断是否为暂停if(suspended){// 如果是暂停,可以执行激活操作 ,参数1 :流程定义id ,参数2:是否激活,参数3:激活时间repositoryService.activateProcessDefinitionById(processDefinitionId,true,null);System.out.println("流程定义:"+processDefinitionId+",已激活");}else{// 如果是激活状态,可以暂停,参数1 :流程定义id ,参数2:是否暂停,参数3:暂停时间repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null);System.out.println("流程定义:"+processDefinitionId+",已挂起");}}

6.2、单个流程实例挂起

操作流程实例对象,针对单个流程执行挂起操作,某个流程实例挂起则此流程不再继续执行,完成该流程实例的当前任务将报异常。

/** * 单个流程实例挂起与激活 */@TestpublicvoidSuspendSingleProcessInstance(){// 获取processEngineProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// RuntimeServiceRuntimeServiceruntimeService=processEngine.getRuntimeService();// 查询流程定义的对象ProcessInstanceprocessInstance=runtimeService.createProcessInstanceQuery().processInstanceId("15001").singleResult();// 得到当前流程定义的实例是否都为暂停状态booleansuspended=processInstance.isSuspended();// 流程定义idStringprocessDefinitionId=processInstance.getId();// 判断是否为暂停if(suspended){// 如果是暂停,可以执行激活操作 ,参数:流程定义idruntimeService.activateProcessInstanceById(processDefinitionId);System.out.println("流程定义:"+processDefinitionId+",已激活");}else{// 如果是激活状态,可以暂停,参数:流程定义idruntimeService.suspendProcessInstanceById(processDefinitionId);System.out.println("流程定义:"+processDefinitionId+",已挂起");}}/** * 测试完成个人任务 */@TestpublicvoidcompletTask(){// 获取引擎ProcessEngineprocessEngine=ProcessEngines.getDefaultProcessEngine();// 获取操作任务的服务 TaskServiceTaskServicetaskService=processEngine.getTaskService();// 完成任务,参数:流程实例id,完成zhangsan的任务Tasktask=taskService.createTaskQuery().processInstanceId("15001").taskAssignee("rose").singleResult();System.out.println("流程实例id="+task.getProcessInstanceId());System.out.println("任务Id="+task.getId());System.out.println("任务负责人="+task.getAssignee());System.out.println("任务名称="+task.getName());taskService.complete(task.getId());}


“人的一生会经历很多痛苦,但回头想想,都是传奇”。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 18:45:34

Spring Boot大学校园生活信息平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着信息化技术的快速发展&#xff0c;校园生活的数字化管理已成为高校现代化建设的核心需求。传统校园信息管理方式依赖人工操作&#xff0c;效率低下且容易出错&#xff0c;无法满足学生和教职工对实时信息获取的需求。校园生活信息平台旨在整合校园内的各类资源&#x…

作者头像 李华
网站建设 2026/6/30 20:45:58

牛逼!Gemini 3 Flash 闪电来袭:智力竟反超Pro!

作者 | 冬梅在大模型竞赛进入“效率与规模并重”的新阶段之际&#xff0c;谷歌正再次亮出王牌。刚刚&#xff0c;谷歌发布最新模型 Gemini 3 Flash&#xff0c;据介绍&#xff0c;它拥有前沿智能&#xff0c;专为速度而生&#xff0c;可以帮助每个人更快地学习、构建和规划任何…

作者头像 李华
网站建设 2026/6/25 23:32:16

Langchain-Chatchat能否支持文档下载权限控制?

Langchain-Chatchat能否支持文档下载权限控制&#xff1f; 在企业知识管理日益强调数据安全与合规性的今天&#xff0c;越来越多组织开始将智能问答系统从云端迁移至本地部署。这一趋势的背后&#xff0c;是对敏感信息外泄风险的警惕——当合同、财报或内部制度文档被上传到第三…

作者头像 李华
网站建设 2026/7/1 3:22:36

Langchain-Chatchat问答系统灰度期间用户权限分配

Langchain-Chatchat问答系统灰度期间用户权限分配 在企业智能化转型的浪潮中&#xff0c;一个现实而棘手的问题日益凸显&#xff1a;如何让员工快速获取分散在成百上千份文档中的内部政策信息&#xff1f;传统方式依赖人工查找或集中培训&#xff0c;效率低、成本高。而将这些敏…

作者头像 李华
网站建设 2026/6/27 0:34:53

Langchain-Chatchat结合Jaeger实现分布式追踪

Langchain-Chatchat 结合 Jaeger 实现分布式追踪 在企业级 AI 应用日益复杂的今天&#xff0c;一个看似简单的“提问-回答”背后&#xff0c;往往隐藏着数十个模块的协同工作。以本地知识库问答系统为例&#xff0c;从 PDF 解析到文本切片、向量化、检索再到大模型生成答案&…

作者头像 李华
网站建设 2026/6/30 6:30:21

AST反混淆插件|去控制流前if语句转三目表达式

关注它&#xff0c;不迷路。本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01;1.还原场景为使用九大节点合并算法工具做的一些准备工作。2.遍历的节点类型&quo…

作者头像 李华