渲染端渲染流程

This commit is contained in:
2024-12-08 17:54:27 +08:00
parent 18b1776ac2
commit aa6da15c8f
21 changed files with 448 additions and 13 deletions

View File

@ -0,0 +1,216 @@
package com.ycwl.basic.service.impl.task;
import com.alibaba.fastjson.JSON;
import com.ycwl.basic.constant.TaskConstant;
import com.ycwl.basic.mapper.pc.FaceMapper;
import com.ycwl.basic.mapper.pc.FaceSampleMapper;
import com.ycwl.basic.mapper.pc.RenderWorkerMapper;
import com.ycwl.basic.mapper.pc.SourceMapper;
import com.ycwl.basic.mapper.pc.TaskMapper;
import com.ycwl.basic.mapper.pc.TemplateMapper;
import com.ycwl.basic.model.pc.face.resp.FaceRespVO;
import com.ycwl.basic.model.pc.faceSample.resp.FaceSampleRespVO;
import com.ycwl.basic.model.pc.renderWorker.entity.RenderWorkerEntity;
import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
import com.ycwl.basic.model.pc.task.resp.TaskRespVO;
import com.ycwl.basic.model.pc.template.req.TemplateReqQuery;
import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
import com.ycwl.basic.model.task.req.ClientStatusReqVo;
import com.ycwl.basic.model.task.req.TaskReqVo;
import com.ycwl.basic.model.task.req.WorkerAuthReqVo;
import com.ycwl.basic.model.task.resp.TaskSyncRespVo;
import com.ycwl.basic.service.task.TaskService;
import com.ycwl.basic.utils.OssUtil;
import com.ycwl.basic.utils.SnowFlakeUtil;
import lombok.NonNull;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Service
public class TaskTaskServiceImpl implements TaskService {
@Autowired
private TemplateMapper templateMapper;
@Autowired
private RenderWorkerMapper renderWorkerMapper;
@Autowired
private TaskMapper taskMapper;
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Autowired
private FaceMapper faceMapper;
@Autowired
private FaceSampleMapper faceSampleMapper;
@Autowired
private SourceMapper sourceMapper;
@Autowired
private OssUtil ossUtil;
private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) {
String accessKey = req.getAccessKey();
if (accessKey == null) {
return null;
}
RenderWorkerEntity worker = renderWorkerMapper.findByAccessKey(accessKey);
return worker;
}
@Override
public TaskSyncRespVo handleSyncTask(@NonNull TaskReqVo req) {
RenderWorkerEntity worker = getWorker(req);
if (worker == null) {
return null;
}
worker.setOnline(1);
worker.setName(null);
worker.setStatus(null);
// get status
ClientStatusReqVo clientStatus = req.getClientStatus();
if (clientStatus != null) {
// 临时这么用下
worker.setCpuCount(clientStatus.getCpu_count());
worker.setCpuUsage(clientStatus.getCpu_usage());
// 上报的是字节,存储的是兆
worker.setMemoryAvailable(clientStatus.getMemory_available().divide(BigDecimal.valueOf(1024 * 1024), RoundingMode.CEILING));
worker.setMemoryTotal(clientStatus.getMemory_total().divide(BigDecimal.valueOf(1024 * 1024), RoundingMode.CEILING));
worker.setPlatform(clientStatus.getPlatform());
worker.setRuntimeVersion(clientStatus.getRuntime_version());
worker.setSupportFeature(String.join(",", clientStatus.getSupport_feature()));
worker.setVersion(clientStatus.getVersion());
worker.setUpdateAt(new Date());
redisTemplate.opsForValue().set(TaskConstant.TASK_ONLINE_WORKER_KEY_PFX + worker.getId(), JSON.toJSONString(clientStatus), 60, TimeUnit.SECONDS);
}
renderWorkerMapper.update(worker);
TaskSyncRespVo resp = new TaskSyncRespVo();
// Template
String cacheJson = redisTemplate.opsForValue().get(TaskConstant.TASK_TEMPLATE_KEY_PFX + worker.getId());
if (cacheJson == null) {
List<TemplateRespVO> templateList = templateMapper.list(new TemplateReqQuery());
for (TemplateRespVO template : templateList) {
template.setChildren(templateMapper.getByPid(template.getId()));
}
resp.setTemplates(templateList);
redisTemplate.opsForValue().set(TaskConstant.TASK_TEMPLATE_KEY_PFX + worker.getId(), JSON.toJSONString(templateList), 60, TimeUnit.SECONDS);
} else {
resp.setTemplates(JSON.parseArray(cacheJson, TemplateRespVO.class));
}
List<TaskRespVO> taskList = taskMapper.selectNotRunning();
resp.setTasks(taskList);
taskList.forEach(task -> {
taskMapper.assignToWorker(task.getId(), worker.getId());
});
// return Task
return resp;
}
@Override
public void createRenderTask(Long scenicId, Long templateId, Long faceId) {
// 有人脸,找视频
if (faceId == null) {
return;
}
FaceRespVO faceRespVO = faceMapper.getById(faceId);
if (faceRespVO == null) {
return;
}
Map<String, List<SourceRespVO>> sourcesMap = Arrays.stream(faceRespVO.getMatchSampleIds().split(","))
.map(Long::valueOf)
.map(sampleId -> {
return faceSampleMapper.getById(sampleId);
})
.filter(Objects::nonNull)
.map(FaceSampleRespVO::getSourceId)
.map(sourceId -> sourceMapper.getById(sourceId))
.collect(Collectors.groupingBy(item -> item.getDeviceId().toString()));
TaskEntity taskEntity = new TaskEntity();
taskEntity.setId(SnowFlakeUtil.getLongId());
taskEntity.setFaceId(faceId);
taskEntity.setMemberId(faceRespVO.getMemberId());
taskEntity.setTemplateId(templateId);
taskEntity.setScenicId(scenicId);
taskEntity.setTaskParams(JSON.toJSONString(sourcesMap));
taskEntity.setStatus(0);
taskMapper.add(taskEntity);
}
@Override
public TemplateRespVO workerGetTemplate(@NonNull Long templateId, @NonNull WorkerAuthReqVo req) {
if (templateId == null) {
return null;
}
RenderWorkerEntity worker = getWorker(req);
if (worker == null) {
return null;
}
TemplateRespVO respVO = templateMapper.getById(templateId);
respVO.setChildren(templateMapper.getByPid(templateId));
return respVO;
}
@Override
public void taskSuccess(@NonNull Long taskId, @NonNull WorkerAuthReqVo req) {
TaskRespVO task = taskMapper.getById(taskId);
if (task == null) {
return;
}
RenderWorkerEntity worker = getWorker(req);
if (worker == null) {
return;
}
TaskEntity taskUpdate = new TaskEntity();
taskUpdate.setId(taskId);
taskUpdate.setStatus(1);
taskUpdate.setWorkerId(worker.getId());
taskMapper.update(taskUpdate);
}
@Override
public void taskFail(Long taskId, WorkerAuthReqVo req) {
TaskRespVO task = taskMapper.getById(taskId);
if (task == null) {
return;
}
RenderWorkerEntity worker = getWorker(req);
if (worker == null) {
return;
}
TaskEntity taskUpdate = new TaskEntity();
taskUpdate.setId(taskId);
taskUpdate.setStatus(2);
taskUpdate.setWorkerId(worker.getId());
taskMapper.update(taskUpdate);
taskMapper.deassign(taskId);
}
@Override
public String getUploadUrl(Long taskId, WorkerAuthReqVo req) {
TaskRespVO task = taskMapper.getById(taskId);
if (task == null) {
return null;
}
String filename = task.getId() + "_" + task.getScenicId() + ".mp4";
if (StringUtils.isBlank(task.getVideoUrl())) {
// 生成
String url = ossUtil.generateUrlOfFile("user-video/", filename);
TaskEntity updateTask = new TaskEntity();
updateTask.setId(taskId);
updateTask.setVideoUrl(url);
taskMapper.update(updateTask);
}
return ossUtil.generateSignedUrlForUpload("user-video/", filename);
}
}

View File

@ -0,0 +1,19 @@
package com.ycwl.basic.service.task;
import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
import com.ycwl.basic.model.task.req.TaskReqVo;
import com.ycwl.basic.model.task.req.WorkerAuthReqVo;
import com.ycwl.basic.model.task.resp.TaskSyncRespVo;
public interface TaskService {
TaskSyncRespVo handleSyncTask(TaskReqVo req);
void createRenderTask(Long scenicId, Long templateId, Long faceId);
TemplateRespVO workerGetTemplate(Long templateId, WorkerAuthReqVo req);
void taskSuccess(Long taskId, WorkerAuthReqVo req);
void taskFail(Long taskId, WorkerAuthReqVo req);
String getUploadUrl(Long taskId, WorkerAuthReqVo req);
}