Bläddra i källkod

bugfix:3513加线程

刘云鑫 1 månad sedan
förälder
incheckning
4b9ed7317a

+ 45 - 3
alien-store/src/main/java/shop/alien/store/controller/StoreImgController.java

@@ -16,7 +16,9 @@ import shop.alien.store.service.StoreOfficialAlbumService;
 import shop.alien.store.util.GroupConstant;
 import shop.alien.store.util.ai.AiContentModerationUtil;
 
+import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.*;
 import java.util.stream.Collectors;
 
 /**
@@ -84,11 +86,11 @@ public class StoreImgController {
         if(storeImgInfoVo.getStoreImgList().isEmpty()){
             return R.fail("图片列表为空,请重新上传图片");
         }
-        // TODO 审核图片是否违规
+        // 审核图片是否违规:有多少张图片就创建多少个线程并行审核
         List<String> imageUrls = storeImgList.stream()
                 .map(StoreImg::getImgUrl)
                 .collect(Collectors.toList());
-        AiContentModerationUtil.AuditResult auditResult = aiContentModerationUtil.auditContent(null, imageUrls);
+        AiContentModerationUtil.AuditResult auditResult = auditImagesInParallel(imageUrls);
         if (!auditResult.isPassed()) {
             return R.fail(auditResult.getFailureReason()); // 文本内容异常(包含敏感词)
         }
@@ -334,6 +336,46 @@ public class StoreImgController {
         return R.data(storeImgService.getByCover(storeId, imgType));
     }
 
-
+    /**
+     * 有多少张图片就创建多少个线程并行审核,每张图片单独审核
+     *
+     * @param imageUrls 图片URL列表
+     * @return 合并后的审核结果,任一张不通过则整体不通过
+     */
+    private AiContentModerationUtil.AuditResult auditImagesInParallel(List<String> imageUrls) {
+        if (imageUrls == null || imageUrls.isEmpty()) {
+            return new AiContentModerationUtil.AuditResult(true, null);
+        }
+        int threadCount = imageUrls.size();
+        ExecutorService executor = Executors.newFixedThreadPool(threadCount);
+        try {
+            List<Future<AiContentModerationUtil.AuditResult>> futures = imageUrls.stream()
+                    .map(url -> executor.submit(() ->
+                            aiContentModerationUtil.auditContent(null, Collections.singletonList(url))))
+                    .collect(Collectors.toList());
+            String firstFailureReason = null;
+            for (Future<AiContentModerationUtil.AuditResult> future : futures) {
+                AiContentModerationUtil.AuditResult result = future.get(30, TimeUnit.SECONDS);
+                if (!result.isPassed() && firstFailureReason == null) {
+                    firstFailureReason = result.getFailureReason();
+                }
+            }
+            return firstFailureReason != null
+                    ? new AiContentModerationUtil.AuditResult(false, firstFailureReason)
+                    : new AiContentModerationUtil.AuditResult(true, null);
+        } catch (TimeoutException e) {
+            log.error("图片审核超时", e);
+            return new AiContentModerationUtil.AuditResult(false, "审核超时");
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            log.error("图片审核被中断", e);
+            return new AiContentModerationUtil.AuditResult(false, "审核被中断");
+        } catch (ExecutionException e) {
+            log.error("图片审核异常", e);
+            return new AiContentModerationUtil.AuditResult(false, "审核异常");
+        } finally {
+            executor.shutdown();
+        }
+    }
 
 }