2.Apache Dolphinscheduler 删除工作流实例 提示 删除工作流实例错误

一、问题描述

操作步骤

  1. 登录dolphinshceduler
  2. 点击项目管理
  3. 点击要操作的项目名
  4. 点击工作流实例
  5. 点击删除按钮
  6. 点击确认
    avatar
    报错:删除工作流实例错误

二、解决

1.删除过程源码

avatar

请求头里的url包括的关键字,instance/delete,对应的接口是ProcessInstanceController类的deleteProcessInstanceById(),这个方法里通常不会有什么,再往下看service

调用的是ProcessInstanceService类的deleteProcessInstanceById()

/**
     * delete process instance by id, at the same time,delete task instance and their mapping relation data
     * @param loginUser login user
     * @param projectName project name
     * @param processInstanceId process instance id
     * @return delete result code
     */
    @Transactional(rollbackFor = Exception.class)
    public Map<String, Object> deleteProcessInstanceById(User loginUser, String projectName, Integer processInstanceId) {
    
    

        Map<String, Object> result = new HashMap<>(5);
        Project project = projectMapper.queryByName(projectName);

        Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName);
        Status resultEnum = (Status) checkResult.get(Constants.STATUS);
        if (resultEnum != Status.SUCCESS) {
    
    
            return checkResult;
        }
        ProcessInstance processInstance = processService.findProcessInstanceDetailById(processInstanceId);
        List<TaskInstance> taskInstanceList = processService.findValidTaskListByProcessId(processInstanceId);

        if (null == processInstance) {
    
    
            putMsg(result, Status.PROCESS_INSTANCE_NOT_EXIST, processInstanceId);
            return result;
        }



        // delete database cascade
        int delete = processService.deleteWorkProcessInstanceById(processInstanceId);
        processService.deleteAllSubWorkProcessByParentId(processInstanceId);
        processService.deleteWorkProcessMapByParentId(processInstanceId);

        if (delete > 0) {
    
    
            putMsg(result, Status.SUCCESS);
        } else {
    
    
            putMsg(result, Status.DELETE_PROCESS_INSTANCE_BY_ID_ERROR);
        }

        return result;
    }

从源码来看做了几件事

  1. 验证权限
  2. 判断工作流实例是否存在
  3. 存在则删除

接下来调用的是jpa的mapper的delete方法,先根据工作流实例删除子流程,再删除工作流实例

2.排查mysql

1 根据ProcessInstance对象找到了对应的表名

工作流实例
表名:t_ds_process_instance

在这里插入图片描述
子工作流实例表名和工作流实例表名一样,猜想is_sub_process字段为1是子流程,否则不是子流程

2 尝试用sql直接删一下

删除子工作流实例
上面请求里的参数里就有一个删除报错的id=37360
avatardelete from dolphinscheduler.t_ds_process_instance where id = 37360;

正在看的时候,突然遇到之前遇到过的任务排队等待问题,重启dolphin和zookeeper后,本问题消失了,已经可以删除了,问题未能重现,活太多就不深究了。

猜想:可能是某个服务的线程数达到上限,导致处理删除的任务没有线程去执行。已经占用了zookeeper分布式锁的,导致新的删除操作无法执行。

猜你喜欢

转载自blog.csdn.net/qq_39945938/article/details/109445548