From 58c743a88969dd44e957117e70591fc10db991ff Mon Sep 17 00:00:00 2001 From: "jieying.li" Date: Wed, 11 Dec 2024 19:28:32 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E6=89=A7=E8=A1=8C=E8=AE=A1?= =?UTF-8?q?=E5=88=92=201.=E4=BB=BB=E5=8A=A1=E6=89=B9=E9=87=8F=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E7=9A=84=E9=80=BB=E8=BE=91=E6=B7=BB=E5=8A=A0=E9=94=81?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=8E=A7=E5=88=B6=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AtuPlanTaskApiServiceImpl.java | 493 +++++++++--------- .../executePlan/constants/RedisConstant.java | 5 + .../executePlan/exception/ExecPlanError.java | 2 + 3 files changed, 261 insertions(+), 239 deletions(-) diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java index cddeef3..001890b 100644 --- a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/api/service/AtuPlanTaskApiServiceImpl.java @@ -74,6 +74,7 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.integration.redis.util.RedisLockRegistry; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -82,6 +83,7 @@ import org.springframework.web.client.RestTemplate; import java.io.*; import java.time.LocalDate; import java.util.*; +import java.util.concurrent.locks.Lock; import java.util.function.Function; import java.util.stream.Collectors; @@ -148,6 +150,9 @@ public class AtuPlanTaskApiServiceImpl extends AbstractExcelService @Autowired private AttachmentFeignClient attachmentFeignClient; + @Autowired + private RedisLockRegistry redisLockRegistry; + @Value("${zmn.hostStr}") private String hostStr; @@ -1477,264 +1482,274 @@ public class AtuPlanTaskApiServiceImpl extends AbstractExcelService PlanConstant.BATCH_EXECUTING_STATUS.equals(planBatch.getStatus())) { throw new PlatformRuntimeException(ExecPlanError.BATCH_NOT_FINISH); } - logger.debug("根据批次编号[{}]查询计划信息", firstFailTask.getBatchId()); - AtuPlanInfo planInfo = atuPlanInfoApiService.findByBatchId(firstFailTask.getBatchId()); - if (planInfo == null) { - throw new PlatformRuntimeException(ExecPlanError.PLAN_IS_NULL); + // 加个锁,当选择的任务量比较多的时候,需要时间进行处理 + Lock lock = redisLockRegistry.obtain(String.format("%s%s", RedisConstant.PLAN_BATCH_RETRY_LOCK_PRE, planBatch.getId())); + if (!lock.tryLock()) { + // 获取不到锁,正在处理重试 + throw new PlatformRuntimeException(ExecPlanError.BATCH_IS_DEALING_WITH_RETRY); } + try { + logger.debug("根据批次编号[{}]查询计划信息", firstFailTask.getBatchId()); + AtuPlanInfo planInfo = atuPlanInfoApiService.findByBatchId(firstFailTask.getBatchId()); + if (planInfo == null) { + throw new PlatformRuntimeException(ExecPlanError.PLAN_IS_NULL); + } - logger.debug("更新计划和批次状态"); - String planStatus = ""; - if (planBatch.getTaskTotal() > retryDto.getTaskIdList().size()) { - logger.debug("部分任务重试,批次状态为:{},计划状态为:{}", PlanConstant.BATCH_EXECUTING_STATUS, - PlanConstant.PLAN_EXECUTING_STATUS); - planBatch.setStatus(PlanConstant.BATCH_EXECUTING_STATUS); - planStatus = PlanConstant.PLAN_EXECUTING_STATUS; - } else { - logger.debug("全部任务重试,批次状态为:{},计划状态为:{}", PlanConstant.BATCH_WAITING_STATUS, - PlanConstant.PLAN_WAITING_STATUS); - planBatch.setStatus(PlanConstant.BATCH_WAITING_STATUS); - planStatus = PlanConstant.PLAN_WAITING_STATUS; - } - List deletedFilePath = new ArrayList<>(); - List taskIds = new ArrayList<>(); - planTaskList.forEach(task -> { - logger.info("普通脚本任务id:{},执行结果文件:{}", task.getId(), task.getExecResultFile()); - taskIds.add(task.getId()); - String execResultFile = task.getExecResultFile(); - if (StringUtils.isNotBlank(execResultFile)){ - deletedFilePath.add(execResultFile); - getActualImagePath(deletedFilePath, execResultFile); + logger.debug("更新计划和批次状态"); + String planStatus = ""; + if (planBatch.getTaskTotal() > retryDto.getTaskIdList().size()) { + logger.debug("部分任务重试,批次状态为:{},计划状态为:{}", PlanConstant.BATCH_EXECUTING_STATUS, + PlanConstant.PLAN_EXECUTING_STATUS); + planBatch.setStatus(PlanConstant.BATCH_EXECUTING_STATUS); + planStatus = PlanConstant.PLAN_EXECUTING_STATUS; + } else { + logger.debug("全部任务重试,批次状态为:{},计划状态为:{}", PlanConstant.BATCH_WAITING_STATUS, + PlanConstant.PLAN_WAITING_STATUS); + planBatch.setStatus(PlanConstant.BATCH_WAITING_STATUS); + planStatus = PlanConstant.PLAN_WAITING_STATUS; } - String perDataPath = task.getPerDataPath(); - if (StringUtils.isNotBlank(perDataPath)) { - deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); - } - String videoUrl = task.getVideoUrl(); - if (StringUtils.isNotBlank(videoUrl)) { - deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); - } - // 场景用例脚本json是单独的需要删除 - if (task.getCaseType().equals("5")) { - deletedFilePath.add("/" + MinioPathUtils.idToPath(task.getScriptJson())[1]); - } - }); - if (!CollectionUtils.isEmpty(taskIds)) { - List atuPlanSceneCaseTaskList = atuPlanSceneCaseTaskService.querySceneCaseTasksByTaskIds(taskIds); - atuPlanSceneCaseTaskList.forEach(atuPlanSceneCaseTask -> { - logger.info("场景任务id:{},节点任务id:{},执行结果文件:{}", atuPlanSceneCaseTask.getTaskId(),atuPlanSceneCaseTask.getId(), atuPlanSceneCaseTask.getExecResultFile()); - String videoUrl = atuPlanSceneCaseTask.getVideoUrl(); - if (StringUtils.isNotBlank(videoUrl)) { - deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); - } - String perDataPath = atuPlanSceneCaseTask.getPerDataPath(); - if (StringUtils.isNotBlank(perDataPath)) { - deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); - } - String execResultFile = atuPlanSceneCaseTask.getExecResultFile(); - if (StringUtils.isNotBlank(execResultFile)) { + List deletedFilePath = new ArrayList<>(); + List taskIds = new ArrayList<>(); + planTaskList.forEach(task -> { + logger.info("普通脚本任务id:{},执行结果文件:{}", task.getId(), task.getExecResultFile()); + taskIds.add(task.getId()); + String execResultFile = task.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)){ deletedFilePath.add(execResultFile); getActualImagePath(deletedFilePath, execResultFile); } + String perDataPath = task.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String videoUrl = task.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); + } + // 场景用例脚本json是单独的需要删除 + if (task.getCaseType().equals("5")) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(task.getScriptJson())[1]); + } }); - } - if (!CollectionUtils.isEmpty(deletedFilePath)) { - AssociatedFilesDto associatedFilesDto = new AssociatedFilesDto(); - associatedFilesDto.setObjId("-1"); - associatedFilesDto.setFileIds(deletedFilePath); - attachmentFeignClient.associatedFiles(associatedFilesDto); - } - planBatchApiService.updateByEntity(planBatch); - atuPlanInfoApiService.updateStatusByLastBatchId(planBatch.getId(), planStatus); - - logger.info("查询计划数据集中未被选择的意图数据"); - Set scriptIdSet = new HashSet<>(); - Map> envScriptMap = new HashMap<>(); - Map> envScriptTaskMap = new HashMap<>(); - List taskIdList = new ArrayList<>(); - for (AtuPlanTask planTask : planTaskList) { - taskIdList.add(planTask.getId()); - scriptIdSet.add(planTask.getScriptId()); - List scriptIdList = new ArrayList<>(); - if (envScriptMap.containsKey(planTask.getEnvId())) { - scriptIdList = envScriptMap.get(planTask.getEnvId()); - } - scriptIdList.add(planTask.getScriptId()); - envScriptMap.put(planTask.getEnvId(), scriptIdList); - String key = planTask.getEnvId() + "-" + planTask.getScriptId(); - List envScriptTaskList = new ArrayList<>(); - if (envScriptTaskMap.containsKey(key)) { - envScriptTaskList = envScriptTaskMap.get(key); - } - envScriptTaskList.add(planTask); - envScriptTaskMap.put(key, envScriptTaskList); - } - logger.debug("获取最新的输入项数据"); - Map taskParamsMap = getRetryTaskInputInfo(envScriptTaskMap, envScriptMap); - logger.debug("最新输入项数据大小:{}", taskParamsMap.size()); - - logger.debug("start 初始化批次缓存数据"); - taskRetryInitCache(taskIdList, planBatch); - logger.debug("end 初始化批次缓存数据"); - - logger.debug("查询脚本最新数据"); - logger.debug("脚本数量:{}", scriptIdSet.size()); - Map scriptMap = queryScriptDetailMap(scriptIdSet); - logger.debug("脚本最新信息数量:{}", scriptMap.size()); - - Map caseTypeMap = new HashMap<>(); - caseTypeMap.put("hasPc", false); - caseTypeMap.put("hasMob", false); - caseTypeMap.put("hasInterface", false); - for (AtuPlanTask planTask : planTaskList) { - String status = planTask.getStatus(); - logger.debug("原任务状态为: {}", status); - // 判断任务是否开始执行 - if (PlanConstant.TASK_WAIT_EXECUTE_STATUS.equals(planTask.getStatus()) || - PlanConstant.TASK_START_EXECUTE_STATUS.equals(planTask.getStatus())) { - throw new PlatformRuntimeException(ExecPlanError.TASK_NOT_FINISH); - } - logger.debug("修改任务脚本为最新脚本信息"); - if (scriptMap.containsKey(planTask.getScriptId())) { - AtuScriptDetailDto atuScriptDetailDto = scriptMap.get(planTask.getScriptId()); - planTask.setVersionId(atuScriptDetailDto.getVersionId()); - planTask.setVersionName(atuScriptDetailDto.getVersionName()); - planTask.setScriptName(atuScriptDetailDto.getScriptName()); - planTask.setScriptJson(atuScriptDetailDto.getScriptPath()); - planTask.setAppId(queryAppId(planInfo.getId(),atuScriptDetailDto.getPlatformType(), - atuScriptDetailDto.getAppPackage(),atuScriptDetailDto.getScriptType())); - } - - logger.debug("生成任务执行信息"); - AtuTaskExecDto taskExecDto = new AtuTaskExecDto(); - BeanUtil.copyProperties(planInfo, taskExecDto); - taskExecDto.setPlanId(planInfo.getId()); - taskExecDto.setFailRetryNum(planInfo.getFailRetryCount()); - taskExecDto.setBatchId(planTask.getBatchId()); - taskExecDto.setTaskId(planTask.getId()); - taskExecDto.setCaseId(planTask.getCaseId()); - taskExecDto.setEnvId(planTask.getEnvId()); - String type = planTask.getCaseType(); - taskExecDto.setCaseType(type); - String scriptPath = planTask.getScriptJson(); - - Map caseParams = new HashMap<>(); - if (taskParamsMap.containsKey(planTask.getId())) { - logger.debug("重试使用新数据"); - caseParams = JSONUtil.toBean(taskParamsMap.get(planTask.getId()), Map.class); - } else { - if (StrUtil.isNotBlank(planTask.getCaseParam())) { - logger.debug("使用旧数据重试"); - caseParams = JSONUtil.toBean(planTask.getCaseParam(), Map.class); - } - } - // 更新静态数据与模糊数据为最新值 - caseParams = this.handleQuoteData(caseParams, planTask.getEnvId(), planInfo.getProjectId()); - planTask.setCaseParam(JSONUtil.toJsonStr(caseParams)); - - String appId = planTask.getAppId(); - AtuSceneNodeExecDto sceneNodeExecDto = null; - - //判断是否场景任务 - if (PlanConstant.SCRIPT_TYPE_SCENE.equals(planTask.getCaseType())) { - // 调用脚本服务获取场景首节点信息,通知脚本服务场景重新发起 - logger.debug("查询场景脚本的首节点信息"); - SceneFirstNodeDto firstNodeDto = new SceneFirstNodeDto(); - firstNodeDto.setTaskId(planTask.getId()); - firstNodeDto.setCaseId(planTask.getCaseId()); - String scriptId = planTask.getScriptId(); - firstNodeDto.setScriptId(scriptId); - firstNodeDto.setParamMap(caseParams); - logger.debug("查询参数 => {}", JSONUtil.toJsonStr(firstNodeDto)); - AtuSceneNodeInfoDto nodeInfo; - try { - ResultWrapper firstNodeResult = publicFeignClient.getFirstNode(firstNodeDto); - if (firstNodeResult.isSuccess() && firstNodeResult.getData() != null) { - logger.debug("首节点信息为 => " + JSONUtil.toJsonStr(firstNodeResult)); - sceneNodeExecDto = firstNodeResult.getData(); - nodeInfo = sceneNodeExecDto.getNodeInfo(); - } else { - throw new RuntimeException("获取场景脚本[ " + scriptId + "]首节点信息异常," + firstNodeResult.getMessage()); + if (!CollectionUtils.isEmpty(taskIds)) { + List atuPlanSceneCaseTaskList = atuPlanSceneCaseTaskService.querySceneCaseTasksByTaskIds(taskIds); + atuPlanSceneCaseTaskList.forEach(atuPlanSceneCaseTask -> { + logger.info("场景任务id:{},节点任务id:{},执行结果文件:{}", atuPlanSceneCaseTask.getTaskId(),atuPlanSceneCaseTask.getId(), atuPlanSceneCaseTask.getExecResultFile()); + String videoUrl = atuPlanSceneCaseTask.getVideoUrl(); + if (StringUtils.isNotBlank(videoUrl)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(videoUrl)[1]); } - } catch (Exception e) { - logger.error("获取场景首节点信息异常", e); - throw new PlatformRuntimeException(ExecPlanError.GET_SCENE_FIRST_NODE_FAIL); + String perDataPath = atuPlanSceneCaseTask.getPerDataPath(); + if (StringUtils.isNotBlank(perDataPath)) { + deletedFilePath.add("/" + MinioPathUtils.idToPath(perDataPath)[1]); + } + String execResultFile = atuPlanSceneCaseTask.getExecResultFile(); + if (StringUtils.isNotBlank(execResultFile)) { + deletedFilePath.add(execResultFile); + getActualImagePath(deletedFilePath, execResultFile); + } + }); + } + if (!CollectionUtils.isEmpty(deletedFilePath)) { + AssociatedFilesDto associatedFilesDto = new AssociatedFilesDto(); + associatedFilesDto.setObjId("-1"); + associatedFilesDto.setFileIds(deletedFilePath); + attachmentFeignClient.associatedFiles(associatedFilesDto); + } + planBatchApiService.updateByEntity(planBatch); + atuPlanInfoApiService.updateStatusByLastBatchId(planBatch.getId(), planStatus); + + logger.info("查询计划数据集中未被选择的意图数据"); + Set scriptIdSet = new HashSet<>(); + Map> envScriptMap = new HashMap<>(); + Map> envScriptTaskMap = new HashMap<>(); + List taskIdList = new ArrayList<>(); + for (AtuPlanTask planTask : planTaskList) { + taskIdList.add(planTask.getId()); + scriptIdSet.add(planTask.getScriptId()); + List scriptIdList = new ArrayList<>(); + if (envScriptMap.containsKey(planTask.getEnvId())) { + scriptIdList = envScriptMap.get(planTask.getEnvId()); } - if (ObjectUtil.isNull(nodeInfo)) { - throw new PlatformRuntimeException(ExecPlanError.SCENE_FIRST_NODE_INFO_IS_NULL); + scriptIdList.add(planTask.getScriptId()); + envScriptMap.put(planTask.getEnvId(), scriptIdList); + String key = planTask.getEnvId() + "-" + planTask.getScriptId(); + List envScriptTaskList = new ArrayList<>(); + if (envScriptTaskMap.containsKey(key)) { + envScriptTaskList = envScriptTaskMap.get(key); + } + envScriptTaskList.add(planTask); + envScriptTaskMap.put(key, envScriptTaskList); + } + logger.debug("获取最新的输入项数据"); + Map taskParamsMap = getRetryTaskInputInfo(envScriptTaskMap, envScriptMap); + logger.debug("最新输入项数据大小:{}", taskParamsMap.size()); + + logger.debug("start 初始化批次缓存数据"); + taskRetryInitCache(taskIdList, planBatch); + logger.debug("end 初始化批次缓存数据"); + + logger.debug("查询脚本最新数据"); + logger.debug("脚本数量:{}", scriptIdSet.size()); + Map scriptMap = queryScriptDetailMap(scriptIdSet); + logger.debug("脚本最新信息数量:{}", scriptMap.size()); + + Map caseTypeMap = new HashMap<>(); + caseTypeMap.put("hasPc", false); + caseTypeMap.put("hasMob", false); + caseTypeMap.put("hasInterface", false); + for (AtuPlanTask planTask : planTaskList) { + String status = planTask.getStatus(); + logger.debug("原任务状态为: {}", status); + // 判断任务是否开始执行 + if (PlanConstant.TASK_WAIT_EXECUTE_STATUS.equals(planTask.getStatus()) || + PlanConstant.TASK_START_EXECUTE_STATUS.equals(planTask.getStatus())) { + throw new PlatformRuntimeException(ExecPlanError.TASK_NOT_FINISH); + } + logger.debug("修改任务脚本为最新脚本信息"); + if (scriptMap.containsKey(planTask.getScriptId())) { + AtuScriptDetailDto atuScriptDetailDto = scriptMap.get(planTask.getScriptId()); + planTask.setVersionId(atuScriptDetailDto.getVersionId()); + planTask.setVersionName(atuScriptDetailDto.getVersionName()); + planTask.setScriptName(atuScriptDetailDto.getScriptName()); + planTask.setScriptJson(atuScriptDetailDto.getScriptPath()); + planTask.setAppId(queryAppId(planInfo.getId(),atuScriptDetailDto.getPlatformType(), + atuScriptDetailDto.getAppPackage(),atuScriptDetailDto.getScriptType())); } - String sceneTaskId = IdUtil.simpleUUID(); - taskExecDto.setTaskId(sceneTaskId); - scriptPath = nodeInfo.getScriptPath(); - caseParams = nodeInfo.getCaseParam(); - appId = queryAppId(taskExecDto.getPlanId(), nodeInfo.getPlatformType(), - nodeInfo.getAppPackage(), nodeInfo.getNodeType()); - type = nodeInfo.getNodeType(); + logger.debug("生成任务执行信息"); + AtuTaskExecDto taskExecDto = new AtuTaskExecDto(); + BeanUtil.copyProperties(planInfo, taskExecDto); + taskExecDto.setPlanId(planInfo.getId()); + taskExecDto.setFailRetryNum(planInfo.getFailRetryCount()); + taskExecDto.setBatchId(planTask.getBatchId()); + taskExecDto.setTaskId(planTask.getId()); + taskExecDto.setCaseId(planTask.getCaseId()); + taskExecDto.setEnvId(planTask.getEnvId()); + String type = planTask.getCaseType(); + taskExecDto.setCaseType(type); + String scriptPath = planTask.getScriptJson(); - logger.debug("清理原节点任务"); - AtuPlanSceneCaseTask deleteParams = new AtuPlanSceneCaseTask(); - deleteParams.setTaskId(planTask.getId()); - int rows = atuPlanSceneCaseTaskService.deleteByExample(deleteParams); + Map caseParams = new HashMap<>(); + if (taskParamsMap.containsKey(planTask.getId())) { + logger.debug("重试使用新数据"); + caseParams = JSONUtil.toBean(taskParamsMap.get(planTask.getId()), Map.class); + } else { + if (StrUtil.isNotBlank(planTask.getCaseParam())) { + logger.debug("使用旧数据重试"); + caseParams = JSONUtil.toBean(planTask.getCaseParam(), Map.class); + } + } + // 更新静态数据与模糊数据为最新值 + caseParams = this.handleQuoteData(caseParams, planTask.getEnvId(), planInfo.getProjectId()); + planTask.setCaseParam(JSONUtil.toJsonStr(caseParams)); + + String appId = planTask.getAppId(); + AtuSceneNodeExecDto sceneNodeExecDto = null; + + //判断是否场景任务 + if (PlanConstant.SCRIPT_TYPE_SCENE.equals(planTask.getCaseType())) { + // 调用脚本服务获取场景首节点信息,通知脚本服务场景重新发起 + logger.debug("查询场景脚本的首节点信息"); + SceneFirstNodeDto firstNodeDto = new SceneFirstNodeDto(); + firstNodeDto.setTaskId(planTask.getId()); + firstNodeDto.setCaseId(planTask.getCaseId()); + String scriptId = planTask.getScriptId(); + firstNodeDto.setScriptId(scriptId); + firstNodeDto.setParamMap(caseParams); + logger.debug("查询参数 => {}", JSONUtil.toJsonStr(firstNodeDto)); + AtuSceneNodeInfoDto nodeInfo; + try { + ResultWrapper firstNodeResult = publicFeignClient.getFirstNode(firstNodeDto); + if (firstNodeResult.isSuccess() && firstNodeResult.getData() != null) { + logger.debug("首节点信息为 => " + JSONUtil.toJsonStr(firstNodeResult)); + sceneNodeExecDto = firstNodeResult.getData(); + nodeInfo = sceneNodeExecDto.getNodeInfo(); + } else { + throw new RuntimeException("获取场景脚本[ " + scriptId + "]首节点信息异常," + firstNodeResult.getMessage()); + } + } catch (Exception e) { + logger.error("获取场景首节点信息异常", e); + throw new PlatformRuntimeException(ExecPlanError.GET_SCENE_FIRST_NODE_FAIL); + } + if (ObjectUtil.isNull(nodeInfo)) { + throw new PlatformRuntimeException(ExecPlanError.SCENE_FIRST_NODE_INFO_IS_NULL); + } + + String sceneTaskId = IdUtil.simpleUUID(); + taskExecDto.setTaskId(sceneTaskId); + scriptPath = nodeInfo.getScriptPath(); + caseParams = nodeInfo.getCaseParam(); + appId = queryAppId(taskExecDto.getPlanId(), nodeInfo.getPlatformType(), + nodeInfo.getAppPackage(), nodeInfo.getNodeType()); + type = nodeInfo.getNodeType(); + + logger.debug("清理原节点任务"); + AtuPlanSceneCaseTask deleteParams = new AtuPlanSceneCaseTask(); + deleteParams.setTaskId(planTask.getId()); + int rows = atuPlanSceneCaseTaskService.deleteByExample(deleteParams); + if (rows <= 0) { + logger.error("清理原场景节点任务失败"); + throw new PlatformRuntimeException(ExecPlanError.CLEAR_SCENE_NODE_TASK_FAIL); + } + logger.debug("插入新节点任务"); + AtuPlanSceneCaseTask planSceneCaseTask = new AtuPlanSceneCaseTask(); + planSceneCaseTask.setId(sceneTaskId); + planSceneCaseTask.setTaskId(planTask.getId()); + planSceneCaseTask.setScriptId(nodeInfo.getScriptId()); + planSceneCaseTask.setVersionId(nodeInfo.getVersionId()); + planSceneCaseTask.setVersionName(nodeInfo.getVersionName()); + planSceneCaseTask.setScriptName(nodeInfo.getScriptName()); + planSceneCaseTask.setScriptJson(nodeInfo.getScriptPath()); + planSceneCaseTask.setNodeId(nodeInfo.getNodeId()); + planSceneCaseTask.setNodeType(nodeInfo.getNodeType()); + if (CollUtil.isNotEmpty(nodeInfo.getCaseParam())) { + planSceneCaseTask.setNodeParams(JSONUtil.toJsonStr(nodeInfo.getCaseParam())); + } + planSceneCaseTask.setCreatedTime(new Date()); + planSceneCaseTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); + planSceneCaseTask.setScriptJson(nodeInfo.getScriptPath()); + atuPlanSceneCaseTaskService.insert(planSceneCaseTask); + + } + taskExecDto.setScriptPath(scriptPath); + taskExecDto.setCaseParams(caseParams); + taskExecDto.setAppId(appId); + + logger.debug("修改原任务状态"); + planTask.setEngineId(""); + planTask.setDeviceId(""); + planTask.setAppId(""); + planTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); + planTask.setStartTime(null); + planTask.setEndTime(null); + planTask.setErrorMsg(""); + planTask.setVideoUrl(""); + planTask.setExecResultFile(""); + planTask.setBugId(""); + if (sceneNodeExecDto != null && sceneNodeExecDto.getSceneScriptUrl() != null) { + planTask.setScriptJson(sceneNodeExecDto.getSceneScriptUrl()); + }else { + logger.info("首节点返回sceneScriptUrl为空" + sceneNodeExecDto); + } + int rows = atuPlanTaskService.updateByPrimaryKey(planTask); if (rows <= 0) { - logger.error("清理原场景节点任务失败"); - throw new PlatformRuntimeException(ExecPlanError.CLEAR_SCENE_NODE_TASK_FAIL); + throw new PlatformRuntimeException(ExecPlanError.INIT_TASK_INFO_FAIL); } - logger.debug("插入新节点任务"); - AtuPlanSceneCaseTask planSceneCaseTask = new AtuPlanSceneCaseTask(); - planSceneCaseTask.setId(sceneTaskId); - planSceneCaseTask.setTaskId(planTask.getId()); - planSceneCaseTask.setScriptId(nodeInfo.getScriptId()); - planSceneCaseTask.setVersionId(nodeInfo.getVersionId()); - planSceneCaseTask.setVersionName(nodeInfo.getVersionName()); - planSceneCaseTask.setScriptName(nodeInfo.getScriptName()); - planSceneCaseTask.setScriptJson(nodeInfo.getScriptPath()); - planSceneCaseTask.setNodeId(nodeInfo.getNodeId()); - planSceneCaseTask.setNodeType(nodeInfo.getNodeType()); - if (CollUtil.isNotEmpty(nodeInfo.getCaseParam())) { - planSceneCaseTask.setNodeParams(JSONUtil.toJsonStr(nodeInfo.getCaseParam())); - } - planSceneCaseTask.setCreatedTime(new Date()); - planSceneCaseTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); - planSceneCaseTask.setScriptJson(nodeInfo.getScriptPath()); - atuPlanSceneCaseTaskService.insert(planSceneCaseTask); - } - taskExecDto.setScriptPath(scriptPath); - taskExecDto.setCaseParams(caseParams); - taskExecDto.setAppId(appId); + logger.debug("发送任务执行信息至消息队列"); + sendToQueue(taskExecDto.getBatchId(), taskExecDto, type); - logger.debug("修改原任务状态"); - planTask.setEngineId(""); - planTask.setDeviceId(""); - planTask.setAppId(""); - planTask.setStatus(PlanConstant.TASK_WAIT_EXECUTE_STATUS); - planTask.setStartTime(null); - planTask.setEndTime(null); - planTask.setErrorMsg(""); - planTask.setVideoUrl(""); - planTask.setExecResultFile(""); - planTask.setBugId(""); - if (sceneNodeExecDto != null && sceneNodeExecDto.getSceneScriptUrl() != null) { - planTask.setScriptJson(sceneNodeExecDto.getSceneScriptUrl()); - }else { - logger.info("首节点返回sceneScriptUrl为空" + sceneNodeExecDto); - } - int rows = atuPlanTaskService.updateByPrimaryKey(planTask); - if (rows <= 0) { - throw new PlatformRuntimeException(ExecPlanError.INIT_TASK_INFO_FAIL); + atuPlanInfoApiService.handleAutoType(PlanConstant.SCRIPT_TYPE_SCENE, caseTypeMap); } - logger.debug("发送任务执行信息至消息队列"); - sendToQueue(taskExecDto.getBatchId(), taskExecDto, type); - - atuPlanInfoApiService.handleAutoType(PlanConstant.SCRIPT_TYPE_SCENE, caseTypeMap); + logger.debug("计划批次重新发起委托"); + atuPlanInfoApiService.handlePlanDevice(planInfo.getId(), planInfo.getPriority(), planBatch.getId(), + retryDto.getHasOfflineDevice(), caseTypeMap, true); + return true; + } finally { + lock.unlock(); } - - logger.debug("计划批次重新发起委托"); - atuPlanInfoApiService.handlePlanDevice(planInfo.getId(), planInfo.getPriority(), planBatch.getId(), - retryDto.getHasOfflineDevice(), caseTypeMap, true); - return true; } @Override diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java index 0b8a9bf..9dbdddb 100644 --- a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/constants/RedisConstant.java @@ -59,4 +59,9 @@ public class RedisConstant { */ public static final String BATCH_MESSAGE_LOCK_PRE = "BATCH_MESSAGE_LOCK_PRE"; + /** + * + */ + public static final String PLAN_BATCH_RETRY_LOCK_PRE = "LOCK:PLAN:PLAN-BATCH-RETRY-LOCK-PRE:"; + } diff --git a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java index e23b147..9d6f023 100644 --- a/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java +++ b/cctp-atu/atu-execute-plan/src/main/java/net/northking/cctp/executePlan/exception/ExecPlanError.java @@ -89,6 +89,8 @@ public enum ExecPlanError implements PlatformError { GET_FILE_FAIL("获取文件失败"), + BATCH_IS_DEALING_WITH_RETRY("批次的任务重试正在处理中..."), + /** * 错误码结束值 */