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