2026/1/9 12:24:01
网站建设
项目流程
重庆网站公司,网站建设 笔记,网站集约化建设 技术,苏州网站设计公司排名文章目录1、概念解释2、启动流程实例3、操作数据库表4、查询流程实例5、关联BusinessKey6、挂起、激活流程实例6.1、全部流程实例挂起6.2、单个流程实例挂起1、概念解释
流程实例#xff08;ProcessInstance#xff09;代表流程定义的执行实例。
一个流程实例包括了所有的运…文章目录1、概念解释2、启动流程实例3、操作数据库表4、查询流程实例5、关联BusinessKey6、挂起、激活流程实例6.1、全部流程实例挂起6.2、单个流程实例挂起1、概念解释流程实例ProcessInstance代表流程定义的执行实例。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。例如用户或程序按照流程定义内容发起一个流程这就是一个流程实例。流程定义和流程实例的图解2、启动流程实例启动流程实例 并添加Businesskey业务标识流程定义部署在activiti后就可以在系统中通过activiti去管理该流程的执行执行流程表示流程的一次执行。比如部署系统出差流程后如果某用户要申请出差这时就需要执行这个流程如果另外一个用户也要申请出差则也需要执行该流程每个执行互不影响每个执行是单独的流程实例。启动流程实例时指定的businesskey就会在act_ru_execution #流程实例的执行表中存储businesskey。Businesskey业务标识通常为业务表的主键业务标识和流程实例一一对应。业务标识来源于业务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据。比如出差流程启动一个流程实例就可以将出差单的id作为业务标识存储到activiti中将来查询activiti的流程实例信息就可以获取出差单的id从而关联查询业务系统数据库得到出差单信息。/** * 启动流程实例添加businessKey */TestpublicvoidaddBusinessKey(){// 1、得到ProcessEngineProcessEngineprocessEngineProcessEngines.getDefaultProcessEngine();// 2、得到RunTimeServiceRuntimeServiceruntimeServiceprocessEngine.getRuntimeService();// 3、启动流程实例同时还要指定业务标识businessKey也就是出差申请单id这里是1001ProcessInstanceprocessInstanceruntimeService.startProcessInstanceByKey(myEvection,1001);// 4、输出processInstance相关属性System.out.println(业务idprocessInstance.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(){// 流程定义keyStringprocessDefinitionKeyevection;ProcessEngineprocessEngineProcessEngines.getDefaultProcessEngine();// 获取RunTimeServiceRuntimeServiceruntimeServiceprocessEngine.getRuntimeService();ListProcessInstancelistruntimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey)//.list();for(ProcessInstanceprocessInstance:list){System.out.println(----------------------------);System.out.println(流程实例idprocessInstance.getProcessInstanceId());System.out.println(所属流程定义idprocessInstance.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去查询更多的请假信息出差人出差时间出差天数出差目的地等StringbusinessKeyprocessInstance.getBusinessKey();在activiti的act_ru_execution表字段BUSINESS_KEY就是存放业务KEY的。6、挂起、激活流程实例某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除流程暂停后将不会继续执行。6.1、全部流程实例挂起操作流程定义为挂起状态该流程定义下边所有的流程实例全部暂停流程定义为挂起状态该流程定义将不允许启动新的流程实例同时该流程定义下所有的流程实例将全部挂起暂停执行。/** * 全部流程实例挂起与激活 */TestpublicvoidSuspendAllProcessInstance(){// 获取processEngineProcessEngineprocessEngineProcessEngines.getDefaultProcessEngine();// 获取repositoryServiceRepositoryServicerepositoryServiceprocessEngine.getRepositoryService();// 查询流程定义的对象ProcessDefinitionprocessDefinitionrepositoryService.createProcessDefinitionQuery().processDefinitionKey(myEvection).singleResult();// 得到当前流程定义的实例是否都为暂停状态booleansuspendedprocessDefinition.isSuspended();// 流程定义idStringprocessDefinitionIdprocessDefinition.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(){// 获取processEngineProcessEngineprocessEngineProcessEngines.getDefaultProcessEngine();// RuntimeServiceRuntimeServiceruntimeServiceprocessEngine.getRuntimeService();// 查询流程定义的对象ProcessInstanceprocessInstanceruntimeService.createProcessInstanceQuery().processInstanceId(15001).singleResult();// 得到当前流程定义的实例是否都为暂停状态booleansuspendedprocessInstance.isSuspended();// 流程定义idStringprocessDefinitionIdprocessInstance.getId();// 判断是否为暂停if(suspended){// 如果是暂停可以执行激活操作 ,参数流程定义idruntimeService.activateProcessInstanceById(processDefinitionId);System.out.println(流程定义processDefinitionId,已激活);}else{// 如果是激活状态可以暂停参数流程定义idruntimeService.suspendProcessInstanceById(processDefinitionId);System.out.println(流程定义processDefinitionId,已挂起);}}/** * 测试完成个人任务 */TestpublicvoidcompletTask(){// 获取引擎ProcessEngineprocessEngineProcessEngines.getDefaultProcessEngine();// 获取操作任务的服务 TaskServiceTaskServicetaskServiceprocessEngine.getTaskService();// 完成任务,参数流程实例id,完成zhangsan的任务TasktasktaskService.createTaskQuery().processInstanceId(15001).taskAssignee(rose).singleResult();System.out.println(流程实例idtask.getProcessInstanceId());System.out.println(任务Idtask.getId());System.out.println(任务负责人task.getAssignee());System.out.println(任务名称task.getName());taskService.complete(task.getId());}“人的一生会经历很多痛苦但回头想想都是传奇”。