root 2 éve
szülő
commit
c66fb55365

+ 6 - 6
simulation-resource-common/src/main/java/com/css/simulation/resource/common/controller/MinioController.java

@@ -117,12 +117,12 @@ public class MinioController {
 
     @RequestMapping("/createMultipartUpload")
     @ResponseBody
-    public ResponseBodyVO createMultipartUpload(@RequestBody Map<String, String> paramMap) throws Exception {
+    public ResponseBodyVO<Map<String, Object>> createMultipartUpload(@RequestBody Map<String, String> paramMap) throws Exception {
         String objectName = paramMap.get("objectName");
         String chunkSize = paramMap.get("chunkSize");
         String type = paramMap.get("type");
         if (ObjectUtil.isNull(objectName) || ObjectUtil.isNull(chunkSize) || ObjectUtil.isNull(type)) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "请求参数缺失!");
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "请求参数缺失!");
         }
         Integer nowTime = TimeUtil.getRq(new Date(), 0);
         if (type.equals(DictConstants.ALGORITHM_FILE)) {
@@ -149,16 +149,16 @@ public class MinioController {
         result.put("uploadId", uploadId);
         result.put("uploadUrls", UrlList);
         result.put("objectName", objectName);
-        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, result);
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, result);
     }
 
     @RequestMapping("/completeMultipartUpload")
     @ResponseBody
-    public ResponseBodyVO completeMultipartUpload(@RequestBody Map<String, String> paramMap) throws Exception {
+    public ResponseBodyVO<String> completeMultipartUpload(@RequestBody Map<String, String> paramMap) throws Exception {
         String objectName = paramMap.get("objectName");
         String uploadId = paramMap.get("uploadId");
         if (ObjectUtil.isNull(objectName) || ObjectUtil.isNull(uploadId)) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "请求参数缺失!");
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "请求参数缺失!");
         }
         ListPartsResponse listPartsResponse = minioClientPrivate.listParts(bucketName, null, objectName, 10000, 0, uploadId, null, null);
         List<Part> parts = listPartsResponse.result().partList();
@@ -169,7 +169,7 @@ public class MinioController {
             partNumber++;
         }
         minioClientPrivate.completeMultipartUpload(bucketName, null, objectName, uploadId, partArr, null, null);
-        return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, "合并成功!");
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, "合并成功!");
     }
 
     @PostMapping("/remove")

+ 30 - 30
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/consumer/ProjectConsumer.java

@@ -31,7 +31,6 @@ import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.FutureTask;
 import java.util.concurrent.TimeUnit;
 
 @Component
@@ -101,11 +100,8 @@ public class ProjectConsumer {
         String initialProjectJson = projectRecord.value();
         ProjectMessageDTO projectMessageDTO = JsonUtil.jsonToBean(initialProjectJson, ProjectMessageDTO.class);
         String projectId = projectMessageDTO.getProjectId();        // 手动执行项目 id 或 自动执行子项目 id
-        FutureTask<Integer> createTaskAndFixDataFutureTask = new FutureTask<>(() -> {
-            createTaskAndFixData(projectRecord);
-            return 1024;
-        });
-        new Thread(createTaskAndFixDataFutureTask, "project-fix-" + projectId).start();
+        new Thread(() -> createTaskAndFixData(projectRecord), "fix-" + projectId).start();
+//        createTaskAndFixData(projectRecord);
     }
 
 
@@ -115,12 +111,12 @@ public class ProjectConsumer {
         String initialProjectJson = projectRecord.value();
         log.info("createTaskAndFixData() 接收到项目开始消息为:" + initialProjectJson);
         ProjectMessageDTO projectMessageDTO = JsonUtil.jsonToBean(initialProjectJson, ProjectMessageDTO.class);
-        String projectId = projectMessageDTO.getProjectId();        // 手动执行项目 id 或 自动执行子项目 id
-        String packageId = projectMessageDTO.getScenePackageId();   // 场景测试包 id
-        String vehicleConfigId = projectMessageDTO.getVehicleConfigId();// 模型配置 id
-        String algorithmId = projectMessageDTO.getAlgorithmId();    // 模型配置 id
-        long videoTime = projectMessageDTO.getMaxSimulationTime();  // 结果视频的时长
-        String projectType = projectMessageDTO.getType();           // 项目类型
+        String projectId = projectMessageDTO.getProjectId();                // 手动执行项目 id 或 自动执行子项目 id
+        String packageId = projectMessageDTO.getScenePackageId();           // 场景测试包 id
+        String vehicleConfigId = projectMessageDTO.getVehicleConfigId();    // 模型配置 id
+        String algorithmId = projectMessageDTO.getAlgorithmId();            // 模型配置 id
+        long videoTime = projectMessageDTO.getMaxSimulationTime();          // 结果视频的时长
+        String projectType = projectMessageDTO.getType();                   // 项目类型
         String userId = "";  // 用户 id
         if (DictConstants.PROJECT_TYPE_MANUAL.equals(projectType)) {
             userId = manualProjectMapper.selectCreateUserById(projectId);
@@ -136,12 +132,13 @@ public class ProjectConsumer {
         // -------------------------------- 1 查询场景 --------------------------------
         log.info("createTaskAndFixData() 项目 " + projectId + " 开始查询场景。");
         //根据场景测试包 packageId,拿到场景集合(不包括重复场景),重复场景会在发送消息时根据叶子指标发送多次。
-        List<ScenePO> scenePOList = projectService.getSceneList(projectId, packageId, projectPath);
+        List<ScenePO> scenePOList = projectService.getSceneList(projectId, packageId);
         int taskTotal = scenePOList.size();
         projectMessageDTO.setTaskTotal(taskTotal);
         projectMessageDTO.setTaskCompleted(0);
         //去重,之后发送消息的时候会补全指标,如果不去重的话会出现多个场景重复关联多个指标
         Set<ScenePO> scenePOSet = new HashSet<>(scenePOList);
+        log.info("createTaskAndFixData() 项目 " + projectId + " 场景包括:" + scenePOSet);
         // -------------------------------- 2 查询模型 --------------------------------
         log.info("createTaskAndFixData() 项目 " + projectId + " 开始查询模型。");
         //2-1 根据车辆配置id vehicleConfigId, 获取 模型信息和传感器信息
@@ -151,6 +148,7 @@ public class ProjectConsumer {
         // -------------------------------- 3 算法导入 --------------------------------
         log.info("createTaskAndFixData() 项目 " + projectId + " 开始算法导入。");
         String algorithmDockerImage = projectService.handleAlgorithm(projectId, algorithmId);
+        log.info("createTaskAndFixData() 项目 " + projectId + " 算法已导入:" + algorithmDockerImage);
         // -------------------------------- 4 保存任务消息 --------------------------------
         log.info("createTaskAndFixData() 项目 " + projectId + " 开始保存任务消息。");
         List<TaskPO> taskList = new ArrayList<>();
@@ -164,7 +162,7 @@ public class ProjectConsumer {
                 lastTargetIdList = indexMapper.selectLeafIndexIdByAutoSubProjectIdAndSceneId(projectId, "%" + sceneId + "%");
             }
             if (CollectionUtil.isEmpty(lastTargetIdList)) {
-                throw new RuntimeException("createTaskAndFixData() -- 项目 " + projectId + " 使用的场景测试包 " + sceneId + " 不存在指标。");
+                throw new RuntimeException("createTaskAndFixData() 项目 " + projectId + " 使用的场景测试包 " + sceneId + " 不存在指标。");
             }
             for (String lastTargetId : lastTargetIdList) {
                 String taskId = StringUtil.getRandomUUID();
@@ -196,7 +194,7 @@ public class ProjectConsumer {
                 String xoscPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId + "." + xoscSuffix;
                 MinioUtil.downloadToFile(minioClient, bucketName, scenarioOsc, xoscPathOfLinux);
                 MinioUtil.uploadFromFile(minioClient, xoscPathOfLinux, bucketName, xoscPathOfMinio);
-                log.info("ProjectService--sendTaskMessage 已经将 xosc 上传到 minio 的结果文件目录:" + xoscPathOfMinio);
+                log.info("cacheManualProject() 已经将 xosc 上传到 minio 的结果文件目录:" + xoscPathOfMinio);
 
                 String scenarioOdr = scenePO.getScenarioOdr();
                 String[] splitXodr = scenarioOdr.split("/");
@@ -207,7 +205,7 @@ public class ProjectConsumer {
                 String xodrPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId + "." + xodrSuffix;
                 MinioUtil.downloadToFile(minioClient, bucketName, scenarioOdr, xodrPathOfLinux);
                 MinioUtil.uploadFromFile(minioClient, xodrPathOfLinux, bucketName, xodrPathOfMinio);
-                log.info("ProjectService--sendTaskMessage 已经将 xodr 上传到 minio 的结果文件目录:" + xodrPathOfMinio);
+                log.info("cacheManualProject() 已经将 xodr 上传到 minio 的结果文件目录:" + xodrPathOfMinio);
 
                 String scenarioOsgb = scenePO.getScenarioOsgb();
                 String[] splitOsgb = scenarioOsgb.split("/");
@@ -218,7 +216,7 @@ public class ProjectConsumer {
                 String osgbPathOfMinio = projectResultPathOfMinio + projectId + "/" + taskId + "/" + taskId + "." + osgbSuffix;
                 MinioUtil.downloadToFile(minioClient, bucketName, scenarioOsgb, osgbPathOfLinux);
                 MinioUtil.uploadFromFile(minioClient, osgbPathOfLinux, bucketName, osgbPathOfMinio);
-                log.info("ProjectService--sendTaskMessage 已经将 osgb 上传到 minio 的结果文件目录:" + osgbPathOfMinio);
+                log.info("cacheManualProject() 已经将 osgb 上传到 minio 的结果文件目录:" + osgbPathOfMinio);
 
                 // 组装 task 消息
                 TaskTO taskTO = TaskTO.builder()
@@ -263,12 +261,14 @@ public class ProjectConsumer {
                                 .build())
                         .build();
 
-                //4-4 将对象转成 json 保存到临时目录等待资源分配后执行
+                log.info("createTaskAndFixData() 项目 " + projectId + " 将对象转成 json 保存到临时目录等待资源分配后执行:" + taskTO);
                 FileUtil.writeStringToLocalFile(JsonUtil.beanToJson(taskTO), projectPath + taskId + ".json");
+                log.info("createTaskAndFixData() 项目 " + projectId + " 将对象转成 json 保存到临时目录成功。");
             }
         }
-        taskManager.batchInsertTask(taskList);
         log.info("createTaskAndFixData() 项目 " + projectId + " 创建任务:" + taskList);
+        taskManager.batchInsertTask(taskList);
+        log.info("createTaskAndFixData() 项目 " + projectId + " 任务保存成功。");
         //* -------------------------------- 4 开始排队 --------------------------------
         cacheProject(projectRecord);
 
@@ -283,7 +283,7 @@ public class ProjectConsumer {
     @SneakyThrows
     public void cacheProject(ConsumerRecord<String, String> projectRecord) {
         String initialProjectJson = projectRecord.value();
-        log.info("ProjectConsumer--cacheManualProject 接收到项目开始消息为:" + initialProjectJson);
+        log.info("cacheManualProject() 判断用户是否拥有可分配资源:" + initialProjectJson);
         //1 读取 kafka 的 project 信息
         ProjectMessageDTO projectMessageDTO = JsonUtil.jsonToBean(initialProjectJson, ProjectMessageDTO.class);
         String projectId = projectMessageDTO.getProjectId();    // 手动执行项目 id 或 自动执行子项目 id
@@ -296,38 +296,38 @@ public class ProjectConsumer {
         } else if (DictConstants.PROJECT_TYPE_AUTO_SUB.equals(projectType)) {
             userId = autoSubProjectMapper.selectCreateUserById(projectId);
         } else {
-            log.error("ProjectConsumer--cacheManualProject 项目类型错误:" + initialProjectJson);
+            log.error("cacheManualProject 项目类型错误:" + initialProjectJson);
             return;
         }
         if (StringUtil.isEmpty(userId)) {
-            log.error("ProjectConsumer--cacheManualProject 未查询到项目创建人:" + initialProjectJson);
+            log.error("cacheManualProject 未查询到项目创建人:" + initialProjectJson);
             return;
         }
         //3 获取用户类型(管理员账户、管理员子账户、普通账户、普通子账户)(独占、共享)
         UserPO userPO = userMapper.selectById(userId);
-        log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人为:" + userPO);
+        log.info("cacheManualProject 项目 " + projectId + " 的创建人为:" + userPO);
         String roleCode = userPO.getRoleCode();
         String useType = userPO.getUseType();
         ClusterPO clusterPO;
         if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) {  //3-1 管理员账户和管理员子账户直接执行
-            log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为管理员账户或管理员子账户,直接判断服务器能否执行。");
+            log.info("cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为管理员账户或管理员子账户,直接判断服务器能否执行。");
             PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(DictConstants.SYSTEM_CLUSTER_ID, projectId);
             run(projectMessageDTO, DictConstants.SYSTEM_CLUSTER_ID, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey());
             return;
         } else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
             clusterPO = clusterMapper.selectByUserId(userId);
-            log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通账户(包括独占或共享都在自己的集群),集群为:" + clusterPO);
+            log.info("cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通账户(包括独占或共享都在自己的集群),集群为:" + clusterPO);
         } else if (DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)) {
             if (DictConstants.USER_TYPE_EXCLUSIVE.equals(useType)) {   //3-3 普通子账户,根据自己的独占节点排队
                 clusterPO = clusterMapper.selectByUserId(userId);
-                log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通独占子账户(自己的集群),集群为:" + clusterPO);
+                log.info("cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通独占子账户(自己的集群),集群为:" + clusterPO);
             } else {    //3-4 共享子账户,根据父账户的共享节点排队
                 String parentUserId = userPO.getCreateUserId();
                 clusterPO = clusterMapper.selectByUserId(parentUserId);
-                log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通共享子账户(父账户的集群),集群为:" + clusterPO);
+                log.info("cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通共享子账户(父账户的集群),集群为:" + clusterPO);
             }
         } else {
-            log.error("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
+            log.error("cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
             return;
         }
         // 获取拥有的节点数量,即仿真软件证书数量
@@ -359,12 +359,12 @@ public class ProjectConsumer {
         int restParallelism = projectUtil.getRestParallelism();
         //2 判断剩余可用并行度是否大于项目并行度,否则加入扩充队列
         if (restParallelism > 0L) {
-            log.info("ProjectConsumer--run 集群 " + clusterId + " 执行项目 " + projectId);
+            log.info("run 集群 " + clusterId + " 执行项目 " + projectId);
             // 设置实际的并行度
             projectMessageDTO.setCurrentParallelism(Math.min(restParallelism, parallelism));   // 设置实际的并行度
             parseProject(projectMessageDTO, projectRunningKey);
         } else {
-            log.info("ProjectConsumer--cacheManualProject 服务器资源不够,项目 " + projectId + " 暂时加入等待队列。");
+            log.info("cacheManualProject 服务器资源不够,项目 " + projectId + " 暂时加入等待队列。");
             wait(projectWaitingKey, projectMessageDTO);
         }
     }

+ 22 - 28
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/manager/TaskManager.java

@@ -43,55 +43,49 @@ import java.util.stream.Collectors;
 public class TaskManager {
 
     @Value("${scheduler.linux-path.pod-yaml-directory}")
-    String podYamlDirectory;
+    private String podYamlDirectory;
     @Value("${minio.bucket-name}")
-    String bucketName;
+    private String bucketName;
     @Value("${scheduler.linux-path.score-py}")
-    String pyPath;
+    private  String pyPath;
     @Value("${scheduler.linux-path.temp}")
-    String linuxTempPath;
+    private String linuxTempPath;
     @Value("${simulation-cloud.client-id}")
-    String clientId;
+    private String clientId;
     @Value("${simulation-cloud.client-secret}")
-    String clientSecret;
+    private String clientSecret;
     @Value("${simulation-cloud.token-uri}")
-    String tokenUri;
+    private String tokenUri;
     @Value("${simulation-cloud.evaluation-level-uri}")
-    String evaluationLevelUri;
+    private  String evaluationLevelUri;
     @Value("${scheduler.minio-path.project-result}")
-    String resultPathMinio;
+    private String resultPathMinio;
     @Value("${spring.kafka.hostname}")
-    String hostnameKafka;
-    @Value("${spring.kafka.username}")
-    String usernameKafka;
-    @Value("${spring.kafka.password}")
-    String passwordKafka;
-    @Value("${spring.kafka.delete-command}")
-    String kafkaDeleteCommand;
+    private String hostnameKafka;
     @Resource
-    StringRedisTemplate stringRedisTemplate;
+    private StringRedisTemplate stringRedisTemplate;
     @Resource
-    TaskMapper taskMapper;
+    private TaskMapper taskMapper;
     @Resource
-    MinioClient minioClient;
+    private MinioClient minioClient;
     @Resource
-    ManualProjectMapper manualProjectMapper;
+    private ManualProjectMapper manualProjectMapper;
     @Resource
-    AutoSubProjectMapper autoSubProjectMapper;
+    private AutoSubProjectMapper autoSubProjectMapper;
     @Resource
-    TaskIndexManager taskIndexManager;
+    private TaskIndexManager taskIndexManager;
     @Resource
-    IndexMapper indexMapper;
+    private IndexMapper indexMapper;
     @Resource
-    ScoringRulesMapper scoringRulesMapper;
+    private ScoringRulesMapper scoringRulesMapper;
     @Resource
-    CloseableHttpClient closeableHttpClient;
+    private CloseableHttpClient closeableHttpClient;
     @Resource
-    RequestConfig requestConfig;
+    private RequestConfig requestConfig;
     @Resource
-    ProjectUtil projectUtil;
+    private ProjectUtil projectUtil;
     @Resource
-    VideoService videoService;
+    private VideoService videoService;
     @Resource
     private SqlSessionFactory sqlSessionFactory;
     @Resource

+ 1 - 2
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/resource/TaskLock.java

@@ -15,7 +15,7 @@ import java.util.concurrent.locks.ReentrantLock;
 @Component
 @Slf4j
 public class TaskLock {
-    private final Lock lock = new ReentrantLock(); // 票数
+    private final Lock lock = new ReentrantLock();
 
     @Resource
     StringRedisTemplate stringRedisTemplate;
@@ -25,7 +25,6 @@ public class TaskLock {
     /**
      * 判断完成度
      */
-
     public boolean complete(
             PrefixTO redisPrefix,
             String projectId,

+ 212 - 212
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/scheduler/ProjectScheduler.java

@@ -1,212 +1,212 @@
-package com.css.simulation.resource.scheduler.scheduler;
-
-import api.common.pojo.constants.DictConstants;
-import api.common.pojo.dto.ProjectMessageDTO;
-import api.common.util.CollectionUtil;
-import api.common.util.JsonUtil;
-import api.common.util.StringUtil;
-import api.common.util.TimeUtil;
-import com.css.simulation.resource.scheduler.configuration.kubernetes.KubernetesConfiguration;
-import com.css.simulation.resource.scheduler.consumer.ProjectConsumer;
-import com.css.simulation.resource.scheduler.mapper.*;
-import com.css.simulation.resource.scheduler.pojo.po.ClusterPO;
-import com.css.simulation.resource.scheduler.pojo.po.ProjectPO;
-import com.css.simulation.resource.scheduler.pojo.po.TaskPO;
-import com.css.simulation.resource.scheduler.pojo.po.UserPO;
-import com.css.simulation.resource.scheduler.pojo.to.PrefixTO;
-import com.css.simulation.resource.scheduler.service.TaskService;
-import com.css.simulation.resource.scheduler.util.ProjectUtil;
-import com.css.simulation.resource.scheduler.util.RedisUtil;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.core.StringRedisTemplate;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-@Component
-@Slf4j
-public class ProjectScheduler {
-
-    @Value("${scheduler.host.hostname}")
-    String hostname;
-    @Value("${scheduler.host.username}")
-    String username;
-    @Value("${scheduler.host.password}")
-    String password;
-    // -------------------------------- Comment --------------------------------
-    @Resource
-    StringRedisTemplate stringRedisTemplate;
-    @Resource
-    TaskService taskService;
-    @Resource
-    TaskMapper taskMapper;
-    @Resource
-    ClusterMapper clusterMapper;
-    @Resource
-    ManualProjectMapper manualProjectMapper;
-    @Resource
-    AutoSubProjectMapper autoSubProjectMapper;
-    @Resource
-    ProjectConsumer projectConsumer;
-    @Resource
-    ProjectUtil projectUtil;
-    @Resource
-    UserMapper userMapper;
-    @Resource
-    KubernetesConfiguration kubernetesConfiguration;
-
-
-    /**
-     * 调度项目启动
-     */
-    @Scheduled(fixedDelay = 60 * 1000)
-    @SneakyThrows
-    public void dispatchProject() {
-
-        //1 查询已经在页面上点击运行的项目(后面会判断是排队中还是已经与运行了)
-        List<ProjectPO> manualProjectList = manualProjectMapper.selectByNowRunState(DictConstants.PROJECT_RUNNING);
-        List<ProjectPO> autoSubProjectList = autoSubProjectMapper.selectByNowRunState(DictConstants.PROJECT_RUNNING);
-        List<ProjectPO> allProject = new ArrayList<>();
-        allProject.addAll(manualProjectList);
-        allProject.addAll(autoSubProjectList);
-
-
-        for (ProjectPO project : allProject) {
-            String projectId = project.getId();
-            int parallelism = Integer.parseInt(project.getParallelism());
-            String userId = project.getCreateUserId();
-            UserPO userPO = userMapper.selectById(userId);
-            String roleCode = userPO.getRoleCode();
-            String useType = userPO.getUseType();
-            ClusterPO clusterPO = null;
-            String clusterId;
-            boolean isSystem = false;
-            if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) {  //3-1 管理员账户和管理员子账户直接执行
-                clusterId = DictConstants.SYSTEM_CLUSTER_ID;
-                isSystem = true;
-            } else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
-                clusterPO = clusterMapper.selectByUserId(userId);
-                if (clusterPO == null) {
-                    log.error("ProjectScheduler--dispatchProject 项目 " + projectId + " 的创建用户 " + userId + " 没有分配集群!");
-                    return;
-                }
-                clusterId = clusterPO.getId();
-            } else if (DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)) {
-                if (DictConstants.USER_TYPE_EXCLUSIVE.equals(useType)) {   //3-3 普通子账户,根据自己的独占节点排队
-                    clusterPO = clusterMapper.selectByUserId(userId);
-                } else {    //3-4 共享子账户,根据父账户的共享节点排队
-                    String parentUserId = userPO.getCreateUserId();
-                    clusterPO = clusterMapper.selectByUserId(parentUserId);
-                }
-                if (clusterPO == null) {
-                    log.error("ProjectScheduler--dispatchProject 项目 " + projectId + " 的创建用户 " + userId + " 没有分配集群!");
-                    return;
-                }
-                clusterId = clusterPO.getId();
-            } else {
-                log.error("ProjectConsumer--dispatchProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
-                return;
-            }
-            PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(clusterId, projectId);
-            // --------------------------------  判断项目是否已经在执行,如果执行则 continue --------------------------------
-            if (StringUtil.isNotEmpty(stringRedisTemplate.opsForValue().get(redisPrefix.getProjectRunningKey()))) {
-                continue;
-            }
-            // -------------------------------- 项目没有执行说明等待中 --------------------------------
-            if (isSystem) { // 系统管理员直接执行
-                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
-                return;
-            }
-            int simulationLicenseNumber = clusterPO.getNumSimulationLicense();
-            // 获取该用户正在运行的项目数量
-            Set<String> keySetOfAllProjectOfCluster = RedisUtil.getKeySetByPrefix(stringRedisTemplate, redisPrefix.getClusterRunningPrefix());
-            List<String> keyListOfRunningProject = null;
-            // cluster:${clusterId}:running:${projectId}
-            if (CollectionUtil.isNotEmpty(keySetOfAllProjectOfCluster)) {
-                keyListOfRunningProject = projectUtil.getRunningProjectList(keySetOfAllProjectOfCluster);   // 筛选出运行中的项目信息 (key 为 cluster:${cluster}:running:${projectId})
-                if (CollectionUtil.isNotEmpty(keyListOfRunningProject)) {
-                    log.info("ProjectScheduler--dispatchProject 运行中的项目的 key 有:" + keyListOfRunningProject);
-                    long parallelismSum = 0;
-                    for (String keyOfRunningProject : keyListOfRunningProject) {
-                        parallelismSum += JsonUtil.jsonToBean(RedisUtil.getStringByKey(stringRedisTemplate, keyOfRunningProject), ProjectMessageDTO.class).getParallelism();
-                    }
-                    if (parallelismSum < simulationLicenseNumber) { // 已经运行的项目小于集群允许运行的项目则,运行新的项目
-                        if (parallelismSum + parallelism < simulationLicenseNumber) {
-                            run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
-                            return;
-                        }
-                    }
-                }
-            }
-            if ((CollectionUtil.isEmpty(keySetOfAllProjectOfCluster) || CollectionUtil.isEmpty(keyListOfRunningProject)) && parallelism < simulationLicenseNumber) {
-                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
-            }
-        }
-    }
-
-
-    @SneakyThrows
-    public void run(String clusterId, String projectId, String projectWaitingKey, String projectRunningKey) {
-        ProjectMessageDTO projectMessageDTO;
-        try {
-            projectMessageDTO = JsonUtil.jsonToBean(RedisUtil.getStringByKey(stringRedisTemplate, projectWaitingKey), ProjectMessageDTO.class);
-        } catch (Exception e) {
-            log.info("ProjectScheduler--run 等待执行的项目信息已经从 redis 删除。");
-            return;
-        }
-        //1 获取所有节点的剩余可用并行度
-        int restParallelism = projectUtil.getRestParallelism();
-        if (restParallelism == 0) {
-            log.info("ProjectScheduler--run 集群中没有可用并行度,项目 " + projectId + " 继续等待。");
-            return;
-        }
-        //2 判断剩余可用并行度是否大于项目并行度,否则继续等待
-        if (restParallelism > 0L) {
-            log.info("ProjectScheduler--run 集群 " + clusterId + " 执行项目项目 " + projectId);
-            projectMessageDTO.setCurrentParallelism(restParallelism);    // 设置实际的并行度
-            projectConsumer.parseProject(projectMessageDTO, projectRunningKey);
-        }
-    }
-
-
-    /**
-     * 处理 pod 超时
-     * 同时也可处理 pod 莫名关闭,因为关闭之后也会超时
-     */
-    @Scheduled(fixedDelay = 60 * 1000)
-    @Transactional
-    public void taskTimeout() {
-        //1 查询任务信息(需要过滤已经删除的项目,因为页面上删除项目不会删除任务)
-        List<TaskPO> executingTaskList = taskMapper.selectByRunStateAndProjectIsNotDeleted(DictConstants.TASK_RUNNING);
-        if (CollectionUtil.isEmpty(executingTaskList)) {
-            return;
-        }
-        log.info("ProjectScheduler--taskTimeout 正在运行的任务有:" + executingTaskList);
-        for (TaskPO task : executingTaskList) {
-            String userId = task.getCreateUserId();
-            String projectId = task.getPId();
-            String taskId = task.getId();
-            PrefixTO redisPrefix = projectUtil.getRedisPrefixByUserIdAndProjectIdAndTaskId(userId, projectId, taskId);
-            // 获取心跳时间
-            String tickTime = stringRedisTemplate.opsForValue().get(redisPrefix.getTaskTickKey());
-            if (StringUtil.isEmpty(tickTime)) {
-                log.error(redisPrefix.getTaskTickKey() + ",该 key 的心跳时间为空!");
-                continue;
-            }
-            long lastTickTime = Long.parseLong(tickTime);
-            // 如果心跳超时则更改任务状态为 Aborted
-            if (TimeUtil.getNow() - lastTickTime > Long.parseLong(kubernetesConfiguration.getPodTimeout())) {
-                String podName = stringRedisTemplate.opsForValue().get(redisPrefix.getTaskPodKey());
-                taskService.taskState(taskId, DictConstants.TASK_ABORTED, podName);
-            }
-        }
-    }
-
-}
+//package com.css.simulation.resource.scheduler.scheduler;
+//
+//import api.common.pojo.constants.DictConstants;
+//import api.common.pojo.dto.ProjectMessageDTO;
+//import api.common.util.CollectionUtil;
+//import api.common.util.JsonUtil;
+//import api.common.util.StringUtil;
+//import api.common.util.TimeUtil;
+//import com.css.simulation.resource.scheduler.configuration.kubernetes.KubernetesConfiguration;
+//import com.css.simulation.resource.scheduler.consumer.ProjectConsumer;
+//import com.css.simulation.resource.scheduler.mapper.*;
+//import com.css.simulation.resource.scheduler.pojo.po.ClusterPO;
+//import com.css.simulation.resource.scheduler.pojo.po.ProjectPO;
+//import com.css.simulation.resource.scheduler.pojo.po.TaskPO;
+//import com.css.simulation.resource.scheduler.pojo.po.UserPO;
+//import com.css.simulation.resource.scheduler.pojo.to.PrefixTO;
+//import com.css.simulation.resource.scheduler.service.TaskService;
+//import com.css.simulation.resource.scheduler.util.ProjectUtil;
+//import com.css.simulation.resource.scheduler.util.RedisUtil;
+//import lombok.SneakyThrows;
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.data.redis.core.StringRedisTemplate;
+//import org.springframework.scheduling.annotation.Scheduled;
+//import org.springframework.stereotype.Component;
+//import org.springframework.transaction.annotation.Transactional;
+//
+//import javax.annotation.Resource;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Set;
+//
+//@Component
+//@Slf4j
+//public class ProjectScheduler {
+//
+//    @Value("${scheduler.host.hostname}")
+//    String hostname;
+//    @Value("${scheduler.host.username}")
+//    String username;
+//    @Value("${scheduler.host.password}")
+//    String password;
+//    // -------------------------------- Comment --------------------------------
+//    @Resource
+//    StringRedisTemplate stringRedisTemplate;
+//    @Resource
+//    TaskService taskService;
+//    @Resource
+//    TaskMapper taskMapper;
+//    @Resource
+//    ClusterMapper clusterMapper;
+//    @Resource
+//    ManualProjectMapper manualProjectMapper;
+//    @Resource
+//    AutoSubProjectMapper autoSubProjectMapper;
+//    @Resource
+//    ProjectConsumer projectConsumer;
+//    @Resource
+//    ProjectUtil projectUtil;
+//    @Resource
+//    UserMapper userMapper;
+//    @Resource
+//    KubernetesConfiguration kubernetesConfiguration;
+//
+//
+//    /**
+//     * 调度项目启动
+//     */
+//    @Scheduled(fixedDelay = 60 * 1000)
+//    @SneakyThrows
+//    public void dispatchProject() {
+//
+//        //1 查询已经在页面上点击运行的项目(后面会判断是排队中还是已经与运行了)
+//        List<ProjectPO> manualProjectList = manualProjectMapper.selectByNowRunState(DictConstants.PROJECT_RUNNING);
+//        List<ProjectPO> autoSubProjectList = autoSubProjectMapper.selectByNowRunState(DictConstants.PROJECT_RUNNING);
+//        List<ProjectPO> allProject = new ArrayList<>();
+//        allProject.addAll(manualProjectList);
+//        allProject.addAll(autoSubProjectList);
+//
+//
+//        for (ProjectPO project : allProject) {
+//            String projectId = project.getId();
+//            int parallelism = Integer.parseInt(project.getParallelism());
+//            String userId = project.getCreateUserId();
+//            UserPO userPO = userMapper.selectById(userId);
+//            String roleCode = userPO.getRoleCode();
+//            String useType = userPO.getUseType();
+//            ClusterPO clusterPO = null;
+//            String clusterId;
+//            boolean isSystem = false;
+//            if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) {  //3-1 管理员账户和管理员子账户直接执行
+//                clusterId = DictConstants.SYSTEM_CLUSTER_ID;
+//                isSystem = true;
+//            } else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
+//                clusterPO = clusterMapper.selectByUserId(userId);
+//                if (clusterPO == null) {
+//                    log.error("dispatchProject 项目 " + projectId + " 的创建用户 " + userId + " 没有分配集群!");
+//                    return;
+//                }
+//                clusterId = clusterPO.getId();
+//            } else if (DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)) {
+//                if (DictConstants.USER_TYPE_EXCLUSIVE.equals(useType)) {   //3-3 普通子账户,根据自己的独占节点排队
+//                    clusterPO = clusterMapper.selectByUserId(userId);
+//                } else {    //3-4 共享子账户,根据父账户的共享节点排队
+//                    String parentUserId = userPO.getCreateUserId();
+//                    clusterPO = clusterMapper.selectByUserId(parentUserId);
+//                }
+//                if (clusterPO == null) {
+//                    log.error("dispatchProject 项目 " + projectId + " 的创建用户 " + userId + " 没有分配集群!");
+//                    return;
+//                }
+//                clusterId = clusterPO.getId();
+//            } else {
+//                log.error("ProjectConsumer--dispatchProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
+//                return;
+//            }
+//            PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(clusterId, projectId);
+//            // --------------------------------  判断项目是否已经在执行,如果执行则 continue --------------------------------
+//            if (StringUtil.isNotEmpty(stringRedisTemplate.opsForValue().get(redisPrefix.getProjectRunningKey()))) {
+//                continue;
+//            }
+//            // -------------------------------- 项目没有执行说明等待中 --------------------------------
+//            if (isSystem) { // 系统管理员直接执行
+//                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
+//                return;
+//            }
+//            int simulationLicenseNumber = clusterPO.getNumSimulationLicense();
+//            // 获取该用户正在运行的项目数量
+//            Set<String> keySetOfAllProjectOfCluster = RedisUtil.getKeySetByPrefix(stringRedisTemplate, redisPrefix.getClusterRunningPrefix());
+//            List<String> keyListOfRunningProject = null;
+//            // cluster:${clusterId}:running:${projectId}
+//            if (CollectionUtil.isNotEmpty(keySetOfAllProjectOfCluster)) {
+//                keyListOfRunningProject = projectUtil.getRunningProjectList(keySetOfAllProjectOfCluster);   // 筛选出运行中的项目信息 (key 为 cluster:${cluster}:running:${projectId})
+//                if (CollectionUtil.isNotEmpty(keyListOfRunningProject)) {
+//                    log.info("dispatchProject 运行中的项目的 key 有:" + keyListOfRunningProject);
+//                    long parallelismSum = 0;
+//                    for (String keyOfRunningProject : keyListOfRunningProject) {
+//                        parallelismSum += JsonUtil.jsonToBean(RedisUtil.getStringByKey(stringRedisTemplate, keyOfRunningProject), ProjectMessageDTO.class).getParallelism();
+//                    }
+//                    if (parallelismSum < simulationLicenseNumber) { // 已经运行的项目小于集群允许运行的项目则,运行新的项目
+//                        if (parallelismSum + parallelism < simulationLicenseNumber) {
+//                            run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
+//                            return;
+//                        }
+//                    }
+//                }
+//            }
+//            if ((CollectionUtil.isEmpty(keySetOfAllProjectOfCluster) || CollectionUtil.isEmpty(keyListOfRunningProject)) && parallelism < simulationLicenseNumber) {
+//                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
+//            }
+//        }
+//    }
+//
+//
+//    @SneakyThrows
+//    public void run(String clusterId, String projectId, String projectWaitingKey, String projectRunningKey) {
+//        ProjectMessageDTO projectMessageDTO;
+//        try {
+//            projectMessageDTO = JsonUtil.jsonToBean(RedisUtil.getStringByKey(stringRedisTemplate, projectWaitingKey), ProjectMessageDTO.class);
+//        } catch (Exception e) {
+//            log.info("run 等待执行的项目信息已经从 redis 删除。");
+//            return;
+//        }
+//        //1 获取所有节点的剩余可用并行度
+//        int restParallelism = projectUtil.getRestParallelism();
+//        if (restParallelism == 0) {
+//            log.info("run 集群中没有可用并行度,项目 " + projectId + " 继续等待。");
+//            return;
+//        }
+//        //2 判断剩余可用并行度是否大于项目并行度,否则继续等待
+//        if (restParallelism > 0L) {
+//            log.info("run 集群 " + clusterId + " 执行项目项目 " + projectId);
+//            projectMessageDTO.setCurrentParallelism(restParallelism);    // 设置实际的并行度
+//            projectConsumer.parseProject(projectMessageDTO, projectRunningKey);
+//        }
+//    }
+//
+//
+//    /**
+//     * 处理 pod 超时
+//     * 同时也可处理 pod 莫名关闭,因为关闭之后也会超时
+//     */
+//    @Scheduled(fixedDelay = 60 * 1000)
+//    @Transactional
+//    public void taskTimeout() {
+//        //1 查询任务信息(需要过滤已经删除的项目,因为页面上删除项目不会删除任务)
+//        List<TaskPO> executingTaskList = taskMapper.selectByRunStateAndProjectIsNotDeleted(DictConstants.TASK_RUNNING);
+//        if (CollectionUtil.isEmpty(executingTaskList)) {
+//            return;
+//        }
+//        log.info("taskTimeout 正在运行的任务有:" + executingTaskList);
+//        for (TaskPO task : executingTaskList) {
+//            String userId = task.getCreateUserId();
+//            String projectId = task.getPId();
+//            String taskId = task.getId();
+//            PrefixTO redisPrefix = projectUtil.getRedisPrefixByUserIdAndProjectIdAndTaskId(userId, projectId, taskId);
+//            // 获取心跳时间
+//            String tickTime = stringRedisTemplate.opsForValue().get(redisPrefix.getTaskTickKey());
+//            if (StringUtil.isEmpty(tickTime)) {
+//                log.error(redisPrefix.getTaskTickKey() + ",该 key 的心跳时间为空!");
+//                continue;
+//            }
+//            long lastTickTime = Long.parseLong(tickTime);
+//            // 如果心跳超时则更改任务状态为 Aborted
+//            if (TimeUtil.getNow() - lastTickTime > Long.parseLong(kubernetesConfiguration.getPodTimeout())) {
+//                String podName = stringRedisTemplate.opsForValue().get(redisPrefix.getTaskPodKey());
+//                taskService.taskState(taskId, DictConstants.TASK_ABORTED, podName);
+//            }
+//        }
+//    }
+//
+//}

+ 12 - 12
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/service/ProjectService.java

@@ -122,7 +122,7 @@ public class ProjectService {
 
     @SneakyThrows
     @Transactional
-    public List<ScenePO> getSceneList(String projectId, String packageId, String projectPath) {
+    public List<ScenePO> getSceneList(String projectId, String packageId) {
 
         String allIndexPrefix = "project:" + projectId + ":package:" + packageId + ":all";
         String leafIndexPrefix = "project:" + projectId + ":package:" + packageId + ":leaf";
@@ -132,7 +132,7 @@ public class ProjectService {
         stringRedisTemplate.opsForValue().set(allIndexPrefix, JsonUtil.listToJson(allIndexList));
         //2 查询场景包叶子指标
         List<IndexTemplatePO> leafIndexList = allIndexList.stream().filter(index -> StringUtil.isNotEmpty(index.getRuleId())).collect(Collectors.toList());
-        log.info("ProjectService--getSceneList 项目 " + projectId + " 的叶子指标为:" + leafIndexList);
+        log.info("getSceneList() 项目 " + projectId + " 的叶子指标为:" + leafIndexList);
 //        FileUtil.writeStringToLocalFile(JsonUtil.listToJson(allIndexList), projectPath + "leaf-index-list.json");
         stringRedisTemplate.opsForValue().set(leafIndexPrefix, JsonUtil.listToJson(leafIndexList));
         List<ScenePO> sceneList = new ArrayList<>();
@@ -158,12 +158,11 @@ public class ProjectService {
                 sceneList.addAll(sceneMapper.selectGeneralizationByIdList(generalizationIdList));
             }
         });
-        log.info("ProjectService--getSceneList 项目" + projectId + " 共有 " + sceneList.size() + " 个任务!");
+        log.info("getSceneList() 项目" + projectId + " 共有 " + sceneList.size() + " 个任务:" + sceneList);
         return sceneList;
     }
 
 
-
     /**
      * 将 master 节点设置成镜像仓库,导入镜像的同时 commit 到仓库当中,供其他节点 pull
      * {
@@ -214,7 +213,8 @@ public class ProjectService {
         String dockerImage;
         String algorithmDirectoryLinuxTempPath;
         String algorithmTarLinuxTempPath = null;
-        if (algorithmPO != null) { // 使用仿真平台自己的算法(等于null时有两种可能,除了是索为平台算法,也有可能是数据被彻底删除了)
+        if (algorithmPO != null) {
+            log.info("handleAlgorithm() 项目" + projectId + "需要使用仿真平台自己的算法 " + algorithmPO);
             String algorithmCode = algorithmPO.getAlgorithmCode();
             String dockerImport = algorithmPO.getDockerImport();
             dockerImage = dockerConfiguration.getRegistry() + "/algorithm_" + algorithmCode + ":latest";
@@ -244,17 +244,17 @@ public class ProjectService {
                 }
                 algorithmMapper.updateDockerImportAndDockerImageById("1", dockerImage, algorithmId);
                 if (algorithmTarLinuxTempPath == null) {
-                    throw new RuntimeException("ProjectService--handleAlgorithm 算法" + algorithmId + "下载失败。");
+                    throw new RuntimeException("handleAlgorithm 算法" + algorithmId + "下载失败。");
                 }
                 LinuxUtil.execute("docker import " + algorithmTarLinuxTempPath + " " + dockerImage);
                 LinuxUtil.execute("docker push " + dockerImage);
                 FileUtil.rm(algorithmTarLinuxTempPath);
-                log.info("ProjectService--handleAlgorithm 已删除算法临时文件:" + algorithmTarLinuxTempPath);
+                log.info("handleAlgorithm 已删除算法临时文件:" + algorithmTarLinuxTempPath);
             } else {
                 throw new RuntimeException("算法 " + algorithmId + " 的 mysql 数据有误!");
             }
-        } else { // 从索为算法平台下载算法
-            log.info("ProjectService--handleAlgorithm 项目" + projectId + "需要使用索为平台算法 " + algorithmId);
+        } else {
+            log.info("handleAlgorithm 项目" + projectId + "需要使用索为平台算法 " + algorithmId);
             algorithmTarLinuxTempPath = linuxTempPath + "algorithm/" + algorithmId + ".tar";
             String dockerImageWithoutVersion = dockerConfiguration.getRegistry() + "/algorithm_" + algorithmId;
             dockerImage = dockerImageWithoutVersion + ":latest";
@@ -275,16 +275,16 @@ public class ProjectService {
                 LinuxUtil.execute("docker import " + algorithmTarLinuxTempPath + " " + dockerImage);
                 LinuxUtil.execute("docker push " + dockerImage);
                 FileUtil.rm(algorithmTarLinuxTempPath);
-                log.info("ProjectService--handleAlgorithm 已删除算法临时文件:" + algorithmTarLinuxTempPath);
+                log.info("handleAlgorithm 已删除算法临时文件:" + algorithmTarLinuxTempPath);
             } else {
-                log.info("ProjectService--handleAlgorithm 算法镜像" + dockerImageWithoutVersion + "已导入。");
+                log.info("handleAlgorithm 算法镜像" + dockerImageWithoutVersion + "已导入。");
             }
         }
 
 //        LinuxUtil.execute("docker tag " + algorithmTarLinuxTempPath + " " + dockerImage);   // 标记镜像名称
 //        LinuxUtil.execute("docker login " + algorithmTarLinuxTempPath + " " + dockerImage); // 登录 harbor
 //        LinuxUtil.execute("docker push " + algorithmTarLinuxTempPath + " " + dockerImage);  // 推送镜像到仓库
-        log.info("ProjectService--handleAlgorithm 项目 " + projectId + " 使用的算法镜像为:" + dockerImage);
+        log.info("handleAlgorithm 项目 " + projectId + " 使用的算法镜像为:" + dockerImage);
         return dockerImage;
     }
 

+ 2 - 8
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/util/ProjectUtil.java

@@ -20,7 +20,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.kafka.core.KafkaTemplate;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
@@ -164,9 +163,8 @@ public class ProjectUtil {
      */
     @SneakyThrows
     public void createNextPod2(String projectId, String nodeName, String lastPodName) {
-        deletePod(lastPodName);
         //1 删除上一个 pod 和 redis 键值对 和 旧的 yaml 文件
-        deletePod(lastPodName);
+        new Thread(() -> deletePod(lastPodName), "delete-" + lastPodName).start();
         List<String> list = FileUtil.listAbsolutePath(podYamlDirectory);
         Iterator<String> iterator1 = list.iterator();
         while (iterator1.hasNext()) {
@@ -211,14 +209,11 @@ public class ProjectUtil {
     /**
      * @param podYamlPath pod 文件内容
      */
-    @SneakyThrows
-    @Async
     public void createPod2(String podYamlPath) {
         String nodeName = new File(podYamlPath).getName().split("#")[0];
         String podName = podYamlPath.split("#")[1].split("\\.")[0];
         stringRedisTemplate.opsForValue().set("pod:" + podName + ":node", nodeName);    // 将 pod 运行在哪个 node 上记录到 redis
-        KubernetesUtil.createNs(apiClient, kubernetesConfiguration.getNamespace());
-        KubernetesUtil.applyYaml(hostname, username, password, podYamlPath);
+        new Thread(() -> KubernetesUtil.applyYaml(hostname, username, password, podYamlPath), "create-" + podName).start();
     }
 
 
@@ -246,7 +241,6 @@ public class ProjectUtil {
     }
 
 
-
     /**
      * 获取正在运行的项目的并行度总和
      *

+ 4 - 8
simulation-resource-server/src/main/java/com/css/simulation/resource/project/ctrl/SimulationProjectCtrl.java

@@ -38,7 +38,7 @@ public class SimulationProjectCtrl {
      */
     @RequestMapping("addOrUpdateProject")
     @ResponseBody
-    public ResponseBodyVO addOrUpdateProject(@RequestBody SimulationManualProjectParam param) {
+    public ResponseBodyVO<String> addOrUpdateProject(@RequestBody SimulationManualProjectParam param) {
         return service.addOrUpdateProject(param);
     }
 
@@ -200,8 +200,8 @@ public class SimulationProjectCtrl {
     public ResponseBodyVO<String> saveEvaluationLevel(@RequestBody SimulationManualProjectParam simulationManualProjectParam) {
         String id = simulationManualProjectParam.getId();
         if (StringUtil.isEmpty(id)) {
-            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE,"id 不能为空","");
-        }else{
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "id 不能为空", "");
+        } else {
             return service.saveEvaluationLevel(id);
         }
 
@@ -209,7 +209,6 @@ public class SimulationProjectCtrl {
 
     /**
      * 保存仿真结果到数据库(任务结果返回时调用)
-     *
      */
     @RequestMapping("saveTaskResult")
     @ResponseBody
@@ -228,7 +227,6 @@ public class SimulationProjectCtrl {
 
     /**
      * 同时导出工作报告和任务包
-     *
      */
     @RequestMapping("exportProjectReportAndTaskFileById")
     @ResponseBody
@@ -239,7 +237,6 @@ public class SimulationProjectCtrl {
 
     /**
      * 添加编辑自动项目
-     *
      */
     @RequestMapping("addOrUpdateAutomaticProject")
     @ResponseBody
@@ -250,11 +247,10 @@ public class SimulationProjectCtrl {
 
     /**
      * 删除自动运行工作(支持批量删除)
-     *
      */
     @RequestMapping("deleteAutomaticProjectByids")
     @ResponseBody
-    public ResponseBodyVO deleteAutomaticProjectByids(@RequestBody SimulationManualProjectParam param) {
+    public ResponseBodyVO<String> deleteAutomaticProjectByids(@RequestBody SimulationManualProjectParam param) {
         return service.deleteAutomaticProjectByids(param);
     }
 

+ 10 - 14
simulation-resource-server/src/main/java/com/css/simulation/resource/project/impl/SimulationProjectServiceImpl.java

@@ -117,10 +117,10 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     private String[] dateFmtArr = new String[]{"yyyyMMdd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd"};
 
     @Override
-    public ResponseBodyVO addOrUpdateProject(SimulationManualProjectParam param) {
+    public ResponseBodyVO<String> addOrUpdateProject(SimulationManualProjectParam param) {
 
         if (isEmpty(param.getProjectName())) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "工作名称不能为空");
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "工作名称不能为空");
         }
         SimulationManualProjectPo po = convertParamToPo(param);
 
@@ -129,7 +129,7 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
             //工作名称一样的的不能创建
             List<SimulationManualProjectPo> simulationManualProjectPos = simulationProjectMapper.selectProjectByName(param);
             if (!isEmpty(simulationManualProjectPos)) {
-                return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "工作名称已经存在,请修改后再保存");
+                return new ResponseBodyVO<>(ResponseBodyVO.Response.CLIENT_FAILURE, "工作名称已经存在,请修改后再保存");
             }
 
 
@@ -142,15 +142,15 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
                 //第三方算法存到算发表(索为)
 //                insertOtherAlgorithm(param);
 
-                return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS, ResponseBodyVO.Response.SUCCESS.getMessage(), po.getId());
+                return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS, ResponseBodyVO.Response.SUCCESS.getMessage(), po.getId());
             }
-            return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "添加失败");
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE, "添加失败");
         } else {
             //TODO 删除逻辑有待商议
             //获取工作状态,仅未开始的才可以修改信息
             SimulationManualProjectPo simulationManualProjectPo = simulationProjectMapper.selectProjectById(param);
             if (!ProjectRunStateEnum.NOT_START.getCode().equals(simulationManualProjectPo.getNowRunState())) {
-                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "当前状态不支持修改");
+                return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE, "当前状态不支持修改");
             }
 
             po.updatePo(AuthUtil.getCurrentUserId());
@@ -4114,11 +4114,8 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
     }
 
     @Override
-    public ResponseBodyVO deleteAutomaticProjectByids(SimulationManualProjectParam param) {
+    public ResponseBodyVO<String> deleteAutomaticProjectByids(SimulationManualProjectParam param) {
         String ids = param.getIds();
-        if (isEmpty(ids)) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.CLIENT_FAILURE, "要删除的id不能为空");
-        }
         String[] idArr = ids.split(",");
 
         List<SimulationAutomaticProjectPo> pos = simulationAutomaticProjectMapper.selectProjectNowRunState(idArr);
@@ -4126,17 +4123,16 @@ public class SimulationProjectServiceImpl implements SimulationProjectService {
         //已经启动定时任务的项目不可以删除
         for (SimulationAutomaticProjectPo p : pos) {
             if ("0".equals(p.getAutomaticRunState())) {
-                return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "自动任务开启状态不支持删除");
+                return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE, "自动任务开启状态不支持删除");
             }
         }
 
-
         int i = simulationAutomaticProjectMapper.deleteProject(idArr);
         if (i > 0) {
-            return new ResponseBodyVO(ResponseBodyVO.Response.SUCCESS);
+            return new ResponseBodyVO<>(ResponseBodyVO.Response.SUCCESS);
         }
 
-        return new ResponseBodyVO(ResponseBodyVO.Response.SERVER_FAILURE, "删除失败");
+        return new ResponseBodyVO<>(ResponseBodyVO.Response.SERVER_FAILURE, "删除失败");
     }
 
     @Override

+ 2 - 2
simulation-resource-server/src/main/java/com/css/simulation/resource/project/service/SimulationProjectService.java

@@ -10,7 +10,7 @@ import java.util.List;
 
 public interface SimulationProjectService {
 
-    ResponseBodyVO addOrUpdateProject(SimulationManualProjectParam param);
+    ResponseBodyVO<String> addOrUpdateProject(SimulationManualProjectParam param);
 
     ResponseBodyVO<PageInfo<SimulationManualProjectVo>> selectProject(SimulationManualProjectParam param);
 
@@ -59,7 +59,7 @@ public interface SimulationProjectService {
 
     ResponseBodyVO addOrUpdateAutomaticProject(SimulationManualProjectParam param);
 
-    ResponseBodyVO deleteAutomaticProjectByids(SimulationManualProjectParam param);
+    ResponseBodyVO<String> deleteAutomaticProjectByids(SimulationManualProjectParam param);
 
     ResponseBodyVO<String> updateAutomaticRunState(SimulationManualProjectParam param);