Browse Source

更新场景码池定时任务

dengsixing 3 years ago
parent
commit
1433c58024

+ 25 - 2
4dkankan-center-scene/src/main/java/com/fdkankan/scene/schedule/ScheduleJob.java

@@ -1,5 +1,6 @@
 package com.fdkankan.scene.schedule;
 
+import com.fdkankan.scene.service.IScene3dNumService;
 import com.fdkankan.scene.service.ISceneService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,18 +18,40 @@ public class ScheduleJob {
     @Value("${environment}")
     private String environment;
 
+    @Autowired
+    private IScene3dNumService scene3dNumService;
+
+    /**
+     * 更新浏览量
+     */
     @Scheduled(cron = "0 0/10 * * * ? ")
-    public void job4() {
+    public void updateViewCount() {
         if("hq".equals(environment)){
             return;
         }
-        log.info("每10分钟开始执行定时任务:更新浏览量");
+        log.info("执行定时任务开始:更新浏览量");
         try {
             //更新浏览量
             sceneService.updatePv();
         } catch (Exception e) {
             log.error("更新浏览量定时任务出错:", e);
         }
+        log.info("执行定时任务结束:更新浏览量");
+    }
+
+    /**
+     * <p>
+            定时生成场景码
+            查询码池中未使用场景码数量,如果小于阈值,执行批量生成
+     * </p>
+     * @author dengsixing
+     * @date 2022/3/26
+     **/
+    @Scheduled(cron = "0 0/2 * * * ? ")
+    public void generateSceneCode(){
+        log.info("执行定时任务开始:批量生成场景码");
+        scene3dNumService.batchCreateSceneNum();
+        log.info("执行定时任务结束:批量生成场景码");
     }
 
 }

+ 11 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/IScene3dNumService.java

@@ -21,6 +21,17 @@ public interface IScene3dNumService extends IService<Scene3dNum> {
 //
     void updateUsedStatus(List<String> nums);
 
+    /**
+     * 从码池中取出一个场景码
+     * @return
+     */
     String generateSceneNum();
 
+    /**
+     * 批量生成场景码并放入码池
+     */
+    void batchCreateSceneNum();
+
+
+
 }

+ 0 - 1
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/ISceneService.java

@@ -102,5 +102,4 @@ public interface ISceneService extends IService<Scene> {
     ResultData downLoadZSData(BaseSceneParamVO param) throws Exception;
 
 
-
 }

+ 72 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/Scene3dNumServiceImpl.java

@@ -4,8 +4,10 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fdkankan.common.constant.CommonStatus;
 import com.fdkankan.common.constant.RecStatus;
 import com.fdkankan.common.constant.TbStatus;
+import com.fdkankan.common.util.RandomUtil;
 import com.fdkankan.redis.constant.RedisKey;
 import com.fdkankan.redis.constant.RedisLockKey;
 import com.fdkankan.redis.util.RedisLockUtil;
@@ -16,8 +18,12 @@ import com.fdkankan.scene.service.IScene3dNumService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fdkankan.common.constant.ErrorCode;
 import com.fdkankan.common.exception.BusinessException;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -39,10 +45,18 @@ import java.util.Objects;
 @RefreshScope
 public class Scene3dNumServiceImpl extends ServiceImpl<IScene3dNumMapper, Scene3dNum> implements IScene3dNumService {
 
+    private
+
     @Autowired
     RedisUtil redisUtil;
     @Autowired
     RedisLockUtil redisLockUtil;
+    @Value("${scene.num.threshold:1000}")
+    private int threshold;
+    @Value("${scene.num.prefix:V4-}")
+    private String numPrefix;
+    @Value("${scene.num.batchSize:100}")
+    private int batchSize;
 
     @Override
     public String generateSceneNum(){
@@ -82,6 +96,64 @@ public class Scene3dNumServiceImpl extends ServiceImpl<IScene3dNumMapper, Scene3
     }
 
     @Override
+    public void batchCreateSceneNum() {
+
+        String lockKey = String.format(RedisLockKey.LOCK_BATCH_CREATE_NUM);
+        boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_10_MINUTE);
+        if(!lock){
+            return;
+        }
+        try {
+            long count = this.count(
+                new LambdaQueryWrapper<Scene3dNum>().eq(Scene3dNum::getUsed, CommonStatus.NO.code()));
+            if(count > threshold){
+                return;
+            }
+            int batchCnt = threshold / batchSize + (threshold % batchSize > 0 ? 1 : 0);
+            for (int i = 0; i < batchCnt; i++){
+                Set<String> numSet = this.turnCreateSceneNum(batchSize);
+                List<Scene3dNum> scene3dNumList = numSet.stream().map(num -> {
+                    Scene3dNum scene3dNum = new Scene3dNum();
+                    scene3dNum.setNum(num);
+                    return scene3dNum;
+                }).collect(Collectors.toList());
+                this.saveBatch(scene3dNumList);
+            }
+        }finally {
+            redisLockUtil.unlockLua(lockKey);
+        }
+    }
+
+    private Set<String> turnCreateSceneNum(int cnt){
+
+        String num;
+        Set<String> numSet = new HashSet<>();
+        for(int i = 0; i < cnt; i++){
+            num = numPrefix + RandomUtil.generateShortUuid();
+            numSet.add(num);
+        }
+        List<Scene3dNum> existList = this.list(
+            new LambdaQueryWrapper<Scene3dNum>()
+                .in(Scene3dNum::getNum, numSet));
+
+        Set<String> existNumSet = null;
+        if(CollUtil.isNotEmpty(existList)){
+            existNumSet = existList.stream().map(Scene3dNum::getNum).collect(Collectors.toSet());
+        }
+        if(CollUtil.isNotEmpty(existNumSet)){
+            numSet.removeAll(existNumSet);
+        }
+        if(numSet.size() < cnt){
+            numSet.addAll(this.turnCreateSceneNum(cnt - numSet.size()));
+        }
+        return numSet;
+    }
+
+
+
+
+
+    @Override
     public List<String> findSceneNum() {
         return baseMapper.findSceneNum();
     }

+ 1 - 0
4dkankan-center-scene/src/main/java/com/fdkankan/scene/service/impl/SceneServiceImpl.java

@@ -28,6 +28,7 @@ import com.fdkankan.redis.util.RedisUtil;
 import com.fdkankan.scene.entity.*;
 import com.fdkankan.scene.mapper.ISceneMapper;
 import com.fdkankan.scene.mapper.ISceneProMapper;
+import com.fdkankan.scene.service.IScene3dNumService;
 import com.fdkankan.scene.service.ISceneDataDownloadService;
 import com.fdkankan.scene.service.ISceneExtService;
 import com.fdkankan.scene.service.ISceneProExtService;