From c9a4116ed60b5ea7b74e324792e2b6823b05afd9 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Mon, 7 Apr 2025 14:16:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8D=AF=E9=A5=AC=E6=8D=AF=E9=A5=AC=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/controller/viid/ViidController.java | 25 ++++++----- .../service/pc/impl/FaceServiceImpl.java | 17 +------- .../task/impl/TaskFaceServiceImpl.java | 42 ++++++++++--------- .../task/impl/TaskTaskServiceImpl.java | 7 +--- .../com/ycwl/basic/task/VideoPieceGetter.java | 10 ++++- 5 files changed, 50 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java index a0fce10..931e302 100644 --- a/src/main/java/com/ycwl/basic/controller/viid/ViidController.java +++ b/src/main/java/com/ycwl/basic/controller/viid/ViidController.java @@ -1,6 +1,7 @@ package com.ycwl.basic.controller.viid; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.thread.ThreadFactoryBuilder; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -69,6 +70,7 @@ import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -93,17 +95,20 @@ public class ViidController { private ScenicRepository scenicRepository; @Autowired private TaskFaceService taskFaceService; - private final Map executors = new ConcurrentHashMap<>(); + private final Map executors = new ConcurrentHashMap<>(); @Autowired private ScenicService scenicService; - private ThreadPoolExecutor getExecutor(String deviceId) { - ThreadPoolExecutor executor = executors.get(deviceId); - if (executor == null) { - executor = new ThreadPoolExecutor(4, 4096, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(4096)); - executors.put(deviceId, executor); - } - return executor; + private ThreadPoolExecutor getExecutor(Long scenicId) { + return executors.computeIfAbsent(scenicId, k -> { + ThreadFactory threadFactory = new ThreadFactoryBuilder() + .setNamePrefix("VIID-" + scenicId + "-t") + .build(); + return new ThreadPoolExecutor( + 4, 4096, 0L, TimeUnit.MILLISECONDS, + new ArrayBlockingQueue<>(4096), + threadFactory); + }); } // region 注册注销基础接口 @@ -310,7 +315,7 @@ public class ViidController { String url = adapter.uploadFile(file, "user-face", UUID.randomUUID() + "." + ext); faceSample.setFaceUrl(url); faceSampleMapper.add(faceSample); - ThreadPoolExecutor executor = getExecutor(device.getId().toString()); + ThreadPoolExecutor executor = getExecutor(scenicId); executor.execute(() -> { if (faceBodyAdapter != null) { taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString()); @@ -372,7 +377,7 @@ public class ViidController { faceSample.setFaceUrl(url); faceSampleMapper.add(faceSample); DynamicTaskGenerator.addTask(faceSample.getId()); - ThreadPoolExecutor executor = getExecutor(device.getId().toString()); + ThreadPoolExecutor executor = getExecutor(scenicId); executor.execute(() -> { if (faceBodyAdapter != null) { taskFaceService.assureFaceDb(faceBodyAdapter, scenicId.toString()); diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java index c15cee0..b605850 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java @@ -136,14 +136,7 @@ public class FaceServiceImpl implements FaceService { String faceUrl = adapter.uploadFile(file, filePath, fileName); Long newFaceId = SnowFlakeUtil.getLongId(); Long oldFaceId = null; - ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(scenicId); - IFaceBodyAdapter faceBodyAdapter; - if (scenicConfig != null && scenicConfig.getFaceType() != null) { - faceBodyAdapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType()); - faceBodyAdapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class)); - } else { - faceBodyAdapter = FaceBodyFactory.use(); - } + IFaceBodyAdapter faceBodyAdapter = scenicService.getScenicFaceBodyAdapter(scenicId); faceService.assureFaceDb(faceBodyAdapter, USER_FACE_DB_NAME+scenicId); SearchFaceRespVo userDbSearchResult = faceService.searchFace(faceBodyAdapter, USER_FACE_DB_NAME+scenicId, faceUrl, "判断是否为用户上传过的人脸"); float strictScore = 0.6F; @@ -225,13 +218,7 @@ public class FaceServiceImpl implements FaceService { return null; } ScenicConfigEntity scenicConfig = scenicRepository.getScenicConfig(face.getScenicId()); - IFaceBodyAdapter faceBodyAdapter; - if (scenicConfig != null && scenicConfig.getFaceType() != null) { - faceBodyAdapter = FaceBodyFactory.getAdapter(scenicConfig.getFaceType()); - faceBodyAdapter.loadConfig(JSONObject.parseObject(scenicConfig.getFaceConfigJson(), Map.class)); - } else { - faceBodyAdapter = FaceBodyFactory.use(); - } + IFaceBodyAdapter faceBodyAdapter = scenicService.getScenicFaceBodyAdapter(face.getScenicId()); SearchFaceRespVo scenicDbSearchResult = faceService.searchFace(faceBodyAdapter, String.valueOf(face.getScenicId()), face.getFaceUrl(), "人脸识别"); if (scenicDbSearchResult == null) { throw new BaseException("人脸识别失败,请换一张试试把~"); diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java index 28f3940..1b97b4d 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskFaceServiceImpl.java @@ -239,30 +239,27 @@ public class TaskFaceServiceImpl implements TaskFaceService { List allFaceSampleList = new ArrayList<>(); if (StringUtils.isNumeric(dbName)) { // 景区 allFaceSampleList = faceSampleMapper.listByIds(allFaceSampleIds); - Long firstFaceSampleId = acceptFaceSampleIds.get(0); - Optional firstFaceSample = allFaceSampleList.stream().filter(faceSample -> faceSample.getId().equals(firstFaceSampleId)).findAny(); - if (firstFaceSample.isPresent()) { - if (tourMinutes > 0) { - List acceptFaceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds); - Date startDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), -tourMinutes/2); - Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), tourMinutes/2); - acceptFaceSampleIds = acceptFaceSampleList.stream() - .filter(faceSample -> faceSample.getCreateAt().after(startDate) && faceSample.getCreateAt().before(endDate)) - .map(FaceSampleEntity::getId) - .collect(Collectors.toList()); - log.info("时间范围逻辑:最高匹配:{},时间范围需要在:{}~{}间", firstFaceSample, startDate, endDate); + if (!acceptFaceSampleIds.isEmpty()) { + Long firstFaceSampleId = acceptFaceSampleIds.get(0); + Optional firstFaceSample = allFaceSampleList.stream().filter(faceSample -> faceSample.getId().equals(firstFaceSampleId)).findAny(); + if (firstFaceSample.isPresent()) { + if (tourMinutes > 0) { + List acceptFaceSampleList = faceSampleMapper.listByIds(acceptFaceSampleIds); + Date startDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), -tourMinutes/2); + Date endDate = DateUtil.offsetMinute(firstFaceSample.get().getCreateAt(), tourMinutes/2); + acceptFaceSampleIds = acceptFaceSampleList.stream() + .filter(faceSample -> faceSample.getCreateAt().after(startDate) && faceSample.getCreateAt().before(endDate)) + .map(FaceSampleEntity::getId) + .collect(Collectors.toList()); + log.info("时间范围逻辑:最高匹配:{},时间范围需要在:{}~{}间", firstFaceSample, startDate, endDate); + } else { + log.info("时间范围逻辑:景区未限制"); + } } else { - log.info("时间范围逻辑:景区未限制"); + log.info("时间范围逻辑:最高匹配ID:{},未找到", firstFaceSampleId); } - } else { - log.info("时间范围逻辑:最高匹配ID:{},未找到", firstFaceSampleId); } } - if (acceptFaceSampleIds.isEmpty()) { - respVo.setFirstMatchRate(0f); - respVo.setSampleListIds(Collections.emptyList()); - return respVo; - } List collect = new ArrayList<>(); for (SearchFaceResultItem item : records) { MatchLocalRecord record = new MatchLocalRecord(); @@ -286,6 +283,11 @@ public class TaskFaceServiceImpl implements TaskFaceService { record.setMatched(item.getScore() > _threshold); collect.add(record); } + if (acceptFaceSampleIds.isEmpty()) { + respVo.setFirstMatchRate(0f); + respVo.setSampleListIds(Collections.emptyList()); + return respVo; + } logEntity.setMatchLocalRecord(JSONObject.toJSONString(collect)); respVo.setFirstMatchRate(response.getFirstMatchRate()); respVo.setSampleListIds(acceptFaceSampleIds); diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java index d191ce3..f5ad39c 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java @@ -117,8 +117,6 @@ public class TaskTaskServiceImpl implements TaskService { @Autowired private VideoRepository videoRepository; @Autowired - private OrderRepository orderRepository; - @Autowired private ScenicService scenicService; private final ReentrantLock lock = new ReentrantLock(); @@ -126,7 +124,6 @@ public class TaskTaskServiceImpl implements TaskService { private TaskStatusBiz taskStatusBiz; @Autowired private DeviceRepository deviceRepository; - private final ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 1024, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1024)); private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) { @@ -619,9 +616,9 @@ public class TaskTaskServiceImpl implements TaskService { } } videoMapper.updateRelationWhenTaskSuccess(taskId, video.getId(), isBuy); - executor.execute(() -> { + new Thread(() -> { sendVideoGeneratedServiceNotification(taskId); - }); + }).start(); } @Override diff --git a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java index d90798d..3ef1228 100644 --- a/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java +++ b/src/main/java/com/ycwl/basic/task/VideoPieceGetter.java @@ -1,5 +1,6 @@ package com.ycwl.basic.task; +import cn.hutool.core.thread.ThreadFactoryBuilder; import com.ycwl.basic.biz.OrderBiz; import com.ycwl.basic.biz.TaskStatusBiz; import com.ycwl.basic.device.DeviceFactory; @@ -41,6 +42,7 @@ import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; @@ -118,7 +120,13 @@ public class VideoPieceGetter { // taskStatusBiz.setFaceCutStatus(task.faceId, 0); // } AtomicBoolean invoke = new AtomicBoolean(false); - final ThreadPoolExecutor executor = new ThreadPoolExecutor(16, 512, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(512)); + final ThreadFactory threadFactory = new ThreadFactoryBuilder() + .setNamePrefix("VPG-" + task.faceId + "-t") + .build(); + final ThreadPoolExecutor executor = new ThreadPoolExecutor(16, 512, 0L, TimeUnit.MILLISECONDS, + new ArrayBlockingQueue<>(512), + threadFactory + ); List currentPlaceholder = new ArrayList<>(); List list = faceSampleMapper.listByIds(task.getFaceSampleIds()); Map pairDeviceMap = new ConcurrentHashMap<>();