Explorar el Código

计算流程优化改造

dengsixing hace 2 meses
padre
commit
167ab1a9f7

+ 8 - 0
src/main/java/com/fdkankan/contro/mq/service/JmgaService.java

@@ -0,0 +1,8 @@
+package com.fdkankan.contro.mq.service;
+
+public interface JmgaService {
+
+    void pushPre();
+
+
+}

+ 4 - 4
src/main/java/com/fdkankan/contro/mq/service/impl/BuildSceneServiceImpl.java

@@ -152,15 +152,15 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     public void buildScenePre(BuildSceneCallMessage message) throws Exception{
         boolean success = false;
         String num = message.getSceneNum();
-        String batchId = (String) message.getExt().get("batchId");
+        String batchIds = (String) message.getExt().get("batchId");
         String threeCamType = (String) message.getExt().get("threeCamType");
         try {
 
             //如果场景原始资源上传批次id不为空,则需要下载批次文件上传到oss目录
             if(StrUtil.isNotEmpty(threeCamType) && "yzl".equals(threeCamType)){
-                this.downloadOrigFile4Yzl(batchId, message.getPath());
+                this.downloadOrigFile4Yzl(batchIds, message.getPath());
             }else{
-                this.downloadOrigFile(batchId, message.getPath());
+                this.downloadOrigFile(batchIds, message.getPath());
             }
 
             //重新计算时需要删除文件夹,否知使用缓存
@@ -377,7 +377,7 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     public void buildScenePost(BuildSceneResultMqMessage message) throws Exception {
         String sceneCode = message.getBuildContext().get("sceneNum").toString();
         String path = message.getPath();
-        String batchId = (String) message.getExt().get("batchId");
+        String batchIds = (String) message.getExt().get("batchId");
         try {
 
             //如果场景被删除,就无需往下运行了

+ 95 - 0
src/main/java/com/fdkankan/contro/mq/service/impl/JmgaServiceImpl.java

@@ -0,0 +1,95 @@
+package com.fdkankan.contro.mq.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.SceneStatus;
+import com.fdkankan.contro.entity.OrigFileUploadBatch;
+import com.fdkankan.contro.entity.ScenePlus;
+import com.fdkankan.contro.mq.service.JmgaService;
+import com.fdkankan.contro.service.IOrigFileUploadBatchService;
+import com.fdkankan.contro.service.IOrigFileUploadService;
+import com.fdkankan.contro.service.IScenePlusService;
+import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
+import com.fdkankan.rabbitmq.util.RabbitMqProducer;
+import com.fdkankan.redis.util.RedisLockUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class JmgaServiceImpl implements JmgaService {
+
+    @Autowired
+    private IOrigFileUploadBatchService origFileUploadBatchService;
+    @Resource
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private IScenePlusService scenePlusService;
+    @Autowired
+    private IOrigFileUploadService origFileUploadService;
+    @Resource
+    private RabbitMqProducer rabbitMqProducer;
+    @Value("${queue.modeling.modeling-pre}")
+    private String queueModelingPre;
+
+
+    @Override
+    public void pushPre() {
+
+        log.info("推送计算定时任务开始");
+        boolean lock = redisLockUtil.lock("push-modeling-pre", 1800);
+        try {
+            if(!lock){
+                return;
+            }
+            log.info("获取到分布式锁");
+
+            List<OrigFileUploadBatch> list = origFileUploadBatchService.list(
+                    new LambdaQueryWrapper<OrigFileUploadBatch>()
+                            .eq(OrigFileUploadBatch::getStatus, 4)
+                            .orderByAsc(OrigFileUploadBatch::getCreateTime));
+            if(CollUtil.isEmpty(list)){
+                return;
+            }
+            for (OrigFileUploadBatch origFileUploadBatch : list) {
+                String uuid = origFileUploadBatch.getUuid();
+                try {
+                    ScenePlus scenePlus = scenePlusService.getByUuid(uuid);
+                    //如果场景计算中,跳过,等待下一次定时任务
+                    if(scenePlus.getSceneStatus() == SceneStatus.wait.code().intValue()){
+                        continue;
+                    }
+                    //过滤出同一个场景且待推送的上传批次
+                    Set<String> batchIds = list.stream().filter(v -> uuid.equals(v.getUuid())).map(v -> v.getBatchId()).collect(Collectors.toSet());
+                    BuildSceneCallMessage mqMessage = JSON.parseObject(origFileUploadBatch.getMqContent(), BuildSceneCallMessage.class);
+                    StringBuilder batchIdStr = new StringBuilder();
+                    for (String batchId : batchIds) {
+                        batchIdStr.append(",").append(batchId);
+                    }
+                    mqMessage.getExt().put("batchId", batchIdStr.substring(1));
+                    rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage);
+                    origFileUploadBatchService.update(new LambdaUpdateWrapper<OrigFileUploadBatch>().set(OrigFileUploadBatch::getStatus, 4).in(OrigFileUploadBatch::getBatchId, batchIds));
+                }catch (Exception e){
+                    log.error("推送场景计算失败,uuid:{}", uuid, e);
+                }
+
+            }
+
+        }catch (Exception e){
+            log.info("推送计算定时任务报错");
+        }finally {
+            redisLockUtil.unlock("push-modeling-pre");
+        }
+
+        log.info("推送计算定时任务结束");
+    }
+}

+ 11 - 0
src/main/java/com/fdkankan/contro/schedule/ScheduleJob.java

@@ -1,5 +1,6 @@
 package com.fdkankan.contro.schedule;
 
+import com.fdkankan.contro.mq.service.JmgaService;
 import com.fdkankan.contro.service.IScene3dNumService;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,6 +13,8 @@ public class ScheduleJob {
 
     @Autowired
     private IScene3dNumService scene3dNumService;
+    @Autowired
+    private JmgaService jmgaService;
 
 
     /**
@@ -21,4 +24,12 @@ public class ScheduleJob {
     public void generateSceneNum() {
         scene3dNumService.generateSceneNumHandler();
     }
+
+    /**
+     * 定时生成场景码,间隔1小时执行一次,项目启动一秒后执行一次
+     */
+    @Scheduled(fixedDelay = 5*60*1000, initialDelay = 1000)
+    public void pushPre() {
+        jmgaService.pushPre();
+    }
 }

+ 2 - 4
src/main/java/com/fdkankan/contro/service/IScenePlusService.java

@@ -3,10 +3,6 @@ package com.fdkankan.contro.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fdkankan.contro.entity.ScenePlus;
 import com.fdkankan.web.response.ResultData;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import java.util.Map;
 
 /**
  * <p>
@@ -29,4 +25,6 @@ public interface IScenePlusService extends IService<ScenePlus> {
     Long sumUsedSpaceByCameraId(Long cameraId, String spaceTypeStr);
 
     String getRyIdByNum(String num);
+
+    ScenePlus getByUuid(String uuid);
 }

+ 6 - 5
src/main/java/com/fdkankan/contro/service/impl/SceneFileBuildServiceImpl.java

@@ -1426,6 +1426,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
                 && sdTilesSceneSourceList.contains(scenePlus.getSceneSource())){
             scenePlusExt.setModelKind(modelKind);
         }
+        scenePlusExt.setUpdateTime(new Date());
         scenePlusExtService.updateById(scenePlusExt);
 
         //记录日志表
@@ -1705,11 +1706,11 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             condition.setUuid(unicode);
             condition.setStatus(0);
             OrigFileUploadBatch origFileUploadBatch = origFileUploadBatchService.getByCondition(condition);
-            origFileUploadBatch.setStatus(1);
+            origFileUploadBatch.setStatus(4);//修改为等待通知计算状态,由定时任务统一分配计算
             origFileUploadBatch.setMqContent(JSON.toJSONString(mqMessage));
-            origFileUploadBatch.setNoticeTimes(origFileUploadBatch.getNoticeTimes() + 1);
-            mqMessage.getExt().put("batchId", origFileUploadBatch.getBatchId());
-            mqMessage.getExt().put("noticeTimes", origFileUploadBatch.getNoticeTimes());
+//            origFileUploadBatch.setNoticeTimes(origFileUploadBatch.getNoticeTimes() + 1);
+//            mqMessage.getExt().put("batchId", origFileUploadBatch.getBatchId());
+//            mqMessage.getExt().put("noticeTimes", origFileUploadBatch.getNoticeTimes());
             origFileUploadBatchService.updateById(origFileUploadBatch);
             redisUtil.del("single:upload:uuid:" + unicode);
         }
@@ -1726,7 +1727,7 @@ public class SceneFileBuildServiceImpl extends ServiceImpl<ISceneFileBuildMapper
             log.info("推送事件失败,param:{}", param);
         }
 
-        rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage);
+//        rabbitMqProducer.sendByWorkQueue(queueModelingPre, mqMessage);
 
         return scenePlusVO;
     }

+ 12 - 3
src/main/java/com/fdkankan/contro/service/impl/ScenePlusServiceImpl.java

@@ -1,7 +1,6 @@
 package com.fdkankan.contro.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.*;
@@ -20,8 +19,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
 
-import java.util.Objects;
-
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -44,6 +41,8 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
     private ICameraDetailService cameraDetailService;
     @Autowired
     private IJyUserService jyUserService;
+    @Autowired
+    private IScenePlusService scenePlusService;
 
     @Override
     public ScenePlus getScenePlusByNum(String num) {
@@ -152,4 +151,14 @@ public class ScenePlusServiceImpl extends ServiceImpl<IScenePlusMapper, ScenePlu
         JyUser jyUser = jyUserService.getByUserId(userId);
         return jyUser.getRyId();
     }
+
+    @Override
+    public ScenePlus getByUuid(String uuid) {
+        ScenePlusExt scenePlusExt = scenePlusExtService.getOne(new LambdaQueryWrapper<ScenePlusExt>().like(ScenePlusExt::getDataSource, uuid));
+        if(Objects.isNull(scenePlusExt)){
+            return null;
+        }
+        ScenePlus scenePlus = scenePlusService.getById(scenePlusExt.getPlusId());
+        return scenePlus;
+    }
 }