root 2 jaren geleden
bovenliggende
commit
b4bdc5d81e

+ 5 - 1
api-common/src/main/java/api/common/util/LinuxUtil.java

@@ -1,5 +1,6 @@
 package api.common.util;
 
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.BufferedInputStream;
@@ -9,7 +10,10 @@ import java.io.InputStream;
 @Slf4j
 public class LinuxUtil {
 
-
+    @SneakyThrows
+    public static String kill(String command) {
+        return execute("echo kill $(ps -ef | grep '" + command + "' | awk '{ print $2 }')");
+    }
     public static String execute(String cmd) throws IOException {
         log.info("开始执行 linux 命令:" + cmd);
         Runtime run = Runtime.getRuntime();

+ 1 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/configuration/minio/MinioConfiguration.java

@@ -11,6 +11,7 @@ import org.springframework.context.annotation.Configuration;
 @ConfigurationProperties(prefix = "minio")
 public class MinioConfiguration {
     private String endpoint;
+    private String endpointWithoutHttp;
     private String accessKey;
     private String secretKey;
 

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

@@ -312,7 +312,7 @@ public class ProjectConsumer {
         if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) {  //3-1 管理员账户和管理员子账户直接执行
             log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为管理员账户或管理员子账户,直接判断服务器能否执行。");
             PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(DictConstants.SYSTEM_CLUSTER_ID, projectId);
-            run(projectMessageDTO, DictConstants.SYSTEM_CLUSTER_ID, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey(), userId);
+            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);
@@ -339,7 +339,7 @@ public class ProjectConsumer {
         int currentParallelismSum = projectUtil.getCurrentParallelismSum(redisPrefix.getClusterRunningPrefix());
         // 如果执行后的并行度总和小于最大节点数则执行,否则不执行
         if (currentParallelismSum + parallelism <= simulationLicenseNumber) {
-            run(projectMessageDTO, clusterId, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey(), userId);
+            run(projectMessageDTO, clusterId, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey());
         } else {
             wait(redisPrefix.getProjectWaitingKey(), projectMessageDTO);
         }
@@ -351,7 +351,7 @@ public class ProjectConsumer {
      * @param projectRunningKey projectRunningKey
      * @param projectWaitingKey projectWaitingKey
      */
-    public void run(ProjectMessageDTO projectMessageDTO, String clusterId, String projectRunningKey, String projectWaitingKey, String userId) {
+    public void run(ProjectMessageDTO projectMessageDTO, String clusterId, String projectRunningKey, String projectWaitingKey) {
 
         String projectId = projectMessageDTO.getProjectId();
         int parallelism = projectMessageDTO.getParallelism();  // 期望并行度
@@ -362,7 +362,7 @@ public class ProjectConsumer {
             log.info("ProjectConsumer--run 集群 " + clusterId + " 执行项目 " + projectId);
             // 设置实际的并行度
             projectMessageDTO.setCurrentParallelism(Math.min(restParallelism, parallelism));   // 设置实际的并行度
-            parseProject(projectMessageDTO, projectWaitingKey, projectRunningKey, userId);
+            parseProject(projectMessageDTO, projectRunningKey);
         } else {
             log.info("ProjectConsumer--cacheManualProject 服务器资源不够,项目 " + projectId + " 暂时加入等待队列。");
             wait(projectWaitingKey, projectMessageDTO);
@@ -381,12 +381,10 @@ public class ProjectConsumer {
 
     /**
      * @param projectMessageDTO 初始接收到的项目启动信息
-     * @param projectWaitingKey projectWaitingKey
      * @param projectRunningKey projectRunningKey
      */
     @SneakyThrows
-    public void parseProject(ProjectMessageDTO projectMessageDTO, String projectWaitingKey, String projectRunningKey,
-                             String userId) {
+    public void parseProject(ProjectMessageDTO projectMessageDTO, String projectRunningKey) {
         String projectId = projectMessageDTO.getProjectId();    // 项目 id
         ProjectPO projectPO = projectUtil.getProjectByProjectId(projectId);
         log.info("项目 " + projectId + " 信息为:" + projectPO);

+ 1 - 1
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/manager/ProjectManager.java

@@ -56,7 +56,7 @@ public class ProjectManager {
         String replace4 = replace3.replace("kafka-ip", kafkaIp);
         String replace5 = replace4.replace("kafka-partition", "\"" + kafkaPartition + "\"");
         String replace6 = replace5.replace("kafka-offset", "\"" + kafkaOffset + "\"");
-        String replace7 = replace6.replace("minio-ip", minioConfiguration.getEndpoint());
+        String replace7 = replace6.replace("minio-ip", minioConfiguration.getEndpointWithoutHttp());
         String replace8 = replace7.replace("minio-access-key", minioConfiguration.getAccessKey());
         String replace9 = replace8.replace("minio-secret-key", minioConfiguration.getSecretKey());
         String replace10 = replace9.replace("pod-name", podName); // pod 名称包括 projectId 和 随机字符串

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

@@ -121,7 +121,7 @@ public class ProjectScheduler {
             }
             // -------------------------------- 项目没有执行说明等待中 --------------------------------
             if (isSystem) { // 系统管理员直接执行
-                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey(), userId);
+                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
                 return;
             }
             int simulationLicenseNumber = clusterPO.getNumSimulationLicense();
@@ -139,21 +139,21 @@ public class ProjectScheduler {
                     }
                     if (parallelismSum < simulationLicenseNumber) { // 已经运行的项目小于集群允许运行的项目则,运行新的项目
                         if (parallelismSum + parallelism < simulationLicenseNumber) {
-                            run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey(), userId);
+                            run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
                             return;
                         }
                     }
                 }
             }
             if ((CollectionUtil.isEmpty(keySetOfAllProjectOfCluster) || CollectionUtil.isEmpty(keyListOfRunningProject)) && parallelism < simulationLicenseNumber) {
-                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey(), userId);
+                run(clusterId, projectId, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey());
             }
         }
     }
 
 
     @SneakyThrows
-    public void run(String clusterId, String projectId, String projectWaitingKey, String projectRunningKey, String userId) {
+    public void run(String clusterId, String projectId, String projectWaitingKey, String projectRunningKey) {
         ProjectMessageDTO projectMessageDTO;
         try {
             projectMessageDTO = JsonUtil.jsonToBean(RedisUtil.getStringByKey(stringRedisTemplate, projectWaitingKey), ProjectMessageDTO.class);
@@ -171,7 +171,7 @@ public class ProjectScheduler {
         if (restParallelism > 0L) {
             log.info("ProjectScheduler--run 集群 " + clusterId + " 执行项目项目 " + projectId);
             projectMessageDTO.setCurrentParallelism(restParallelism);    // 设置实际的并行度
-            projectConsumer.parseProject(projectMessageDTO, projectWaitingKey, projectRunningKey, userId);
+            projectConsumer.parseProject(projectMessageDTO, projectRunningKey);
         }
     }
 

+ 2 - 1
simulation-resource-video/src/main/java/com/css/simulation/resource/video/service/VideoService.java

@@ -95,12 +95,13 @@ public class VideoService {
         //3 生成 xosc 文件
         String xoscPath = generateXosc(rootDirectoryPathOfLinux, xodrPathOfLinux, osgbPathOfLinux, projectId, projectType);
         // 启动虚拟窗口
-        log.info("生成xosc文件路径-----" + xoscPath);
+        log.info("生成 xosc 文件路径-----" + xoscPath);
         //4 生成图片
         String pictureDirectoryPath = rootDirectoryPathOfLinux + "picture";
         FileUtil.createDirectory(pictureDirectoryPath);
         String esminiCommandTemp = esminiCommand + " " + xoscPath + " " + pictureDirectoryPath + "/screenshot " + StringUtil.doubleToString(Double.parseDouble(maxSimulationTime), 2);
         LinuxUtil.execute2(XvfbCommand, esminiCommandTemp);
+        LinuxUtil.kill(esminiCommandTemp);  // 执行完许哟啊手动删除 esmini 进程
 //        String esminiResult = LinuxUtil.execute(esminiCommandTemp);
         int num = 14;
         for (int i = 0; i < num; i++) {