Prechádzať zdrojové kódy

1. 新增多线程调用百度OCR识别商品图片,限制线程最大为4个

SemiWarm 5 rokov pred
rodič
commit
023e5dd2a4

+ 29 - 0
src/main/java/com/pavis/ai/kwp/ioc/common/config/AsyncConfig.java

@@ -0,0 +1,29 @@
+package com.pavis.ai.kwp.ioc.common.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+@Configuration
+public class AsyncConfig {
+
+    // 声明一个线程池(并指定线程池的名字)
+    @Bean("recAndSaveExecutor")
+    public Executor recAndSaveExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        //核心线程数2:线程池创建时候初始化的线程数
+        executor.setCorePoolSize(2);
+        //最大线程数5:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
+        executor.setMaxPoolSize(4);
+        //缓冲队列180:用来缓冲执行任务的队列
+        executor.setQueueCapacity(180);
+        //允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
+        executor.setKeepAliveSeconds(60);
+        //线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
+        executor.setThreadNamePrefix("OcrGoodsAsync-");
+        executor.initialize();
+        return executor;
+    }
+}

+ 5 - 4
src/main/java/com/pavis/ai/kwp/ioc/service/impl/OcrGoodsServiceImpl.java

@@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -39,18 +40,18 @@ public class OcrGoodsServiceImpl implements OcrGoodsService {
     @Autowired
     private SubImgRetMapper subImgRetMapper;
 
+    @Async("recAndSaveExecutor")
     @Override
     public void recAndSave(OcrGoods ocrGoods) {
         Map<String, Object> map = Maps.newHashMap();
         map.put("upload_id", ocrGoods.getUploadId());
         List<UpGoods> upGoods = upGoodsMapper.selectByMap(map);
-        if (CollectionUtils.isNotEmpty(upGoods)) {
+        GoodsLog goodsLog = goodsLogMapper.selectById(ocrGoods.getUploadId());
+        if (goodsLog != null && CollectionUtils.isNotEmpty(upGoods)) {
+            goodsLog.setGStartTime(DateTimeUtils.dateTimeNow());
             for (UpGoods ug : upGoods) {
                 startOcr(ocrGoods.getUploadId(), ug);
             }
-        }
-        GoodsLog goodsLog = goodsLogMapper.selectById(ocrGoods.getUploadId());
-        if (goodsLog != null) {
             List<ErrGoods> errs = errGoodsMapper.selectByMap(map);
             if (CollectionUtils.isNotEmpty(errs)) {
                 goodsLog.setGError(true);

+ 4 - 4
src/main/java/com/pavis/ai/kwp/ioc/service/impl/SendServiceImpl.java

@@ -64,8 +64,6 @@ public class SendServiceImpl implements SendService {
 
     @Override
     public void sendGoodsToOcr(String uploadId, List<String> goodsImgs) {
-        GoodsLog goodsLog = goodsLogMapper.selectById(uploadId);
-        goodsLog.setGStartTime(DateTimeUtils.dateTimeNow());
         if (CollectionUtils.isNotEmpty(goodsImgs)) {
             Map<String, Object> map = Maps.newHashMap();
             map.put("uploadId", uploadId);
@@ -78,11 +76,13 @@ public class SendServiceImpl implements SendService {
                     correlationData);
             rabbitTemplate.setConfirmCallback(this);
         } else {
-            goodsLog.setGFinishTime(DateTimeUtils.dateTimeNow());
+            GoodsLog goodsLog = goodsLogMapper.selectById(uploadId);
+            goodsLog.setGStartTime(DateTimeUtils.dateTimeNow());
+            goodsLog.setGFinishTime(goodsLog.getGStartTime());
             goodsLog.setGTimeConsume(DateTimeUtils.calculateTimeConsume(goodsLog.getGStartTime(), goodsLog.getGFinishTime()));
             goodsLog.setGDone(true);
+            goodsLogMapper.updateById(goodsLog);
         }
-        goodsLogMapper.updateById(goodsLog);
     }
 
     @Override