news 2026/7/7 20:23:47

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/7 10:18:26

Langchain-Chatchat文档解析任务资源动态伸缩

Langchain-Chatchat文档解析任务资源动态伸缩 在企业知识系统日益复杂的今天&#xff0c;一个常见的场景是&#xff1a;每到新员工入职季&#xff0c;HR 部门集中上传数百份制度文件&#xff0c;系统瞬间面临巨大解析压力&#xff1b;而平日里&#xff0c;文档更新频率极低&…

作者头像 李华
网站建设 2026/7/7 7:16:37

Langchain-Chatchat结合Kibana进行日志分析

Langchain-Chatchat 结合 Kibana 进行日志分析 在企业级 AI 应用落地的过程中&#xff0c;一个常被忽视但至关重要的环节是&#xff1a;系统如何“说话”&#xff1f; 这里的“说话”&#xff0c;不是指模型生成的回答&#xff0c;而是系统的自我表达——它的运行状态、用户行为…

作者头像 李华
网站建设 2026/7/7 20:30:01

Langchain-Chatchat文档解析任务失败重试机制

Langchain-Chatchat文档解析任务失败重试机制 在企业级知识库系统日益普及的今天&#xff0c;一个常见的痛点浮出水面&#xff1a;用户上传了几十份PDF技术手册&#xff0c;点击“导入”&#xff0c;结果半小时后提示“部分文件解析失败”。刷新重试&#xff1f;手动逐个排查&a…

作者头像 李华
网站建设 2026/7/7 0:09:31

AI量化交易闭环实战:策略研发、智能风控与执行优化一体化

【摘要】构建从数据到决策、从执行到反馈的AI量化交易闭环&#xff0c;是实现系统化、可持续Alpha的核心。这套体系强调工程实践与动态迭代&#xff0c;而非依赖单一预测模型。引言在金融科技领域&#xff0c;人工智能&#xff08;AI&#xff09;与量化交易的结合早已不是新鲜话…

作者头像 李华
网站建设 2026/7/7 7:12:22

Langchain-Chatchat文档解析任务依赖关系处理

Langchain-Chatchat文档解析任务依赖关系处理 在企业知识管理日益智能化的今天&#xff0c;如何让堆积如山的PDF、Word和TXT文档“活起来”&#xff0c;成为AI可理解、能检索的知识资产&#xff0c;是许多组织面临的现实挑战。尤其是金融、医疗、法律等高合规性行业&#xff0c…

作者头像 李华