项目场景:
流程挂起时,不计算超时时间(不发送超时提醒),
解决方案
超时提醒是通过Camunda的Job来进行发送的,那么需要在挂起的时候,去取消定时任务,等恢复的时候,加上挂起的那段时长,来延长定时任务的执行时间。
经过验证后,发现当流程挂起时,相应的job会同时挂起,这一步无需进行特殊处理。如果想在工单不挂起的情况下,单独去对job进行挂起或者恢复,可以用以下代码
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取运行时服务
ManagementService managementService = processEngine.getManagementService();
// 查询计时器作业
JobQuery jobQuery = processEngine.getManagementService().createJobQuery();
//根据流程实例id来进行查找
String processInstanceId = task.getProcessInstanceId();
//jobQuery.executionId(task.getExecutionId());
jobQuery.processInstanceId(processInstanceId );
// 所有找到的作业
List<Job> jobs = jobQuery.list();
for (Job job : jobs) {
TimerEntity timerEntity = (TimerEntity)job;
//超时提醒的。这个是自己设置的,可以忽略这个判断条件
if ("userTaskOverdueJob".equals(timerEntity.getJobHandlerType())){
//挂起Job
managementService.suspendJobById(job.getId());
//恢复Job
//managementService.activateJobById(job.getId());
}
}
如果你使用了如下代码对工单进行了挂起,那么就无需自己去挂起任务,任务会同步挂起,并在你恢复工单的时候同步恢复,如果已经过了执行时间,那么会立即执行。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//根据流程实例id进行挂起工单
processEngine.getRuntimeService().suspendProcessInstanceById(id);
//根据流程实例id恢复工单
//processEngine.getRuntimeService().activateProcessInstanceById(id);
我们的业务场景,是要在挂起恢复的时候,给Job延长执行时间,加上挂起中的那段时长,一般有如下几种场景
- 挂起的过程中到期:到期时间-挂起开始时间
- 挂起后到期:恢复时间-挂起开始时间
延长任务时间的代码如下
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//根据流程实例id获取任务
List<Task> taskList = processEngine .getTaskService().createTaskQuery().processInstanceId(id).list();
Task task = taskList.get(0);
//修改节点到期时间--这里根据业务需要看是否要加
task.setDueDate(DateUtil.getDateAddMin(task.getDueDate(),Long.valueOf(min).intValue()));
taskService.saveTask(task);
// 获取运行时服务
ManagementService managementService = processEngine.getManagementService();
// 查询计时器作业
JobQuery jobQuery = processEngine.getManagementService().createJobQuery();
// 假设我们要暂停与特定流程实例相关的计时器
String processInstanceId = task.getProcessInstanceId();
//jobQuery.executionId(task.getExecutionId());
jobQuery.processInstanceId(processInstanceId );;
// 所有找到的作业
List<Job> jobs = jobQuery.list();
for (Job job : jobs) {
//业务逻辑
....
//延长job时间
managementService.setJobDuedate(job.getId(), DateUtil.getDateAddMin(task.getDueDate(),Long.valueOf(min).intValue()));
}