Procházet zdrojové kódy

火山云迁移和配置

zyp před 5 dny
rodič
revize
13a5124896

+ 4 - 0
fs-service/src/main/java/com/fs/config/cloud/CloudHostProper.java

@@ -19,4 +19,8 @@ public class CloudHostProper {
     //火山云空间名称
     @Value("${cloud_host.spaceName}")
     public String spaceName;
+
+    //火山云空间绑定域名
+    @Value("${cloud_host.volcengineUrl}")
+    public String volcengineUrl;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseVideoMapper.java

@@ -271,4 +271,7 @@ public interface FsUserCourseVideoMapper extends BaseMapper<FsUserCourseVideo> {
 
     @Select("select * from fs_user_course_video where job_id is not null and vid is null")
     List<FsUserCourseVideo> selectVideoByJobId();
+
+    @Select("select * from fs_user_course_video where vid is not null")
+    List<FsUserCourseVideo> selectVideoByVid();
 }

+ 6 - 0
fs-service/src/main/java/com/fs/course/service/IFsUserCourseVideoService.java

@@ -234,4 +234,10 @@ public interface IFsUserCourseVideoService extends IService<FsUserCourseVideo> {
      * @return
      */
     R getVidByJob();
+
+    /**
+     * 通过vid获取视频路径并且组装地址存到替换线路二
+     * @return
+     */
+    R getVideoInfoByVid();
 }

+ 68 - 16
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -4071,10 +4071,11 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
             //用户额外信息,最大长度 512 字节。
             uRLSetsBuilder.setCallbackArgs("");
             // 火山云存储路径(文件上传后在火山云的路径)
-            String datePath = new SimpleDateFormat("yyyyMMdd").format(new Date());
-            String fileName = System.currentTimeMillis() + ".mp4";
-            String remoteFileName = "fs/" + datePath + "/" + fileName;
-            uRLSetsBuilder.setFileName(remoteFileName);
+//            String datePath = new SimpleDateFormat("yyyyMMdd").format(new Date());
+//            String fileName = System.currentTimeMillis() + ".mp4";
+//            String remoteFileName = "fs/" + datePath + "/" + fileName;
+
+            uRLSetsBuilder.setFileName(courseVideo.getFileKey());
             reqBuilder.addURLSets(uRLSetsBuilder);
 
             VodUrlUploadResponse resp = vodService.uploadMediaByUrl(reqBuilder.build());
@@ -4119,7 +4120,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
             for (FsUserCourseVideo video : batch) {
                 uploadExecutor.submit(() -> {
                     try {
-                        uploadSingleTaskWithRetry(video);
+                        uploadSingleTaskWithRetry(video,1);
                     } finally {
                         latch.countDown();
                     }
@@ -4140,6 +4141,53 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         log.info("全部批次执行完成");
         return R.ok();
     }
+
+    @Override
+    public R getVideoInfoByVid() {
+        // 查询有JobId的视频
+        List<FsUserCourseVideo> list = fsUserCourseVideoMapper.selectVideoByVid();
+        if (list.isEmpty()) {
+            log.info("没有包含vid的视频");
+            return R.error();
+        }
+        // 按五百一批切割
+        List<List<FsUserCourseVideo>> batches = splitList(list, 500);
+        log.info("总任务 {} 条,分成 {} 批", list.size(), batches.size());
+
+        int batchIndex = 1;
+
+        // 批次顺序执行,每批内部多线程并发执行
+        for (List<FsUserCourseVideo> batch : batches) {
+
+            log.info("开始执行批次 {}/{},本批任务 {} 条", batchIndex, batches.size(), batch.size());
+
+            CountDownLatch latch = new CountDownLatch(batch.size());
+
+            for (FsUserCourseVideo video : batch) {
+                uploadExecutor.submit(() -> {
+                    try {
+                        uploadSingleTaskWithRetry(video,2);
+                    } finally {
+                        latch.countDown();
+                    }
+                });
+            }
+
+            // 等待这一批全部完成
+            try {
+                latch.await();
+            } catch (InterruptedException e) {
+                log.error("批次等待异常", e);
+            }
+
+            log.info("批次 {}/{} 执行完成", batchIndex, batches.size());
+            batchIndex++;
+        }
+
+        log.info("全部批次执行完成");
+        return R.ok();
+    }
+
     private final ExecutorService uploadExecutor = new ThreadPoolExecutor(
             8,  // core
             16, // max
@@ -4198,10 +4246,16 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
                 System.out.println(resp.getResponseMetadata().getError());
                 System.exit(-1);
             }else {
+                //更新小节
                 FsUserCourseVideo video = new FsUserCourseVideo();
                 video.setVideoId(courseVideo.getVideoId());
-                video.setLineTwo(resp.getResult().getMediaInfoList(0).getSourceInfo().getStoreUri());
+                String url = cloudHostProper.volcengineUrl+"/"+resp.getResult().getMediaInfoList(0).getSourceInfo().getStoreUri();
+                video.setLineTwo(url);
                 fsUserCourseVideoMapper.updateFsUserCourseVideo(video);
+                //更新视频资源
+                FsVideoResource videoResource = fsVideoResourceMapper.selectByFileKey(courseVideo.getFileKey());
+                videoResource.setLine2(url);
+                fsVideoResourceMapper.updateById(videoResource);
             }
             System.out.println(resp);
         } catch (Exception e) {
@@ -4210,19 +4264,17 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
     }
 
 
-    public void uploadSingleTaskWithRetry(FsUserCourseVideo courseVideo) {
+    public void uploadSingleTaskWithRetry(FsUserCourseVideo courseVideo,Integer type) {
         int maxRetry = 3;
         for (int i = 1; i <= maxRetry; i++) {
             try {
-                //获取上传成功的视频vid,同步到数据库
-                getVidByJobId(courseVideo);
-                //查询需要上传的视频,上传后将视频任务id存到数据库
-//                uploadVideoByUrl(fsUserVideo);
-                //根据视频vid获取火山云的视频信息,并同步到数据库
-                /**
-                 * 下面这个方法调用前去润天his_java确认一下,是否一致的
-                 */
-                //getVideoInfoByVid(fsUserVideo);
+                if (type == 1){
+                    //获取上传成功的视频vid,同步到数据库
+                    getVidByJobId(courseVideo);
+                }else if (type == 2){
+                    //获取视频地址同步到线路二
+                    getVideoInfoByVid(courseVideo);
+                }
                 return;
             } catch (Exception e) {
                 log.error("视频 {} 上传失败,第 {} 次重试,原因:{}",

+ 1 - 0
fs-service/src/main/resources/application-config-myhk.yml

@@ -88,6 +88,7 @@ cloud_host:
   company_name: 木易华康
   projectCode: MYHK
   spaceName: myhk-2114522511
+  volcengineUrl: https://myhkvolcengine.ylrztop.com
 #看课授权时显示的头像
 headerImg:
   imgUrl: https://fs-1346741853.cos.ap-chengdu.myqcloud.com/fs/20250323/6189704f2e134b84ad9c9e7c9999f103.jpg

+ 5 - 0
fs-user-app/src/main/java/com/fs/app/controller/course/CourseQwController.java

@@ -371,6 +371,11 @@ public class CourseQwController extends AppBaseController {
         return courseVideoService.getVidByJob();
     }
 
+    @GetMapping("/testUpdateLineTwo")
+    public R testUpdateLineTwo() {
+        return courseVideoService.getVideoInfoByVid();
+    }
+
     @Autowired
     private IFsCourseTrafficLogService courseTrafficLogService;