activiti-超时自动审批

实际业务中,客户提出了一个超时自动审批的需求,即当一个任务在一个节点停留了${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;
    }
}

猜你喜欢

转载自blog.csdn.net/it_freshman/article/details/79481697