news 2026/1/21 0:41:43

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/1/8 23:35:51

荣获年度十大成果,电科金仓亮相光合组织首届人工智能创新大会

12月18日&#xff0c;首届光合组织人工智能创新大会&#xff08;HAIC2025&#xff09;在昆山国际会展中心举办。大会以“智算无界&#xff0c;光合共生”为主题&#xff0c;汇聚全产业链超2500家企业代表、专家学者及行业领袖&#xff0c;全景呈现中国AI计算开放架构的创新实践…

作者头像 李华
网站建设 2026/1/16 17:41:48

Langchain-Chatchat能否支持文档预览功能?

Langchain-Chatchat能否支持文档预览功能&#xff1f; 在企业级知识管理系统中&#xff0c;用户常常不满足于“AI给出一个答案”——他们更关心&#xff1a;“这个答案从哪来的&#xff1f;”“能不能让我看看原文&#xff1f;”这种对可解释性与溯源能力的诉求&#xff0c;正…

作者头像 李华
网站建设 2026/1/17 5:23:32

Langchain-Chatchat能否支持文档权限继承?

Langchain-Chatchat能否支持文档权限继承&#xff1f; 在企业知识管理系统逐渐从“能查”迈向“安全可控”的今天&#xff0c;一个看似简单却至关重要的问题浮出水面&#xff1a;Langchain-Chatchat 能否支持文档权限继承&#xff1f; 这个问题背后&#xff0c;其实是对本地化大…

作者头像 李华
网站建设 2026/1/15 1:20:14

Langchain-Chatchat文档解析任务调度算法优化

Langchain-Chatchat文档解析任务调度算法优化 在企业级智能问答系统的落地实践中&#xff0c;一个常被忽视却至关重要的环节悄然浮现&#xff1a;当用户上传几十份PDF、Word和Excel文件时&#xff0c;系统能否在合理时间内完成解析&#xff1f;更关键的是——这些任务是以何种方…

作者头像 李华
网站建设 2025/12/20 1:08:46

Langchain-Chatchat问答系统灰度期间知识库变更记录

Langchain-Chatchat 问答系统灰度期间知识库变更实践 在企业数字化转型的浪潮中&#xff0c;如何让沉睡在 PDF、Word 和内部文档中的知识“活”起来&#xff0c;正成为智能办公的关键命题。尤其是在金融、医疗、政务等对数据安全高度敏感的行业&#xff0c;传统依赖云端大模型的…

作者头像 李华
网站建设 2025/12/20 1:08:12

Langchain-Chatchat问答系统灰度期间宣传推广计划

Langchain-Chatchat问答系统灰度期间宣传推广计划 在企业知识管理日益复杂的今天&#xff0c;一个普遍的痛点正困扰着众多组织&#xff1a;关键制度、技术文档散落在各个部门的共享盘和员工电脑中&#xff0c;新人入职靠“口传心授”&#xff0c;老员工离职导致经验流失&#x…

作者头像 李华