Activiti 定时任务 定时边界事件 超时自动审批

您所在的位置:网站首页 悦刻烟弹如何分辨真假 Activiti 定时任务 定时边界事件 超时自动审批

Activiti 定时任务 定时边界事件 超时自动审批

2023-09-02 17:59| 来源: 网络整理| 查看: 265

背景 测试案例:1. 更新配置文件2. 设置流程图3. 测试用例4. 结果5. BPMN文件内容

背景: 项目中用到工作流,其中有一个需求是,市民通过公众号上报事件,然后流程往下走,最后会回到上报人手中,但是由于是公众号,上报人可能上报之后就不关心之后怎么样了;如果市民最后没有确认流程,那么流程就不会结束;到最后会影响报表的数据;

现在这个需求需要改成:当案件回到上报人之后,如果上报人在三天之内没有处理这个案件,系统就把这个案件自动结束;

测试案例: a) 张三提交请假单 b) 经理审批请假单。流程回到张三手中 c) 张三审批流程;如果超时则自动审批 1. 更新配置文件

如果是SSM项目,配置文件中添加

如果是SpringBoot项目 ,在配置文件中添加此配置

spring: activiti: job-executor-activate: true 2. 设置流程图

流程图配置 PT1M:一分钟之后,如果未处理,则自动审批;

S表示秒,M表示分,D表示天;P表示时间段,T表示精确到时间的时间段;

timeDuration。指定定时器之前要等待多长时间。 使用ISO 8601规定的格式 (由BPMN 2.0规定)。 P1D:代表1天后执行此时间定时器。 P1H:代表1小时后执行此时间定时器。 P1M:代表1分钟后执行此时间定时器。 PT1M:代表1分钟后执行此时间定时器。

3. 测试用例 /** * 超时自动结束测试 */ @Test public void timeOutAutoEndTest() throws InterruptedException { String procDefKey = "user_leave_now"; // 流程定义ID // 设置参数 Map vars = new HashMap(); vars.put("applyUserId","zhangsan"); vars.put("manager","manager"); vars.put("title", "超时未审批请假流程测试"); //用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中 identityService.setAuthenticatedUserId(String.valueOf(6)); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(procDefKey, "business_leavebu_leave:8", vars); String id1 = processInstance.getId(); // 流程启动实例ID System.out.println("流程启动后的实例ID 是 " + id1); // 查询待签收任务 // 指定任务办理者 String assignee = "manager"; List list1 = taskService.createTaskQuery().taskCandidateUser(assignee).includeProcessVariables().active().orderByTaskCreateTime().desc().list(); System.out.println("*******************待签收任务************************"); for (Task task : list1) { System.out.println("任务ID 是 " + task.getId()); System.out.println("任务name 是 " + task.getName()); System.out.println("任务Assignee 是 " + task.getAssignee()); System.out.println("任务ProcessInstanceId 是 " + task.getProcessInstanceId()); } System.out.println("*******************待签收任务************************"); // 签收任务 Task task = list1.get(0); String taskId = task.getId(); taskService.claim(taskId, assignee); System.out.println("*******************待签收任务已经签收************************"); String procInsId =task.getProcessInstanceId() ; String comment = "生六胎"; // 设置审批消息 taskService.addComment(taskId,procInsId,comment); Map vars1 = new HashMap(); vars1.put("title","经理已经审批"); // 提交任务 taskService.complete(taskId, vars); System.out.println("*******************待签收任务经理已经审批************************"); System.out.println("当前处理任务名称:" + task.getName()); System.out.println("睡眠70秒==================="); Thread.sleep(70*1000); // 查询待签收任务 // 指定任务办理者 String zhangsan = "zhangsan"; List listZhangsan = taskService.createTaskQuery().taskCandidateUser(zhangsan).includeProcessVariables().active().orderByTaskCreateTime().desc().list(); System.out.println("*******************张三的待签收任务************************"); System.out.println("*******************待签收任务************************"); for (Task taskZ : listZhangsan) { System.out.println("任务ID 是 " + taskZ.getId()); System.out.println("任务name 是 " + taskZ.getName()); System.out.println("任务Assignee 是 " + taskZ.getAssignee()); System.out.println("任务ProcessInstanceId 是 " + taskZ.getProcessInstanceId()); } System.out.println("*******************待签收任务************************"); ProcessInstance processInstanceStatus = processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(procInsId).singleResult(); if(processInstanceStatus != null){ System.out.println("流程未结束************************"); System.out.println("流程进行Name:"+ processInstanceStatus.getName()); System.out.println("流程进行getActivityId:"+ processInstanceStatus.getActivityId()); }else{ System.out.println("流程已经结束************************"); } }

在测试用例睡眠70秒的运行中,在数据库会产生数据分别如下;但是超时之后,数据会被删除; act_ru_execution产生的数据 act_ru_job产生的数据

4. 结果 测试用例执行之后,再去查表数据,会发现流程已经结束;

流程结束样例图片

5. BPMN文件内容 用户提交请假单-- PT1M


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3