Переглянути джерело

场景计算流程状态日志记录

dsx 2 роки тому
батько
коміт
cb45a1d564

+ 32 - 7
src/main/java/com/fdkankan/contro/mq/listener/AbstrackBuildSceneListener.java

@@ -1,8 +1,12 @@
 package com.fdkankan.contro.mq.listener;
 
+import cn.hutool.core.exceptions.ExceptionUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonOperStatus;
 import com.fdkankan.contro.constant.RedisConstants;
 import com.fdkankan.contro.mq.service.IBuildSceneService;
+import com.fdkankan.contro.service.ISceneBuildProcessLogService;
+import com.fdkankan.model.constants.SceneBuildProcessType;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
 import com.fdkankan.redis.util.RedisLockUtil;
@@ -21,6 +25,8 @@ public class AbstrackBuildSceneListener implements IBuildSceneListener {
 
     @Autowired
     private RedisLockUtil redisLockUtil;
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
 
     @Override
     public void preHandle(Channel channel, String queueName, Message message, IBuildSceneService buildSceneService) throws IOException {
@@ -39,13 +45,23 @@ public class AbstrackBuildSceneListener implements IBuildSceneListener {
         String msg = new String(message.getBody(), StandardCharsets.UTF_8);
         log.info("开始准备场景计算资源,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         BuildSceneCallMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneCallMessage.class);
-        if(ObjectUtils.isEmpty(buildSceneMessage.getBuildContext())){
-            buildSceneMessage.setBuildContext(new HashMap<>());
-        }
-        if(!ObjectUtils.isEmpty(buildSceneMessage.getSceneNum())){
-            buildSceneMessage.getBuildContext().put("sceneNum",buildSceneMessage.getSceneNum());
+        String num = buildSceneMessage.getSceneNum();
+        try {
+            if(ObjectUtils.isEmpty(buildSceneMessage.getBuildContext())){
+                buildSceneMessage.setBuildContext(new HashMap<>());
+            }
+            if(!ObjectUtils.isEmpty(buildSceneMessage.getSceneNum())){
+                buildSceneMessage.getBuildContext().put("sceneNum",buildSceneMessage.getSceneNum());
+            }
+            //记录日志
+            sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName, CommonOperStatus.WAITING.code(), null);
+            buildSceneService.buildScenePre(buildSceneMessage);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName, CommonOperStatus.SUCCESS.code(), null);
+        }catch (Exception e){
+            log.error("场景计算前置处理出错,num=" + num, e);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueName, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
         }
-        buildSceneService.buildScenePre(buildSceneMessage);
         log.info("准备场景计算资源完成,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     }
@@ -67,7 +83,16 @@ public class AbstrackBuildSceneListener implements IBuildSceneListener {
         String msg = new String(message.getBody(), StandardCharsets.UTF_8);
         log.info("场景计算完成,开始处理场景计算结果,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         BuildSceneResultMqMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneResultMqMessage.class);
-        buildSceneService.buildScenePost(buildSceneMessage);
+        String num = buildSceneMessage.getBuildContext().get("sceneNum").toString();
+        try {
+            sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName, CommonOperStatus.WAITING.code(), null);
+            buildSceneService.buildScenePost(buildSceneMessage);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName, CommonOperStatus.SUCCESS.code(), null);
+        }catch (Exception e){
+            log.error("场景计算结果处理出错,num=" + num, e);
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.POST.code(), queueName, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
+        }
         log.info("场景计算结果处理完成,队列名:{},id:{},消息体:{}", queueName, messageId, msg);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     }

+ 65 - 0
src/main/java/com/fdkankan/contro/mq/listener/BuildSceneProcessLogListener.java

@@ -0,0 +1,65 @@
+package com.fdkankan.contro.mq.listener;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.CommonOperStatus;
+import com.fdkankan.common.constant.ModelingBuildStatus;
+import com.fdkankan.contro.service.ISceneBuildProcessLogService;
+import com.fdkankan.model.constants.SceneBuildProcessType;
+import com.fdkankan.rabbitmq.bean.BuildSceneProcessLogMessage;
+import com.rabbitmq.client.Channel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.amqp.core.Message;
+import org.springframework.amqp.rabbit.annotation.Queue;
+import org.springframework.amqp.rabbit.annotation.RabbitListener;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.StandardCharsets;
+
+@Slf4j
+@Component
+public class BuildSceneProcessLogListener{
+
+    @Value("${ueue.modeling.modeling-process-log}")
+    private String queueModelingProcessLog;
+    @Value("${queue.modeling.modeling-call}")
+    private String queueModelingCall;
+
+    @Autowired
+    private ISceneBuildProcessLogService sceneBuildProcessLogService;
+
+    /**
+     * 场景计算状态日志记录
+     * @param channel
+     * @param message
+     * @throws Exception
+     */
+    @RabbitListener(
+            queuesToDeclare = @Queue("${queue.modeling.modeling-process-log}")
+    )
+    public void buildScenePreHandler(Channel channel, Message message) throws Exception {
+        String msg = new String(message.getBody(), StandardCharsets.UTF_8);
+        BuildSceneProcessLogMessage buildSceneMessage = JSONObject.parseObject(msg, BuildSceneProcessLogMessage.class);
+        String num = buildSceneMessage.getNum();
+        try {
+            int buildStatus = buildSceneMessage.getBuildStatus();
+            //新的计算开始,需要将之前的记录置为失效
+            if(buildStatus == ModelingBuildStatus.CALCULATING.code()){
+                sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.CALL.code(),queueModelingCall);
+            }
+            int status = CommonOperStatus.SUCCESS.code();
+            String reason = null;
+            if(buildStatus != ModelingBuildStatus.SUCCESS.code()){
+                status = CommonOperStatus.FAILD.code();
+                reason = ModelingBuildStatus.get(buildStatus).message();
+            }
+            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.CALL.code(), queueModelingCall, status, reason);
+        }catch (Exception e){
+            log.error("场景计算流程状态日志记录出错, num="+num, e);
+        }finally {
+            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
+        }
+    }
+
+}

+ 1 - 1
src/main/java/com/fdkankan/contro/mq/service/IBuildSceneService.java

@@ -13,7 +13,7 @@ import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
  **/
 public interface IBuildSceneService {
 
-    void buildScenePre(BuildSceneCallMessage message);
+    void buildScenePre(BuildSceneCallMessage message) throws Exception;
 
     void downLoadSource(BuildSceneCallMessage buildSceneMqMessage, String path) throws Exception;
 

+ 5 - 18
src/main/java/com/fdkankan/contro/mq/service/impl/BuildObjServiceImpl.java

@@ -78,14 +78,10 @@ public class BuildObjServiceImpl implements IBuildSceneService {
     private ISceneBuildProcessLogService sceneBuildProcessLogService;
 
     @Override
-    public void buildScenePre(BuildSceneCallMessage message) {
+    public void buildScenePre(BuildSceneCallMessage message) throws Exception{
         boolean success = false;
         String num = message.getSceneNum();
         try {
-            //记录日志
-            sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueObjModelingPre);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueObjModelingPre, CommonOperStatus.WAITING.code(), null);
-
             String path = message.getPath();
             //根据相机类型,组装资源路径
             String laserObjFilePath = path + "_laser_obj";
@@ -124,21 +120,18 @@ public class BuildObjServiceImpl implements IBuildSceneService {
             //发送mq,就进行计算
             mqProducer.sendByWorkQueue(queueModelingCall, message);
 
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueObjModelingPre, CommonOperStatus.SUCCESS.code(), null);
-
             success = true;
 
             log.info("场景计算资源准备结束,场景码:{}", message.getSceneNum());
 
         }catch (Exception e){
-            log.error("场景计算前置处理出错", e);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueObjModelingPre, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            log.error("生成OBJ场景资源准备异常,num=" + num, e);
+            throw e;
         }finally {
             //如果前置处理失败,发送钉钉消息
             if(!success){
                 buildSceneDTService.handBaseFail("生成OBJ场景资源准备异常", message.getPath(), message.getSceneNum(), "计算控制服务器");
             }
-
         }
     }
 
@@ -164,10 +157,6 @@ public class BuildObjServiceImpl implements IBuildSceneService {
         String projectNum = message.getBuildContext().get("sceneNum").toString();
         boolean success = false;
         try {
-            //记录日志
-            sceneBuildProcessLogService.clearSceneBuildProcessLog(projectNum, SceneBuildProcessType.POST.code(), queueObjModelingPost);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(projectNum, SceneBuildProcessType.POST.code(), queueObjModelingPost, CommonOperStatus.WAITING.code(), null);
-
             if (!message.getBuildSuccess()) {
                 log.error("生成OBJ场景计算失败!");
                 // 发送钉钉消息,计算失败
@@ -234,13 +223,11 @@ public class BuildObjServiceImpl implements IBuildSceneService {
             // 如果未升级V4,则升级V4
             fdkkV4Service.upgradeToV4(projectNum);
 
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(projectNum, SceneBuildProcessType.POST.code(), queueObjModelingPost, CommonOperStatus.SUCCESS.code(), null);
-
             success = true;
 
         }catch (Exception e){
-            log.error("场景计算结果处理出错,num=" + projectNum, e);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(projectNum, SceneBuildProcessType.POST.code(), queueObjModelingPost, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            log.error("生成OBJ场景计算结果处理异常,num=" + projectNum, e);
+            throw e;
         }finally {
             if(!success){
                 buildSceneDTService.handBaseFail("生成OBJ场景计算结果处理异常", message.getPath(), projectNum, "计算控制服务器");

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

@@ -127,15 +127,10 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
     private ISceneBuildProcessLogService sceneBuildProcessLogService;
 
     @Override
-    public void buildScenePre(BuildSceneCallMessage message) {
+    public void buildScenePre(BuildSceneCallMessage message) throws Exception{
         boolean success = false;
         String num = message.getSceneNum();
         try {
-
-            //记录日志
-            sceneBuildProcessLogService.clearSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueModelingPre);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueModelingPre, CommonOperStatus.WAITING.code(), null);
-
             //重新计算时需要删除文件夹,否知使用缓存
             if(new File(message.getPath() + File.separator + "results").exists()){
                 FileUtils.deleteDirectory(message.getPath() + File.separator + "results");
@@ -179,15 +174,13 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
                 mqProducer.sendByWorkQueue(singleModelingCall, message);
             }
 
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueModelingPre, CommonOperStatus.SUCCESS.code(), null);
-
             success = true;
 
             log.info("场景计算资源准备结束,场景码:{}", message.getSceneNum());
 
         }catch (Exception e){
-            log.error("场景计算前置处理出错", e);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(num, SceneBuildProcessType.PRE.code(), queueModelingPre, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            log.error("场景计算前置处理出错,num"+num, e);
+            throw e;
         }finally {
             //如果前置处理失败,发送钉钉消息
             if(!success){
@@ -219,11 +212,6 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
         String sceneCode = message.getBuildContext().get("sceneNum").toString();
         String path = message.getPath();
         try {
-
-            //记录日志
-            sceneBuildProcessLogService.clearSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueModelingPost);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueModelingPost, CommonOperStatus.WAITING.code(), null);
-
             // 上传计算日志
             //如果是重复计算,没有走到计算逻辑,不需要上传日志文件
             log.info("开始上传计算日志");
@@ -343,18 +331,14 @@ public class BuildSceneServiceImpl implements IBuildSceneService {
             String pushToken = fdageData.getString("pushToken");
             this.pushMsgToApp(pushChannel,pushToken, cameraType, scenePlus.getTitle(), scenePlusExt.getWebSite());
 
-
-
             CreateObjUtil.deleteFile(path.replace(ConstantFilePath.BUILD_MODEL_PATH, "/") + "/capture");
 
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueModelingPost, CommonOperStatus.SUCCESS.code(), null);
-
             log.info("场景计算结果处理结束,场景码:{}", sceneCode);
 
         }catch (Exception e){
-            log.error("场景计算结果处理出错!", e);
+            log.error("场景计算结果处理出错,num"+sceneCode, e);
             buildSceneDTService.handBaseFail("场景计算结果处理出错!", message.getPath(), sceneCode, "计算控制服务器");
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueModelingPost, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            throw e;
         }
     }
 

+ 2 - 8
src/main/java/com/fdkankan/contro/mq/service/impl/BuildV3SceneServiceImpl.java

@@ -188,10 +188,6 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
         String sceneCode = message.getBuildContext().get("sceneNum").toString();
         try {
 
-            //记录日志
-            sceneBuildProcessLogService.clearSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueV3ModelingPost);
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueV3ModelingPost, CommonOperStatus.WAITING.code(), null);
-
             Integer cameraType = Integer.parseInt(message.getBuildContext().get("cameraType").toString());
             Long computeTime = message.getComputeTime();
 
@@ -295,12 +291,10 @@ public class BuildV3SceneServiceImpl implements IBuildSceneService {
                 fdkkV4Service.upgradeToV4(sceneCode);
             }
 
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueV3ModelingPost, CommonOperStatus.SUCCESS.code(), null);
-
         }catch (Exception e){
-            log.error("场景计算结果处理出错!", e);
+            log.error("场景计算结果处理出错,num"+sceneCode, e);
             buildSceneDTService.handBaseFail("场景计算结果处理出错!", message.getPath(), sceneCode, "计算控制服务器");
-            sceneBuildProcessLogService.saveSceneBuildProcessLog(sceneCode, SceneBuildProcessType.POST.code(), queueV3ModelingPost, CommonOperStatus.FAILD.code(), ExceptionUtil.stacktraceToString(e, 3000));
+            throw e;
         }
     }