雪场华为云VOD视频上传服务程序
lyg
2025-01-24 b9a246da2db1e8a7c37a9d02df29e0dbc82c9579
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.ld.vps.manager;
 
import cn.hutool.core.date.DateUtil;
import com.ld.vps.bean.UploadTaskInfo;
import com.ld.vps.bean.UploadTaskStatus;
import com.ld.vps.dao.UploadTaskRepository;
import com.ld.vps.service.BitsPressService;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
import java.util.Date;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
 
@Component
public class UploadTaskManager {
  Logger logger = LoggerFactory.getLogger(UploadTaskManager.class);
 
  @Autowired
  UploadTaskRepository taskRepo;
  @Autowired
  BitsPressService bitsPressService;
  private Queue<UploadTaskInfo> tasks = new ArrayBlockingQueue<>(100);
  private int curTaskSize = 0;
  private int maxTaskSize = 1;
 
  public UploadTaskManager() {
    new Thread(() -> {
      for (;;) {
        try {
          Thread.sleep(1000);
        } catch (InterruptedException e) {
          logger.error(e.getMessage());
        }
        if (curTaskSize >= maxTaskSize) {
          continue;
        }
        UploadTaskInfo currentTask = tasks.poll();
        if (currentTask != null) {
          synchronized (UploadTaskManager.class) {
            curTaskSize++;
          }
          new Thread(() -> {
            try {
              logger.info("从队列获取任务并开始执行:{}", currentTask.getId());
              runTask(currentTask);
            } finally {
              synchronized (UploadTaskManager.class) {
                curTaskSize--;
              }
            }
          }).start();
        }
      }
    }).start();
  }
 
  @PostConstruct
  private void loadTasks() {
    logger.debug("加载任务");
    tasks.addAll(taskRepo.findByStatusIn(List.of(UploadTaskStatus.WAITING, UploadTaskStatus.UPLOADING,UploadTaskStatus.FAILED)).stream().toList());
  }
 
  public void addTask(UploadTaskInfo task) {
    logger.debug("添加任务到队列");
    tasks.add(task);
  }
 
  private void runTask(UploadTaskInfo task) {
    // 上传文件
    new HwVodUploader(task,this.taskRepo).start();
    logger.info("上传文件完成,assetId:{}", task.getAssetId());
 
    // 截取视频第一帧图片
 
 
    // 创建比特商品
    // 下载视频封面截图并上传比特
    bitsPressService.uploadCover(task);
    taskRepo.save(task);
    // 创建商品
    Long prodId = bitsPressService.createProduct(task);
    logger.info("创建比特商品成功,商品ID:{}", prodId);
    taskRepo.save(task);
  }
}