|
@@ -1,8 +1,8 @@
|
|
package com.fdkankan.modeling.receiver;
|
|
package com.fdkankan.modeling.receiver;
|
|
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
-import com.fdkankan.common.constant.CommonOperStatus;
|
|
|
|
import com.fdkankan.common.constant.ModelingBuildStatus;
|
|
import com.fdkankan.common.constant.ModelingBuildStatus;
|
|
import com.fdkankan.common.util.FileUtils;
|
|
import com.fdkankan.common.util.FileUtils;
|
|
import com.fdkankan.model.utils.ComputerUtil;
|
|
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.handler.LaserSceneObjGenerateHandler;
|
|
import com.fdkankan.modeling.service.IBuildLogService;
|
|
import com.fdkankan.modeling.service.IBuildLogService;
|
|
import com.fdkankan.modeling.service.IBuildService;
|
|
import com.fdkankan.modeling.service.IBuildService;
|
|
-import com.fdkankan.modeling.service.IMqEcsService;
|
|
|
|
import com.fdkankan.modeling.service.ISceneBuildProcessLogService;
|
|
import com.fdkankan.modeling.service.ISceneBuildProcessLogService;
|
|
-import com.fdkankan.modeling.service.impl.MqEcsServiceImpl;
|
|
|
|
import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
|
|
import com.fdkankan.rabbitmq.bean.BuildSceneCallMessage;
|
|
import com.fdkankan.rabbitmq.bean.BuildSceneProcessLogMessage;
|
|
import com.fdkankan.rabbitmq.bean.BuildSceneProcessLogMessage;
|
|
import com.fdkankan.rabbitmq.bean.BuildSceneResultMqMessage;
|
|
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.RedisLockUtil;
|
|
import com.fdkankan.redis.util.RedisUtil;
|
|
import com.fdkankan.redis.util.RedisUtil;
|
|
import com.rabbitmq.client.Channel;
|
|
import com.rabbitmq.client.Channel;
|
|
-import com.fdkankan.model.constants.SceneBuildProcessType;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.time.StopWatch;
|
|
import org.apache.commons.lang3.time.StopWatch;
|
|
@@ -112,6 +109,11 @@ public class RabbitMqListener {
|
|
log.error("消息内容错误,id:{},消息体:{}", messageId, msg);
|
|
log.error("消息内容错误,id:{},消息体:{}", messageId, msg);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ String bizType = buildSceneMessage.getBizType();
|
|
|
|
+ if(StrUtil.isEmpty(bizType)){
|
|
|
|
+ bizType = "standard";
|
|
|
|
+ buildSceneMessage.setBizType(bizType);
|
|
|
|
+ }
|
|
|
|
|
|
//计算暂停锁,计算中锁。弹性伸缩控制服务使用
|
|
//计算暂停锁,计算中锁。弹性伸缩控制服务使用
|
|
String modelingKey = String.format(RedisKey.modelingKey,SysConstants.hostName);
|
|
String modelingKey = String.format(RedisKey.modelingKey,SysConstants.hostName);
|
|
@@ -127,12 +129,18 @@ public class RabbitMqListener {
|
|
}
|
|
}
|
|
|
|
|
|
BuildLog buildLog = new BuildLog();
|
|
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.setMessageId(messageId);
|
|
buildLog.setContent(msg);
|
|
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
|
|
//计算完毕,将当前系统构建状态改为false
|
|
redisUtil.del(modelingKey);
|
|
redisUtil.del(modelingKey);
|
|
@@ -255,6 +263,12 @@ public class RabbitMqListener {
|
|
|
|
|
|
String splitType = dataMap.get("splitType");
|
|
String splitType = dataMap.get("splitType");
|
|
String skyboxType = dataMap.get("skyboxType");
|
|
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);
|
|
ComputerUtil.createProjectAndDataFile(path,num, splitType, skyboxType,null,null);
|
|
//计算模型并返回需要上传oss的文件集合
|
|
//计算模型并返回需要上传oss的文件集合
|
|
@@ -270,6 +284,33 @@ public class RabbitMqListener {
|
|
return ModelingBuildStatus.SUCCESS;
|
|
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){
|
|
private void afterBuild(BuildSceneCallMessage message, BuildSceneResultBean buildSceneResult, BuildLog buildLog){
|
|
ModelingBuildStatus buildStatus = null;
|
|
ModelingBuildStatus buildStatus = null;
|
|
try {
|
|
try {
|
|
@@ -300,7 +341,7 @@ public class RabbitMqListener {
|
|
*/
|
|
*/
|
|
private void sendCallBuildProcessLog(BuildSceneCallMessage message, ModelingBuildStatus buildStatus){
|
|
private void sendCallBuildProcessLog(BuildSceneCallMessage message, ModelingBuildStatus buildStatus){
|
|
rabbitMqProducer.sendByWorkQueue(queueModelingProcessLog,
|
|
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 {
|
|
private void preBuild(Map<String,Object> buildContext,BuildSceneCallMessage message, BuildLog buildLog) throws BuildException {
|
|
@@ -358,8 +399,80 @@ public class RabbitMqListener {
|
|
.computeTime(buildSceneResult.getDuration())
|
|
.computeTime(buildSceneResult.getDuration())
|
|
.path(buildSceneResult.getPath())
|
|
.path(buildSceneResult.getPath())
|
|
.hostName(SysConstants.hostName)
|
|
.hostName(SysConstants.hostName)
|
|
|
|
+ .ext(message.getExt())
|
|
.build();
|
|
.build();
|
|
buildResult.setBuildContext(message.getBuildContext());
|
|
buildResult.setBuildContext(message.getBuildContext());
|
|
rabbitMqProducer.sendByWorkQueue(buildSceneResult.getResultQueueName(),buildResult);
|
|
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);
|
|
|
|
+ }
|
|
}
|
|
}
|