Browse Source

新加腾讯云视频接口手动请求

wangliang 3 years ago
parent
commit
1349ca3d3e

+ 87 - 2
themis-admin/src/main/java/com/qmth/themis/admin/api/SysController.java

@@ -1,5 +1,6 @@
 package com.qmth.themis.admin.api;
 package com.qmth.themis.admin.api;
 
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.google.common.reflect.TypeToken;
 import com.google.common.reflect.TypeToken;
@@ -15,12 +16,14 @@ import com.qmth.themis.business.enums.InvigilateMonitorStatusEnum;
 import com.qmth.themis.business.enums.RoleEnum;
 import com.qmth.themis.business.enums.RoleEnum;
 import com.qmth.themis.business.enums.UploadFileEnum;
 import com.qmth.themis.business.enums.UploadFileEnum;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.service.*;
-import com.qmth.themis.business.util.OssUtil;
-import com.qmth.themis.business.util.ServletUtil;
+import com.qmth.themis.business.util.*;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.ResultUtil;
 import com.qmth.themis.common.util.ResultUtil;
+import com.tencentcloudapi.vod.v20180717.models.MediaBasicInfo;
+import com.tencentcloudapi.vod.v20180717.models.MediaInfo;
+import com.tencentcloudapi.vod.v20180717.models.SearchMediaResponse;
 import io.swagger.annotations.*;
 import io.swagger.annotations.*;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -86,6 +89,18 @@ public class SysController {
     @Resource
     @Resource
     CacheService cacheService;
     CacheService cacheService;
 
 
+    @Resource
+    TOeExamRecordService tOeExamRecordService;
+
+    @Resource
+    TencentYunUtil tencentYunUtil;
+
+    @Resource
+    RedisUtil redisUtil;
+
+    @Resource
+    TMTencentVideoMessageService tencentVideoMessageService;
+
     @ApiOperation(value = "菜单查询接口")
     @ApiOperation(value = "菜单查询接口")
     @RequestMapping(value = "/getMenu", method = RequestMethod.POST)
     @RequestMapping(value = "/getMenu", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "菜单信息", response = TBPrivilege.class)})
     @ApiResponses({@ApiResponse(code = 200, message = "菜单信息", response = TBPrivilege.class)})
@@ -412,4 +427,74 @@ public class SysController {
         }
         }
         return ResultUtil.ok(teExamQueryDtoList);
         return ResultUtil.ok(teExamQueryDtoList);
     }
     }
+
+    @ApiOperation(value = "获取腾讯视频接口")
+    @RequestMapping(value = "/get_tencent_video", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "腾讯视频接口", response = Result.class)})
+    @Transactional
+    public Result getTencentVideo(@ApiParam(value = "考试批次id", required = true) @RequestParam Long examId) {
+        QueryWrapper<TOeExamRecord> tOeExamRecordQueryWrapper = new QueryWrapper<>();
+        tOeExamRecordQueryWrapper.lambda().eq(TOeExamRecord::getExamId, examId)
+                .isNull(TOeExamRecord::getTencentVideoUrl);
+        List<TOeExamRecord> tOeExamRecordList = tOeExamRecordService.list(tOeExamRecordQueryWrapper);
+
+        if (!CollectionUtils.isEmpty(tOeExamRecordList)) {
+            for (TOeExamRecord t : tOeExamRecordList) {
+                Map<String, Object> resultMap = tencentYunUtil.callTencentVideo(t.getId());
+                if (!CollectionUtils.isEmpty(resultMap)) {
+                    SearchMediaResponse response = (SearchMediaResponse) resultMap.get("object");
+                    if (Objects.nonNull(response) && response.getTotalCount().intValue() > 0) {
+                        Map<String, String> map = new HashMap<>();
+                        JSONArray jsonArray = null;
+                        int countDb = 0;
+                        if (Objects.nonNull(t.getTencentVideoUrl())) {
+                            jsonArray = JSONArray.parseArray(t.getTencentVideoUrl());
+                            countDb = jsonArray.size();
+                            for (int i = 0; i < countDb; i++) {
+                                JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+                                String videoSource = SystemConstant.getMonitorRecordStreamId((String) jsonObject.get(SystemConstant.VIDEO_SOURCE));
+                                map.put(videoSource, videoSource);
+                            }
+                        } else {
+                            jsonArray = new JSONArray();
+                        }
+                        MediaInfo[] mediaInfos = response.getMediaInfoSet();
+                        for (int i = 0; i < mediaInfos.length; i++) {
+                            MediaBasicInfo mediaBasicInfo = mediaInfos[i].getBasicInfo();
+                            String videoSource = SystemConstant.getMonitorRecordStreamId(mediaBasicInfo.getName());
+                            boolean lock = false;
+                            for (int y = 0; y < SystemConstant.CONSUME_MESSAGE_BATCH_MAX_SIZE; y++) {
+                                lock = redisUtil.lock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_PREFIX + videoSource, SystemConstant.REDIS_LOCK_TENCENT_VIDEO_TIME_OUT);
+                                if (lock && Objects.isNull(map.get(videoSource))) {
+                                    try {
+                                        JSONObject jsonObject = new JSONObject();
+                                        jsonObject.put(SystemConstant.VIDEO_SOURCE, videoSource);
+                                        jsonObject.put(SystemConstant.VIDEO_URL, mediaBasicInfo.getMediaUrl());
+                                        jsonArray.add(jsonObject);
+                                        break;
+                                    } finally {
+                                        redisUtil.releaseLock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_PREFIX + videoSource);
+                                    }
+                                } else {
+                                    try {
+                                        Thread.sleep(500);
+                                    } catch (InterruptedException e) {
+                                        e.printStackTrace();
+                                    }
+                                }
+                            }
+                        }
+                        if (Objects.nonNull(jsonArray) && jsonArray.size() > 0 && countDb != jsonArray.size()) {
+                            t.setTencentVideoUrl(jsonArray.toJSONString());
+                            tOeExamRecordService.updateById(t);
+
+                            TMTencentVideoMessage tencentVideoMessage = new TMTencentVideoMessage(response.getRequestId(), JacksonUtil.parseJson(response));
+                            tencentVideoMessageService.save(tencentVideoMessage);
+                        }
+                    }
+                }
+            }
+        }
+        return ResultUtil.ok(true);
+    }
 }
 }

+ 1 - 1
themis-admin/src/main/resources/application.properties

@@ -209,4 +209,4 @@ monitor.config.prefix=oe_test
 
 
 #\u65E0\u9700\u9274\u6743\u7684url
 #\u65E0\u9700\u9274\u6743\u7684url
 no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent
 no.auth.urls=/webjars/**,/druid/**,/swagger-ui.html,/doc.html,/swagger-resources/**,/v2/api-docs,/webjars/springfox-swagger-ui/**,/api/admin/user/login/account,/api/admin/sys/org/queryByOrgCode,/file/**,/upload/**,/client/**,/base_photo/**,/frontend/**,/api/admin/client/save,/api/admin/client/upload,/api/admin/client/query,/api/admin/app/save,/api/admin/app/query,/api/notify/monitor/record/tencent,/api/notify/monitor/status/tencent
-common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query
+common.system.urls=/api/admin/sys/getMenu,/api/admin/user/logout,/api/admin/sys/env,/api/admin/sys/file/upload,/api/admin/sys/file/download,/api/admin/sys/org/query,/api/admin/sys/role/query,/api/admin/sys/examActivity/query,/api/admin/sys/exam/query,/api/admin/sys/examRoom/query,/api/admin/sys/exam/privilegeQuery,/api/admin/student/photo/upload,/api/admin/sys/getPlayUrls,/api/admin/sys/exam/finish/query,/api/admin/sys/get_tencent_video

+ 68 - 3
themis-business/src/main/java/com/qmth/themis/business/util/TencentYunUtil.java

@@ -2,6 +2,9 @@ package com.qmth.themis.business.util;
 
 
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.domain.TencentYunDomain;
 import com.qmth.themis.business.domain.TencentYunDomain;
+import com.qmth.themis.business.entity.TOeExamRecord;
+import com.qmth.themis.business.enums.MonitorVideoSourceEnum;
+import com.qmth.themis.business.service.TGErrorService;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.Credential;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.exception.TencentCloudSDKException;
 import com.tencentcloudapi.common.profile.ClientProfile;
 import com.tencentcloudapi.common.profile.ClientProfile;
@@ -18,9 +21,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
+import javax.annotation.Resource;
+import java.util.*;
 
 
 /**
 /**
  * @Description: 腾讯云util
  * @Description: 腾讯云util
@@ -33,6 +35,15 @@ import java.util.Objects;
 public class TencentYunUtil {
 public class TencentYunUtil {
     private final static Logger log = LoggerFactory.getLogger(TencentYunUtil.class);
     private final static Logger log = LoggerFactory.getLogger(TencentYunUtil.class);
 
 
+    @Resource
+    RedisUtil redisUtil;
+
+    @Resource
+    TGErrorService tgErrorService;
+
+    @Resource
+    MonitorUtil monitorUtil;
+
     private TencentYunDomain tencentYunDomain;
     private TencentYunDomain tencentYunDomain;
 
 
     @Bean
     @Bean
@@ -68,6 +79,60 @@ public class TencentYunUtil {
         return tencentYunDomain;
         return tencentYunDomain;
     }
     }
 
 
+    /**
+     * 请求腾讯云视频地址
+     *
+     * @param recordId
+     * @return
+     */
+    public Map<String, Object> callTencentVideo(Long recordId) {
+        TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
+        List<String> monitorRecordList = Arrays.asList(tOeExamRecord.getMonitorRecord().trim().toUpperCase().split(","));
+        String[] streamIds = new String[monitorRecordList.size()];
+        for (int i = 0; i < monitorRecordList.size(); i++) {
+            streamIds[i] = SystemConstant.setStreamId(monitorUtil.getMonitorDomain().getPrefix(), recordId, MonitorVideoSourceEnum.convertToName(monitorRecordList.get(i)));
+        }
+
+        Map<String, Object> resultMap = null;
+        boolean lockStreamIds = false;
+        for (int i = 0; i < SystemConstant.MAX_TENCENT_VIDEO_STREAM_ID_COUNT; i++) {
+            lockStreamIds = redisUtil.lock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_STREAM_ID_PREFIX + streamIds.toString(),
+                    SystemConstant.REDIS_LOCK_TENCENT_VIDEO_STREAM_ID_TIME_OUT);
+            if (lockStreamIds) {
+                try {
+                    resultMap = this.tencentVodSdk(this.getTencentYunDomain().getSecretId(),
+                            this.getTencentYunDomain().getSecretKey(),
+                            this.getTencentYunDomain().getQueryUrl(),
+                            this.getTencentYunDomain().getVodAppId(),
+                            streamIds);
+                    break;
+                } catch (Exception e) {
+                    log.error("请求出错", e);
+                    if (i == SystemConstant.MAX_TENCENT_VIDEO_STREAM_ID_COUNT - 1) {
+                        tgErrorService.saveExamTgError(recordId, "execMqTencentVideoLogic");
+                    } else {
+                        try {
+                            Thread.sleep(3000);
+                        } catch (InterruptedException ex) {
+                            ex.printStackTrace();
+                        }
+                    }
+                } finally {
+                    if (Objects.nonNull(streamIds)) {
+                        redisUtil.releaseLock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_STREAM_ID_PREFIX + streamIds.toString());
+                    }
+                }
+            } else {
+                try {
+                    Thread.sleep(3000);
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return resultMap;
+    }
+
     /**
     /**
      * 腾讯云vodsdk
      * 腾讯云vodsdk
      *
      *

+ 2 - 50
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -117,15 +117,9 @@ public class MqLogicServiceImpl implements MqLogicService {
     @Resource
     @Resource
     TMTencentVideoMessageService tencentVideoMessageService;
     TMTencentVideoMessageService tencentVideoMessageService;
 
 
-    @Resource
-    MonitorUtil monitorUtil;
-
     @Resource
     @Resource
     TOeExamRecordService tOeExamRecordService;
     TOeExamRecordService tOeExamRecordService;
 
 
-    @Resource
-    TGErrorService tgErrorService;
-
     /**
     /**
      * mq最大重试次数逻辑
      * mq最大重试次数逻辑
      *
      *
@@ -299,52 +293,10 @@ public class MqLogicServiceImpl implements MqLogicService {
     public void execMqTencentVideoLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException, IOException {
     public void execMqTencentVideoLogic(MqDto mqDto, String key) throws NoSuchAlgorithmException, IOException {
         Map<String, Object> tranMap = mqDto.getProperties();
         Map<String, Object> tranMap = mqDto.getProperties();
         Long recordId = Long.parseLong(String.valueOf(tranMap.get(SystemConstant.RECORD_ID)));
         Long recordId = Long.parseLong(String.valueOf(tranMap.get(SystemConstant.RECORD_ID)));
-        TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
-        List<String> monitorRecordList = Arrays.asList(tOeExamRecord.getMonitorRecord().trim().toUpperCase().split(","));
-        String[] streamIds = new String[monitorRecordList.size()];
-        for (int i = 0; i < monitorRecordList.size(); i++) {
-            streamIds[i] = SystemConstant.setStreamId(monitorUtil.getMonitorDomain().getPrefix(), recordId, MonitorVideoSourceEnum.convertToName(monitorRecordList.get(i)));
-        }
-
-        Map<String, Object> resultMap = null;
-        boolean lockStreamIds = false;
-        for (int i = 0; i < SystemConstant.MAX_TENCENT_VIDEO_STREAM_ID_COUNT; i++) {
-            lockStreamIds = redisUtil.lock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_STREAM_ID_PREFIX + streamIds.toString(),
-                    SystemConstant.REDIS_LOCK_TENCENT_VIDEO_STREAM_ID_TIME_OUT);
-            if (lockStreamIds) {
-                try {
-                    resultMap = tencentYunUtil.tencentVodSdk(tencentYunUtil.getTencentYunDomain().getSecretId(),
-                            tencentYunUtil.getTencentYunDomain().getSecretKey(),
-                            tencentYunUtil.getTencentYunDomain().getQueryUrl(),
-                            tencentYunUtil.getTencentYunDomain().getVodAppId(),
-                            streamIds);
-                    break;
-                } catch (Exception e) {
-                    log.error("请求出错", e);
-                    if (i == SystemConstant.MAX_TENCENT_VIDEO_STREAM_ID_COUNT - 1) {
-                        tgErrorService.saveExamTgError(recordId, "execMqTencentVideoLogic");
-                    } else {
-                        try {
-                            Thread.sleep(3000);
-                        } catch (InterruptedException ex) {
-                            ex.printStackTrace();
-                        }
-                    }
-                } finally {
-                    if (Objects.nonNull(streamIds)) {
-                        redisUtil.releaseLock(SystemConstant.REDIS_LOCK_TENCENT_VIDEO_STREAM_ID_PREFIX + streamIds.toString());
-                    }
-                }
-            } else {
-                try {
-                    Thread.sleep(3000);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }
-        }
+        Map<String, Object> resultMap = tencentYunUtil.callTencentVideo(recordId);
 
 
         if (!CollectionUtils.isEmpty(resultMap)) {
         if (!CollectionUtils.isEmpty(resultMap)) {
+            TOeExamRecord tOeExamRecord = SystemConstant.getExamRecord(recordId);
             SearchMediaResponse response = (SearchMediaResponse) resultMap.get("object");
             SearchMediaResponse response = (SearchMediaResponse) resultMap.get("object");
             if (Objects.nonNull(response) && response.getTotalCount().intValue() > 0) {
             if (Objects.nonNull(response) && response.getTotalCount().intValue() > 0) {
                 Map<String, String> map = new HashMap<>();
                 Map<String, String> map = new HashMap<>();