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 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); } }