实际业务中,客户提出了一个超时自动审批的需求,即当一个任务在一个节点停留了${var}时间后,需要自动将流程给审批了(定时器事件触发后,模拟将任务执行完成,之后还按照原来的流程走向执行(即boundarytimer的Cancel Activity设置为false,流程图中的表现形式为”虚线时钟”))。
然而在使用过程中,监听不到 给boundarytimer配置了ExecutionListener的start和end事件!
不知道是使用方式有问题,还是如何,被卡在这个地方卡了许久,都没有实现需求,如果有知道正确使用的同学,可以留言分享学习一下。
方法一
于是采用了一个间接实现的方法,流程图如下:
这种方式的处理思路就是,给”超时自动审批”flow绑定一个take事件,当take事件触发时,模拟将任务给处理掉,绑定的listener代码如下:
@Service("flowTakeAutoComplete")
public class FlowTakeAutoCompleteListener implements ExecutionListener {
@Autowired
private TaskService taskService;
@Override
public void notify(DelegateExecution execution) throws Exception {
String processKey = execution.getProcessDefinitionId().split(":")[0];
String activityId = execution.getCurrentActivityId();
String procInstId = execution.getProcessInstanceId();
List<Task> taskList = taskService.createTaskQuery().processInstanceId(procInstId).taskDefinitionKey(activityId).list();
taskList.stream().forEach((Task t) -> {
String taskId = t.getId();
String assignee = t.getAssignee();
//如果任务没有“认领”,默认第一个人认领
if (Objects.isNull(assignee)) {
List<IdentityLink> identityLinkList = taskService.getIdentityLinksForTask(taskId);
if(identityLinkList != null && identityLinkList.size() > 0) {
taskService.claim(taskId,identityLinkList.get(0).getUserId());
}
}
//自动完成
taskService.complete(taskId);
});
}
}
方法二
给流程定义增加一个全局的事件监听,用来监听定时任务job的TIME_FIRE事件,流程如如下:
流程定义xml片段如下:
<process id="boundarytimerLeave" name="boundarytimerLeave" isExecutable="true">
<extensionElements>
<activiti:eventListener events="TIMER_FIRED" entityType="job" delegateExpression="${jobTimeFiredAutoCompleteListener}"></activiti:eventListener>
</extensionElements>
............省略.......
监听listener的java代码如下:
public class JobTimeFiredAutoCompleteListener implements ActivitiEventListener {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Override
public void onEvent(ActivitiEvent event) {
switch (event.getType()){
case TIMER_FIRED:
String procInstId = event.getProcessInstanceId();
List<String> activitiIds = runtimeService.getActiveActivityIds(event.getExecutionId());
List<Task> taskList = taskService.createTaskQuery().processInstanceId(procInstId).taskDefinitionKey(activitiIds.get(0)).list();
taskList.stream().forEach((Task t)-> {
String taskId = t.getId();
String assignee = t.getAssignee();
//如果任务没有“认领”,默认第一个人认领
if (Objects.isNull(assignee)) {
List<IdentityLink> identityLinkList = taskService.getIdentityLinksForTask(taskId);
if(identityLinkList != null && identityLinkList.size() > 0) {
taskService.claim(taskId,identityLinkList.get(0).getUserId());
}
}
//自动完成
taskService.complete(taskId);
});
break;
default:
}
}
@Override
public boolean isFailOnException() {
return false;
}
}