Camunda调整定时任务时间

项目场景:

流程挂起时,不计算超时时间(不发送超时提醒),


解决方案

超时提醒是通过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延长执行时间,加上挂起中的那段时长,一般有如下几种场景

  1. 挂起的过程中到期:到期时间-挂起开始时间
  2. 挂起后到期:恢复时间-挂起开始时间

延长任务时间的代码如下

            // 获取流程引擎
			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()));
				
			}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值