Jelajahi Sumber

场景计算通知接口增加防重复提交机制,详见计算失败群2026年3月27日12.04分聊天记录

dengsixing 1 Minggu lalu
induk
melakukan
08c2ab1964

+ 2 - 0
src/main/java/com/fdkankan/contro/service/IBuildService.java

@@ -11,4 +11,6 @@ public interface IBuildService {
 
     void writeDataJson(BuildSceneCallMessage message, JSONObject dataFdage, Map<String, String> dataMap, Map<String, Object> dataExtras);
 
+    void lockUnicode(String unicode, int lockTime);
+
 }

+ 17 - 0
src/main/java/com/fdkankan/contro/service/impl/BuildServiceImpl.java

@@ -3,12 +3,17 @@ package com.fdkankan.contro.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
 import com.fdkankan.contro.service.IBuildService;
 import com.fdkankan.model.enums.ModelTypeEnums;
 import com.fdkankan.model.utils.ComputerUtil;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
@@ -19,6 +24,9 @@ import java.util.Objects;
 @Service
 public class BuildServiceImpl implements IBuildService {
 
+    @Autowired
+    private RedisLockUtil lockUtil;
+
     @Override
     public Map<String, String> getTypeString(String cameraType, String algorithm, String resolution, JSONObject fdageData){
         Map<String, String> map = new HashMap<>();
@@ -111,4 +119,13 @@ public class BuildServiceImpl implements IBuildService {
         }
         ComputerUtil.createProjectAndDataFile(message.getPath(), message.getSceneNum(), dataMap.get("splitType"), dataMap.get("skyboxType"),null, dataExtras);
     }
+
+    @Override
+    public void lockUnicode(String unicode, int lockTime) {
+        String lockKey = "notice:build:unicode:" + unicode;
+        boolean lock = lockUtil.lock(lockKey, lockTime);
+        if(!lock){
+            throw new BusinessException(ErrorCode.FAILURE_CODE_2001);
+        }
+    }
 }

+ 10 - 0
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -207,6 +207,8 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
     private ISceneUploadCountService sceneUploadCountService;
     @Autowired
     private IWbService wbService;
+    @Autowired
+    private IBuildService buildService;
 
     @Override
     public SceneFileBuild findByFileId(String fileId) {
@@ -687,6 +689,10 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             folderName = fileBuild.getUnicode();
             redisUtil.set(String.format(RedisConstants.FILEID_FOLDER_BUILD, fileId), folderName, 2 * 24 * 60 * 60);
         }
+
+        //由于刘欢说相机网络不好,有时候会没接收到接口的返回信息,所以会触发重发机制,所以这里增加了防重复提交锁,锁住unicode两分钟,
+        buildService.lockUnicode(folderName, 120);
+
         sceneUploadCountService.resetCountByUuid(folderName);
 
         StringBuilder prefixBuffer = new StringBuilder(mac).append(File.separator).append(fileId).append(File.separator).append(folderName).append(File.separator);
@@ -838,6 +844,10 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             redisUtil.set(String.format(RedisConstants.FILEID_FOLDER_BUILD, fileId), folderName);
         }
 
+        //由于刘欢说相机网络不好,有时候会没接收到接口的返回信息,所以会触发重发机制,所以这里增加了防重复提交锁,锁住unicode两分钟,
+        // 这个方案是徐总同意了,详见计算失败群2026年3月27日12.04分聊天记录
+        buildService.lockUnicode(folderName, 120);
+
         sceneUploadCountService.resetCountByUuid(folderName);
 
         //云目录