Przeglądaj źródła

增加定时任务,清除6个月之前的计算目录

dengsixing 2 lat temu
rodzic
commit
262007bcb8

+ 20 - 0
src/main/java/com/fdkankan/scene/bean/SceneBean.java

@@ -0,0 +1,20 @@
+package com.fdkankan.scene.bean;
+
+import lombok.Data;
+
+/**
+ * <p>
+ * TODO
+ * </p>
+ *
+ * @author dengsixing
+ * @since 2022/10/9
+ **/
+@Data
+public class SceneBean {
+
+    private String num;
+
+    private String dataSource;
+
+}

+ 21 - 0
src/main/java/com/fdkankan/scene/controller/SceneCleanController.java

@@ -0,0 +1,21 @@
+package com.fdkankan.scene.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+@RestController
+@RequestMapping("/scene/sceneClean")
+public class SceneCleanController {
+
+}
+

+ 4 - 1
src/main/java/com/fdkankan/scene/controller/TestController.java

@@ -1,5 +1,6 @@
 package com.fdkankan.scene.controller;
 
+import com.fdkankan.scene.service.ISceneCleanService;
 import com.fdkankan.web.response.ResultData;
 import com.fdkankan.fyun.face.FYunFileServiceInterface;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,10 +22,12 @@ public class TestController {
 
     @Autowired
     private FYunFileServiceInterface fYunFileServiceInterface;
+    @Autowired
+    private ISceneCleanService sceneCleanService;
 
     @GetMapping("/test")
     public ResultData test(){
-        fYunFileServiceInterface.uploadFile("4dkankan", "F:\\test\\vision.json", "test_dsx/vision.json");
+        sceneCleanService.sceneCleanResource();
         return ResultData.ok();
     }
 

+ 63 - 0
src/main/java/com/fdkankan/scene/entity/SceneClean.java

@@ -0,0 +1,63 @@
+package com.fdkankan.scene.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+@Getter
+@Setter
+@TableName("t_scene_clean")
+public class SceneClean implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 场景码
+     */
+    @TableField("num")
+    private String num;
+
+    /**
+     * 是否已清除资源(0-否,1-是)
+     */
+    @TableField("state")
+    private Integer state;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * A-有效,I-无效
+     */
+    @TableLogic(value = "A", delval = "I")
+    @TableField("rec_status")
+    private String recStatus;
+
+
+}

+ 5 - 5
src/main/java/com/fdkankan/scene/generate/AutoGenerate.java

@@ -15,10 +15,10 @@ public class AutoGenerate {
 
     public static void main(String[] args) {
 
-        String path =System.getProperty("user.dir") + "\\4dkankan-center-scene";
+        String path =System.getProperty("user.dir");
 
-        generate(path,"test", getTables(new String[]{
-                "t_scene_cooperation"
+        generate(path,"scene", getTables(new String[]{
+                "t_scene_clean"
         }));
 
 //        generate(path,"goods", getTables(new String[]{
@@ -46,8 +46,8 @@ public class AutoGenerate {
 
 
     public static void  generate(String path,String moduleName,  List<String> tables){
-        FastAutoGenerator.create("jdbc:mysql://120.24.144.164:3306/4dkankan_v4",
-            "root","4Dage@4Dage#@168")
+        FastAutoGenerator.create("jdbc:mysql://rm-wz90w10465iiwwv098o.mysql.rds.aliyuncs.com/4dkankan_v4",
+            "root","D2719bd0cae1a005")
                 .globalConfig(builder -> {
                     builder.author("")               //作者
                             .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)

+ 23 - 0
src/main/java/com/fdkankan/scene/mapper/ISceneCleanMapper.java

@@ -0,0 +1,23 @@
+package com.fdkankan.scene.mapper;
+
+import com.fdkankan.scene.bean.SceneBean;
+import com.fdkankan.scene.entity.SceneClean;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import java.util.Date;
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+@Mapper
+public interface ISceneCleanMapper extends BaseMapper<SceneClean> {
+
+    List<SceneBean> selectNeadCleanScene(@Param("index") long index, @Param("size") int size, @Param("time") Date time);
+}

+ 34 - 99
src/main/java/com/fdkankan/scene/schedule/ScheduleJob.java

@@ -1,99 +1,34 @@
-package com.fdkankan.scene.schedule;//package com.fdkankan.scene.schedule;
-//
-//import com.fdkankan.common.util.RubberSheetingUtil;
-//import com.fdkankan.rabbitmq.util.RabbitMqProducer;
-//import com.fdkankan.redis.constant.RedisKey;
-//import com.fdkankan.redis.constant.RedisLockKey;
-//import com.fdkankan.redis.util.RedisLockUtil;
-//import com.fdkankan.scene.service.IScene3dNumService;
-//import com.fdkankan.scene.service.ISceneService;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.scheduling.annotation.Scheduled;
-//import org.springframework.stereotype.Component;
-//
-//@Slf4j
-//@Component
-//public class ScheduleJob {
-//
-//    @Value("${environment}")
-//    private String environment;
-//    @Value("${queue.modeling.modeling-call}")
-//    private String queueModelingCall;
-//    @Value("${scaling.mq.threshold.modeling-call}")
-//    private String modelingCallMqThreshold;
-//
-//    @Autowired
-//    ISceneService sceneService;
-//    @Autowired
-//    private IScene3dNumService scene3dNumService;
-//    @Autowired
-//    private RedisLockUtil redisLockUtil;
-//    @Autowired
-//    RubberSheetingUtil rubberSheetingUtil;
-//    @Autowired
-//    RabbitMqProducer rabbitMqProducer;
-//
-////    /**
-////     * 更新浏览量
-////     */
-////    @Scheduled(cron = "0 0/10 * * * ? ")
-////    public void updateViewCount() {
-////        if("hq".equals(environment)){
-////            return;
-////        }
-////        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/1 * * * ? ")
-////    public void generateSceneCode(){
-////        log.info("执行定时任务开始:批量生成场景码");
-////        scene3dNumService.batchCreateSceneNum();
-////        log.info("执行定时任务结束:批量生成场景码");
-////    }
-//
-////    /**
-////     * 开启场景计算弹性伸缩
-////     */
-////    @Scheduled(cron = "0 0/5 8-21 * * ? ")
-////    public void startupModelingServer() {
-////        if("hq".equals(environment)){
-////            return;
-////        }
-////        boolean lock = redisLockUtil.lock(
-////            RedisLockKey.LOCK_STARTUP_MODELING_SERVER, RedisKey.EXPIRE_TIME_5_MINUTE);
-////        if(!lock){
-////            return;
-////        }
-////        try {
-////            //当mq排队数大于指定数量时使用弹性升缩
-////            int mqNum = rabbitMqProducer.getMessageCount(queueModelingCall);
-////            log.info("每5分钟查询一次排队队列,mqNum:" + mqNum);
-////            if(mqNum - Integer.parseInt(modelingCallMqThreshold) > 0){
-////                String responce = rubberSheetingUtil.createEcs();
-////                log.info("开启弹性伸缩:{}", responce);
-////            }
-////        } catch (Exception e) {
-////            log.error(e.getMessage());
-////        }finally {
-////            redisLockUtil.unlockLua(RedisLockKey.LOCK_STARTUP_MODELING_SERVER);
-////        }
-////    }
-//
-//}
+package com.fdkankan.scene.schedule;
+
+import com.fdkankan.scene.service.ISceneCleanService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class ScheduleJob {
+
+    @Autowired
+    ISceneCleanService sceneCleanService;
+
+    /**
+     * 清理场景nas资源
+     * 执行时间:每天凌晨
+     * 删除条件:场景计算时间大于6个月且未删除过资源
+     */
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void sceneCleanResource() {
+        log.info("每天凌晨12:00开始执行定时任务:清除场景计算目录");
+        try {
+            sceneCleanService.sceneCleanResource();
+        } catch (Exception e) {
+            log.error(e.getMessage());
+        }
+    }
+
+
+
+}

+ 23 - 0
src/main/java/com/fdkankan/scene/service/ISceneCleanService.java

@@ -0,0 +1,23 @@
+package com.fdkankan.scene.service;
+
+import com.fdkankan.scene.bean.SceneBean;
+import com.fdkankan.scene.entity.SceneClean;
+import com.baomidou.mybatisplus.extension.service.IService;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+public interface ISceneCleanService extends IService<SceneClean> {
+
+    void sceneCleanResource();
+
+    List<SceneBean> selectNeadCleanScene(long index, int size, Date time);
+
+}

+ 138 - 0
src/main/java/com/fdkankan/scene/service/impl/SceneCleanServiceImpl.java

@@ -0,0 +1,138 @@
+package com.fdkankan.scene.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fdkankan.common.constant.CommonStatus;
+import com.fdkankan.common.util.FileUtils;
+import com.fdkankan.model.utils.CreateObjUtil;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.constant.RedisLockKey;
+import com.fdkankan.redis.util.RedisLockUtil;
+import com.fdkankan.redis.util.RedisUtil;
+import com.fdkankan.scene.bean.SceneBean;
+import com.fdkankan.scene.entity.SceneClean;
+import com.fdkankan.scene.mapper.ISceneCleanMapper;
+import com.fdkankan.scene.service.ISceneCleanService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.apache.commons.lang3.StringUtils;
+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.Transactional;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-10-09
+ */
+@RefreshScope
+@Service
+public class SceneCleanServiceImpl extends ServiceImpl<ISceneCleanMapper, SceneClean> implements ISceneCleanService {
+
+    @Autowired
+    private RedisLockUtil redisLockUtil;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Value("${scene.clean.size:10}")
+    private Integer sceneCleanSize;
+
+    @Transactional
+    @Override
+    public void sceneCleanResource(){
+
+        //这里考虑到日后会集群部署,所以查询需要清理资源的场景的写法是负载均衡写法,为了避免幻读影响到查询结果,所以写库放在循环外层
+        List<SceneClean> allInsertList = Lists.newArrayList();
+        Set<String> allUpdateSet = Sets.newHashSet();
+
+        DateTime dateTime = DateUtil.beginOfDay(DateUtil.offsetMonth(Calendar.getInstance().getTime(), -6));
+
+        while (true){
+            boolean lock = redisLockUtil.lock(RedisLockKey.LOCK_SCENE_CLEAN, RedisKey.EXPIRE_TIME_1_MINUTE);
+            if(!lock){
+                try {
+                    Thread.sleep(RandomUtil.randomLong(1000L, 2000L));
+                    continue;
+                } catch (InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }
+            long index = 0;
+            String indexStr =  redisUtil.get(RedisKey.SCENE_CLEAN_INDEX);
+            if(StringUtils.isNotBlank(indexStr)){
+                index = Long.valueOf(indexStr);
+            }
+            //下标增加1000
+            redisUtil.incr(RedisKey.SCENE_CLEAN_INDEX, sceneCleanSize);
+            //解锁
+            redisLockUtil.unlockLua(RedisLockKey.LOCK_SCENE_CLEAN);
+            //查询需要清理资源的场景
+            List<SceneBean> sceneBeanList = this.selectNeadCleanScene(index, sceneCleanSize, dateTime);
+            //如果查出来的场景集合是空,证明已经没有场景资源需要删除,则需要把查询下表删除,等待下一次定时任务执行
+            if(CollectionUtils.isEmpty(sceneBeanList)){
+                redisUtil.del(RedisKey.SCENE_CLEAN_INDEX);
+                break;
+            }
+            List<SceneClean> insertList = Lists.newArrayList();
+            List<String> numList = sceneBeanList.stream().map(scene -> scene.getNum()).collect(Collectors.toList());
+            List<SceneClean> updateList = this.list(new LambdaQueryWrapper<SceneClean>().in(SceneClean::getNum, numList));
+            Set<String> updateSet = new HashSet<>();
+            if(!CollectionUtils.isEmpty(updateList)){
+                updateList.stream().forEach(item->{
+                    updateSet.add(item.getNum());
+                });
+            }
+            sceneBeanList.stream().forEach(scene -> {
+                if(StringUtils.isNotBlank(scene.getDataSource())){
+                    try {
+                        CreateObjUtil.deleteFile(scene.getDataSource());
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+                if(!updateSet.contains(scene.getNum())){
+                    SceneClean sceneClean = new SceneClean();
+                    sceneClean.setNum(scene.getNum());
+                    insertList.add(sceneClean);
+                }
+            });
+            if(!CollectionUtils.isEmpty(insertList)){
+                allInsertList.addAll(insertList);
+            }
+            if(!CollectionUtils.isEmpty(updateSet)){
+                allUpdateSet.addAll(updateSet);
+            }
+        }
+
+        //写库
+        if(CollUtil.isNotEmpty(allInsertList)){
+            this.saveBatch(allInsertList);
+        }
+        if(CollUtil.isNotEmpty(allUpdateSet)){
+                this.update(new LambdaUpdateWrapper<SceneClean>().set(SceneClean::getState,
+                    CommonStatus.YES.code()).in(SceneClean::getNum, allUpdateSet));
+        }
+    }
+
+    @Override
+    public List<SceneBean> selectNeadCleanScene(long index, int size, Date time) {
+        return this.baseMapper.selectNeadCleanScene(index, size, time);
+    }
+}

+ 27 - 0
src/main/resources/mapper/scene/SceneCleanMapper.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fdkankan.scene.mapper.ISceneCleanMapper">
+
+  <select id="selectNeadCleanScene" resultType="com.fdkankan.scene.bean.SceneBean">
+    select t.num, t.data_source from (
+      SELECT p.num, p.data_source
+      FROM t_scene_pro p
+      WHERE p.status != 0 and p.is_upgrade != 1 and p.create_time <![CDATA[ <= ]]> #{time}
+      and p.num NOT IN (
+          SELECT c.num FROM t_scene_clean c WHERE p.num = c.num AND c.rec_status = 'A' AND c.state = 1
+      )
+
+      union
+
+      SELECT p.num, e.data_source
+      FROM t_scene_plus p
+      left join t_scene_plus_ext e on p.id = e.plus_id
+      WHERE p.scene_status != 0 and e.algorithm_time <![CDATA[ <= ]]> #{time}
+      and p.num NOT IN (
+          SELECT c.num FROM t_scene_clean c WHERE p.num = c.num AND c.rec_status = 'A' AND c.state = 1
+      )
+    ) t
+    LIMIT #{index},1000
+  </select>
+
+</mapper>