CheckProgressRunnerImpl.java 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package com.fdkankan.download.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.fdkankan.redis.constant.RedisKey;
  5. import com.fdkankan.redis.constant.RedisLockKey;
  6. import com.fdkankan.redis.util.RedisLockUtil;
  7. import com.fdkankan.redis.util.RedisUtil;
  8. import com.fdkankan.common.bean.DownLoadTaskBean;
  9. import java.util.List;
  10. import java.util.stream.Collectors;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.boot.CommandLineRunner;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.stereotype.Component;
  15. /**
  16. * <p>
  17. * 应用启动校验是否有下载任务正在进行,如有过就重新入队头,从新下载
  18. * </p>
  19. *
  20. * @author dengsixing
  21. * @since 2022/2/22
  22. **/
  23. @Component
  24. public class CheckProgressRunnerImpl implements CommandLineRunner {
  25. @Autowired
  26. RedisUtil redisUtil;
  27. @Autowired
  28. RedisTemplate redisTemplate;
  29. @Autowired
  30. RedisLockUtil redisLockUtil;
  31. @Override
  32. public void run(String... args) throws Exception {
  33. //这里考虑到如果是集群部署,可能多个节点启动时,只需要一个节点进来就行了,所以加一个分布式锁
  34. String lockKey = String.format(RedisLockKey.LOCK_SCENE_DOWNLOAD_ING);
  35. boolean lock = redisLockUtil.lock(lockKey, RedisKey.EXPIRE_TIME_1_MINUTE);
  36. if(!lock){
  37. return;
  38. }
  39. try {
  40. //查询还没下载完毕的场景
  41. List<String> downLoadList = redisUtil.lGet(RedisKey.SCENE_DOWNLOAD_ING, 0, -1);
  42. if(CollUtil.isEmpty(downLoadList)){
  43. return;
  44. }
  45. //删除还没执行完毕的场景缓存
  46. redisUtil.del(RedisKey.SCENE_DOWNLOAD_ING);
  47. List<String> taskList = downLoadList.stream().map(num -> {
  48. return JSON.toJSONString(DownLoadTaskBean.builder().num(num).type("local").build());
  49. }).collect(Collectors.toList());
  50. //从新入队
  51. redisUtil.lLeftPushAll(RedisKey.SCENE_DOWNLOADS_TASK_V4, taskList);
  52. }finally {
  53. redisLockUtil.unlockLua(lockKey);
  54. }
  55. }
  56. }