Explorar el Código

优化构建逻辑

tianboguang hace 2 años
padre
commit
bcbaa38181

+ 7 - 0
src/main/java/com/fdkankan/contro/constant/RedisConstants.java

@@ -0,0 +1,7 @@
+package com.fdkankan.contro.constant;
+
+public class RedisConstants {
+    public static final String FOLDER_FILEID_BUILD = "model-controls:folder:%s";
+    public static final String FILEID_FOLDER_BUILD = "model-controls:fileId:%s";
+    public static final String FOLDER_LOCK_BUILD = "model-controls:lock:%s";
+}

+ 45 - 61
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -14,6 +14,7 @@ import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.common.util.DateExtUtil;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.common.util.SnowflakeIdGenerator;
+import com.fdkankan.contro.constant.RedisConstants;
 import com.fdkankan.contro.entity.*;
 import com.fdkankan.contro.mapper.ISceneFileBuildMapper;
 import com.fdkankan.contro.service.*;
@@ -169,51 +170,46 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         }
 
         log.info("mac:{} 准备上传文件,folderName:{}", mac, folderName);
-        String dataSource = scenePlusService.getDataSourceLikeUnicode("/" + folderName);
-        if(StrUtil.isNotEmpty(dataSource)){
-            int n = dataSource.split("/").length;
-            if(n > 1){
-                String fileId = dataSource.split("/")[n - 2];
-
-                ResponseSceneFile responseSceneFile = new ResponseSceneFile();
-                responseSceneFile.setFileId(fileId);
-                //可以重复上传,文件id保存50年(因为该redis工具无法设置永久保存)
-                redisUtil.set(fileId, folderName, 1537920000);
-                return responseSceneFile;
-            }
+        ResponseSceneFile responseSceneFile = new ResponseSceneFile();
 
-        }else {
-            SceneFileBuild sceneFileBuild = this.findByUnicode(folderName);
-            if(sceneFileBuild != null){
-                String fileId = sceneFileBuild.getFileId();
-
-                ResponseSceneFile responseSceneFile = new ResponseSceneFile();
-                responseSceneFile.setFileId(fileId);
-                //可以重复上传,文件id保存50年(因为该redis工具无法设置永久保存)
-                redisUtil.set(fileId, folderName, 1537920000);
-                return responseSceneFile;
-            }
+        // 检测是否有生成
+        String fileId = redisUtil.get(String.format(RedisConstants.FOLDER_FILEID_BUILD, folderName));
+        if (!ObjectUtils.isEmpty(fileId)) {
+            responseSceneFile.setFileId(fileId);
+            return responseSceneFile;
+        }
+
+        SceneFileBuild sceneFileBuild = this.findByUnicode(folderName);
+        if (sceneFileBuild != null) {
+            fileId = sceneFileBuild.getFileId();
+            responseSceneFile.setFileId(fileId);
+            //可以重复上传,文件id保存50年(因为该redis工具无法设置永久保存)
+            redisUtil.set(String.format(RedisConstants.FOLDER_FILEID_BUILD, folderName), fileId);
+            return responseSceneFile;
+        }
+
+        // 加锁
+        long incr = redisUtil.incr(String.format(RedisConstants.FOLDER_LOCK_BUILD, folderName), 1);
+        if (incr > 1) {
+            throw new BusinessException(ErrorCode.FAILURE_CODE_5052);
         }
+        redisUtil.expire(String.format(RedisConstants.FOLDER_LOCK_BUILD, folderName), 120);
+
         log.info("开始新生成build数据");
-        // 构造方法设置机器码:第0个机房的第0台机器
-        SnowflakeIdGenerator snowflakeIdGenerator = new SnowflakeIdGenerator(0, 0);
-        long fileId = snowflakeIdGenerator.nextId();
+        fileId = new SnowflakeIdGenerator(0, 0).nextId() + "";
         log.info("新生成build数据,{}", fileId);
 
-        SceneFileBuild sceneFileBuild = new SceneFileBuild();
+        sceneFileBuild = new SceneFileBuild();
         sceneFileBuild.setChildName(mac);
-        sceneFileBuild.setFileId(String.valueOf(fileId));
+        sceneFileBuild.setFileId(fileId);
         sceneFileBuild.setUnicode(folderName);
-        sceneFileBuild.setUploadStatus(0);
-        sceneFileBuild.setBuildStatus(0);
         sceneFileBuild.setTotalPicNum(Integer.valueOf(totalPicNum));
         sceneFileBuild.setChunks(Integer.valueOf(chunks));
         this.save(sceneFileBuild);
+        redisUtil.set(String.format(RedisConstants.FOLDER_FILEID_BUILD, folderName), fileId);
+        redisUtil.set(String.format(RedisConstants.FILEID_FOLDER_BUILD, fileId), folderName);
 
-        ResponseSceneFile responseSceneFile = new ResponseSceneFile();
-        responseSceneFile.setFileId(String.valueOf(fileId));
-        //可以重复上传,文件id保存50年(因为该redis工具无法设置永久保存)
-        redisUtil.set(String.valueOf(fileId), folderName, 1537920000);
+        responseSceneFile.setFileId(fileId);
         return responseSceneFile;
     }
 
@@ -376,21 +372,15 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         }
         String mac = strArr[0];
         String fileId = strArr[1];
-        Object folderNameObject = redisUtil.get(fileId);
-        String folderName = folderNameObject == null ? null : (String)folderNameObject;
-        if(StringUtils.isEmpty(folderName)){
-            ScenePlus scenePlus = scenePlusService.getByFileId("/" + fileId + "/");
-            if(scenePlus != null){
-                ScenePlusExt plusExt = scenePlusExtService.getScenePlusExtByPlusId(scenePlus.getId());
-                folderName = plusExt.getDataSource().substring(plusExt.getDataSource().lastIndexOf("/") + 1);
-            }
+        String folderName = redisUtil.get(String.format(RedisConstants.FILEID_FOLDER_BUILD, fileId));
 
-            if(StringUtils.isEmpty(folderName)){
-                SceneFileBuild sceneFileBuild = this.findByFileId(fileId);
-                if(sceneFileBuild != null){
-                    folderName = sceneFileBuild.getUnicode();
-                }
+        if(StringUtils.isEmpty(folderName)){
+            SceneFileBuild fileBuild = findByFileId(fileId);
+            if(ObjectUtils.isEmpty(fileBuild)){
+                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
             }
+            folderName = fileBuild.getUnicode();
+            redisUtil.set(String.format(RedisConstants.FILEID_FOLDER_BUILD, fileId), folderName);
         }
         StringBuilder prefixBuffer = new StringBuilder(mac).append(File.separator).append(fileId).append(File.separator).append(folderName).append(File.separator);
 
@@ -434,23 +424,17 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
         }
         String mac = strArr[0];
         String fileId = strArr[1];
-        Object folderNameObject = redisUtil.get(fileId);
-        String folderName = folderNameObject == null ? null : (String)folderNameObject;
-        if(StringUtils.isEmpty(folderName)){
-            ScenePlusExt scenePlusExt = scenePlusExtService.list(
-                    new LambdaQueryWrapper<ScenePlusExt>()
-                            .like(ScenePlusExt::getDataSource, "%/" + fileId + "/%")).get(0);
-            if(scenePlusExt != null){
-                folderName = scenePlusExt.getDataSource().substring(scenePlusExt.getDataSource().lastIndexOf("/") + 1);
-            }
+        String folderName = redisUtil.get(String.format(RedisConstants.FILEID_FOLDER_BUILD, fileId));
 
-            if(StringUtils.isEmpty(folderName)){
-                SceneFileBuild sceneFileBuild = this.findByFileId(fileId);
-                if(sceneFileBuild != null){
-                    folderName = sceneFileBuild.getUnicode();
-                }
+        if(StringUtils.isEmpty(folderName)){
+            SceneFileBuild fileBuild = findByFileId(fileId);
+            if(ObjectUtils.isEmpty(fileBuild)){
+                throw new BusinessException(ErrorCode.FAILURE_CODE_5012);
             }
+            folderName = fileBuild.getUnicode();
+            redisUtil.set(String.format(RedisConstants.FILEID_FOLDER_BUILD, fileId), folderName);
         }
+
         //判断 是否为激光相机
         Camera camera = cameraService.getByChildName(mac);
         CameraDetail cameraDetail = cameraDetailService.getByCameraId(camera.getId());