Sfoglia il codice sorgente

Merge branch 'release' into project-zgwhzx

dengsixing 9 mesi fa
parent
commit
2f6da46853

+ 3 - 2
src/main/java/com/fdkankan/modeling/entity/BuildLog.java

@@ -12,10 +12,10 @@ import lombok.Setter;
 
 /**
  * <p>
- * 
+ *
  * </p>
  *
- * @author 
+ * @author
  * @since 2022-04-07
  */
 @Getter
@@ -78,6 +78,7 @@ public class BuildLog implements Serializable {
      * 0:场景计算
      * 1:标定算法,
      * 2:只生激光场景OBJ文件
+     * 3:生成e57
      */
     @TableField("build_type")
     private Integer buildType;

+ 121 - 8
src/main/java/com/fdkankan/modeling/receiver/RabbitMqListener.java

@@ -1,8 +1,8 @@
 package com.fdkankan.modeling.receiver;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
-import com.fdkankan.common.constant.CommonOperStatus;
 import com.fdkankan.common.constant.ModelingBuildStatus;
 import com.fdkankan.common.util.FileUtils;
 import com.fdkankan.model.utils.ComputerUtil;
@@ -14,9 +14,7 @@ import com.fdkankan.modeling.exception.BuildException;
 import com.fdkankan.modeling.handler.LaserSceneObjGenerateHandler;
 import com.fdkankan.modeling.service.IBuildLogService;
 import com.fdkankan.modeling.service.IBuildService;
-import com.fdkankan.modeling.service.IMqEcsService;
 import com.fdkankan.modeling.service.ISceneBuildProcessLogService;
-import com.fdkankan.modeling.service.impl.MqEcsServiceImpl;
 import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneProcessLogMessage;
 import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
@@ -24,7 +22,6 @@ import com.fdkankan.rabbitmq.util.RabbitMqProducer;
 import com.fdkankan.redis.util.RedisLockUtil;
 import com.fdkankan.redis.util.RedisUtil;
 import com.rabbitmq.client.Channel;
-import com.fdkankan.model.constants.SceneBuildProcessType;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.StopWatch;
@@ -112,6 +109,11 @@ public class RabbitMqListener {
             log.error("消息内容错误,id:{},消息体:{}", messageId, msg);
             return;
         }
+        String bizType = buildSceneMessage.getBizType();
+        if(StrUtil.isEmpty(bizType)){
+            bizType = "standard";
+            buildSceneMessage.setBizType(bizType);
+        }
 
         //计算暂停锁,计算中锁。弹性伸缩控制服务使用
         String modelingKey = String.format(RedisKey.modelingKey,SysConstants.hostName);
@@ -127,12 +129,18 @@ public class RabbitMqListener {
         }
 
         BuildLog buildLog = new BuildLog();
-        log.info("场景计算开始,队列名:{},id:{},deliveryTag:{},消息体:{}", queueModelingCall, messageId,deliveryTag,msg);
+        log.info("场景计算开始,队列名:{},id:{},deliveryTag:{},消息体:{}", queueNameService.getQueueName(), messageId,deliveryTag,msg);
         buildLog.setMessageId(messageId);
         buildLog.setContent(msg);
 
-        this.process(buildSceneMessage,buildLog);
-        log.info("场景计算结束,队列名:{},id:{}", queueModelingCall, messageId);
+        Map<String, Object> ext = buildSceneMessage.getExt();
+        if("e57".equals(bizType)){
+            this.process4E57(buildSceneMessage,buildLog);
+        }else{
+            this.process(buildSceneMessage,buildLog);
+        }
+
+        log.info("场景计算结束,队列名:{},id:{}", queueNameService.getQueueName(), messageId);
 
         //计算完毕,将当前系统构建状态改为false
         redisUtil.del(modelingKey);
@@ -255,6 +263,12 @@ public class RabbitMqListener {
 
         String splitType = dataMap.get("splitType");
         String skyboxType = dataMap.get("skyboxType");
+        if(Objects.nonNull(message.getExt().get("splitType"))){
+            splitType = (String) message.getExt().get("splitType");
+        }
+        if(Objects.nonNull(message.getExt().get("skyboxType"))){
+            skyboxType = (String) message.getExt().get("skyboxType");
+        }
 
         ComputerUtil.createProjectAndDataFile(path,num, splitType, skyboxType,null,null);
         //计算模型并返回需要上传oss的文件集合
@@ -270,6 +284,33 @@ public class RabbitMqListener {
         return ModelingBuildStatus.SUCCESS;
     }
 
+    private ModelingBuildStatus buildScene4E57(BuildSceneCallMessage message, BuildSceneResultBean buildSceneResult) throws Exception{
+        //如果mq生产者在消息体中设置了结算结果mq队列名,就发到这个队列,否则就发送到默认队列
+        String path = message.getPath();
+        String num = message.getSceneNum();
+        //不同的相机不同的方法
+        String cameraType = message.getCameraType();
+        buildSceneResult.setCameraType(cameraType);
+        buildSceneResult.setNum(num);
+        buildSceneResult.setPath(path);
+
+        String splitType = "SPLIT_V27";
+        String skyboxType = "SKYBOX_V5";
+
+        ComputerUtil.createProjectAndDataFile(path,num, splitType, skyboxType,null,null);
+        //计算模型并返回需要上传oss的文件集合
+        ComputerUtil.computer(num, path, "V3");
+
+        // 检测计算结果文件是否有生成
+        String resultsPath = path + File.separator + "results" + File.separator;
+        boolean success = ComputerUtil.checkComputeCompleted(resultsPath + "upload.json", 5, 300L);
+        if (!success) {
+            log.error("未检测到计算结果文件:upload.json");
+            return ModelingBuildStatus.FAILED;
+        }
+        return ModelingBuildStatus.SUCCESS;
+    }
+
     private void afterBuild(BuildSceneCallMessage message, BuildSceneResultBean buildSceneResult, BuildLog buildLog){
         ModelingBuildStatus buildStatus = null;
         try {
@@ -300,7 +341,7 @@ public class RabbitMqListener {
      */
     private void sendCallBuildProcessLog(BuildSceneCallMessage message, ModelingBuildStatus buildStatus){
         rabbitMqProducer.sendByWorkQueue(queueModelingProcessLog,
-                BuildSceneProcessLogMessage.builder().num(message.getSceneNum()).buildStatus(buildStatus.code()).queueName(queueNameService.getQueueName()).build());
+                BuildSceneProcessLogMessage.builder().num(message.getSceneNum()).buildStatus(buildStatus.code()).queueName(queueNameService.getQueueName()).bizType(message.getBizType()).build());
     }
 
     private void preBuild(Map<String,Object> buildContext,BuildSceneCallMessage message, BuildLog buildLog) throws BuildException {
@@ -358,8 +399,80 @@ public class RabbitMqListener {
                 .computeTime(buildSceneResult.getDuration())
                 .path(buildSceneResult.getPath())
                 .hostName(SysConstants.hostName)
+                .ext(message.getExt())
                 .build();
         buildResult.setBuildContext(message.getBuildContext());
         rabbitMqProducer.sendByWorkQueue(buildSceneResult.getResultQueueName(),buildResult);
     }
+
+    public void process4E57(BuildSceneCallMessage message,BuildLog buildLog) {
+        //开始计时
+        StopWatch watch = new StopWatch();
+        watch.start();
+
+        //发送记录计算状态为计算中
+        this.sendCallBuildProcessLog(message, ModelingBuildStatus.CALCULATING);
+
+        BuildSceneResultBean buildSceneResult = new BuildSceneResultBean();
+        buildSceneResult.setResultQueueName(message.getResultReceiverMqName());
+        ModelingBuildStatus status = null;
+        Future<ModelingBuildStatus> future = null;
+        try {
+            // 初始化日志参数
+            buildLog.setHostName(SysConstants.hostName);
+            buildLog.setQueueName(queueNameService.getQueueName());
+            buildLog.setSceneNum(message.getSceneNum());
+            buildLog.setDataSource(message.getPath());
+            buildLog.setCreateTime(new Date());
+            buildLog.setUpdateTime(new Date());
+            buildLog.setBuildType(3);
+            buildLog.setStatus(0);
+            buildLogService.save(buildLog);
+
+            future = SysConstants.executorService.submit(() -> {
+                try {
+                    return buildScene4E57(message, buildSceneResult);
+                } catch (Exception e) {
+                    log.error("服务实例:{} 构建异常:", SysConstants.hostName, e);
+                    e.printStackTrace();
+                    return ModelingBuildStatus.FAILED;
+                }
+            });
+            status = future.get(SysConstants.modelTimeOut, TimeUnit.HOURS);
+
+            //结束计时
+            watch.stop();
+            buildLog.setDuration(watch.getTime(TimeUnit.SECONDS));
+        } catch (TimeoutException ex) {
+            log.error("服务实例:{} 构建异常:",SysConstants.hostName,ex);
+            status = ModelingBuildStatus.OVERTIME;
+            log.info("释放线程");
+            //场景计算超时,需要中断当前执行任务,释放线程池中的任务线程,否则下个场景计算获取不到线程进行计算
+            future.cancel(true);
+        } catch (BuildException e){
+            status = e.getBuildStatus();
+        } catch(Exception e) {
+            log.error("服务实例:{} 构建异常:", SysConstants.hostName, e);
+            if (e.getCause() instanceof BuildException) {
+                status = ((BuildException) e.getCause()).getBuildStatus();
+                buildLog.setStatus(((BuildException) e.getCause()).getBuildStatus().code());
+            } else {
+                status = ModelingBuildStatus.FAILED;
+            }
+        }
+        buildLog.setStatus(status.code());
+        buildSceneResult.setCameraType(message.getCameraType());
+        buildSceneResult.setBuildStatus(status);
+        //计算后处理
+        ModelingBuildStatus buildStatus = null;
+        buildStatus = buildSceneResult.getBuildStatus();
+        log.info("服务{} 计算结束:{},计算状态:{}", SysConstants.hostName, buildLog.getSceneNum(),buildStatus.message());
+        buildLog.setUpdateTime(new Date());
+        buildLog.setResultQuequeName(buildSceneResult.getResultQueueName());
+        buildLogService.updateById(buildLog);
+        //发送计算结果mq
+        buildSceneResult.setDuration(buildLog.getDuration());
+        this.sendCallResult(message, buildSceneResult);
+        this.sendCallBuildProcessLog(message, buildStatus);
+    }
 }