SceneCleanServiceImpl.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.fdkankan.ucenter.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.fdkankan.common.constant.CommonStatus;
  6. import com.fdkankan.common.util.DateUtil;
  7. import com.fdkankan.common.util.FileUtils;
  8. import com.fdkankan.redis.constant.RedisKey;
  9. import com.fdkankan.redis.constant.RedisLockKey;
  10. import com.fdkankan.redis.util.RedisLockUtil;
  11. import com.fdkankan.ucenter.bean.SceneBean;
  12. import com.fdkankan.ucenter.bean.SceneClean;
  13. import com.fdkankan.ucenter.mapper.ISceneCleanMapper;
  14. import com.fdkankan.ucenter.service.ISceneCleanService;
  15. import lombok.extern.slf4j.Slf4j;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.beans.factory.annotation.Value;
  19. import org.springframework.cloud.context.config.annotation.RefreshScope;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import org.springframework.util.CollectionUtils;
  23. import java.util.*;
  24. import java.util.stream.Collectors;
  25. /**
  26. * <p>
  27. * 服务实现类
  28. * </p>
  29. *
  30. * @author
  31. * @since 2022-10-09
  32. */
  33. @RefreshScope
  34. @Service
  35. @Slf4j
  36. public class SceneCleanServiceImpl extends ServiceImpl<ISceneCleanMapper, SceneClean> implements ISceneCleanService {
  37. @Autowired
  38. private RedisLockUtil redisLockUtil;
  39. @Value("${scene.clean.size:10}")
  40. private Integer sceneCleanSize;
  41. @Transactional
  42. @Override
  43. public void sceneCleanResource(){
  44. // 获取redis 锁
  45. boolean lock = redisLockUtil.lock(RedisLockKey.LOCK_SCENE_CLEAN, RedisKey.EXPIRE_TIME_2_HOUR);
  46. if(!lock){
  47. log.warn("未获取到清除资源锁,退出任务!");
  48. return;
  49. }
  50. Date time = DateUtil.delay(Calendar.getInstance().getTime(), -7, Calendar.MONTH);
  51. time.setHours(0);
  52. time.setMinutes(0);
  53. time.setSeconds(0);
  54. //查询需要清理资源的场景
  55. List<SceneBean> sceneProEntityList = selectNeadCleanScene(0,sceneCleanSize, time);
  56. //如果查出来的场景集合是空,证明已经没有场景资源需要删除,则需要把查询下表删除,等待下一次定时任务执行
  57. if (CollectionUtils.isEmpty(sceneProEntityList)) {
  58. log.info("未查询到过期场景,退出任务!");
  59. redisLockUtil.unlockLua(RedisLockKey.LOCK_SCENE_CLEAN);
  60. return;
  61. }
  62. List<String> numList = sceneProEntityList.parallelStream().map(SceneBean::getNum).collect(Collectors.toList());
  63. List<SceneClean> insertList = new ArrayList<>();
  64. List<SceneClean> updateList = this.list(new LambdaQueryWrapper<SceneClean>().in(SceneClean::getNum, numList));
  65. Set<String> updateSet = updateList.stream().map(SceneClean::getNum).collect(Collectors.toSet());
  66. sceneProEntityList.stream().forEach(scene -> {
  67. if (StringUtils.isNotBlank(scene.getDataSource())) {
  68. // 查询该资源的最新计算时间
  69. List<SceneClean> scenes = findAllByDateSource(scene.getDataSource());
  70. if (scenes.get(0).getCreateTime().before(time)) {
  71. try {
  72. FileUtils.deleteDirectory(scene.getDataSource());
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. updateSet.remove(scene.getNum());
  76. return;
  77. }
  78. }
  79. }
  80. if (!updateSet.contains(scene.getNum())) {
  81. SceneClean sceneCleanEntity = new SceneClean();
  82. sceneCleanEntity.setState(1);
  83. sceneCleanEntity.setNum(scene.getNum());
  84. sceneCleanEntity.setCreateTime(new Date());
  85. sceneCleanEntity.setUpdateTime(new Date());
  86. sceneCleanEntity.setRecStatus("A");
  87. insertList.add(sceneCleanEntity);
  88. }
  89. });
  90. //写库
  91. if(!CollectionUtils.isEmpty(insertList)){
  92. insertList.parallelStream().forEach(insert -> log.info("清除资源目录:{}", insert.getNum()));
  93. this.saveBatch(insertList);
  94. }
  95. if(!CollectionUtils.isEmpty(updateSet)){
  96. updateSet.parallelStream().forEach(num -> log.info("清除更新资源目录:{}", num));
  97. this.update(new LambdaUpdateWrapper<SceneClean>()
  98. .set(SceneClean::getState, CommonStatus.YES.code())
  99. .set(SceneClean::getUpdateTime,new Date())
  100. .in(SceneClean::getNum, updateSet));
  101. }
  102. redisLockUtil.unlockLua(RedisLockKey.LOCK_SCENE_CLEAN);
  103. }
  104. private List<SceneClean> findAllByDateSource(String dataSource) {
  105. return this.baseMapper.findAllByDateSource(dataSource);
  106. }
  107. @Override
  108. public List<SceneBean> selectNeadCleanScene(long index, int size, Date time) {
  109. return this.baseMapper.selectNeadCleanScene(index, size, time);
  110. }
  111. }