SceneDownLoadServiceImpl.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package com.fdkankan.download.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.json.JSONUtil;
  4. import com.fdkankan.download.bean.CurrentDownloadNumUtil;
  5. import com.fdkankan.download.bean.DownLoadTaskBean;
  6. import com.fdkankan.download.service.ISceneDownLoadService;
  7. import com.fdkankan.redis.constant.RedisKey;
  8. import com.fdkankan.redis.util.RedisUtil;
  9. import java.util.Objects;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.beans.factory.annotation.Value;
  12. import org.springframework.cloud.context.config.annotation.RefreshScope;
  13. import org.springframework.stereotype.Service;
  14. /**
  15. * <p>
  16. * TODO
  17. * </p>
  18. *
  19. * @author dengsixing
  20. * @since 2022/2/22
  21. **/
  22. @RefreshScope
  23. @Service
  24. public class SceneDownLoadServiceImpl implements ISceneDownLoadService {
  25. @Value("${scene.download.threadMax:3}")
  26. private Integer downloadThreadMax;
  27. @Autowired
  28. RedisUtil redisUtil;
  29. @Autowired
  30. SceneDownloadHandlerServiceImpl handlerService;
  31. @Override
  32. public void process() throws Exception {
  33. //统计本节点正在下载任务数量
  34. int downloadIngCnt = CurrentDownloadNumUtil.cntDownloadingLocal("v4");
  35. //如果正在下载的场景大于最大线程数,不往下执行
  36. if(downloadIngCnt >= downloadThreadMax){
  37. return;
  38. }
  39. for(int i = 0; i < downloadThreadMax - downloadIngCnt; i++){
  40. DownLoadTaskBean downLoadTaskBean = this.getTaskSceneNum("v4");
  41. //获取任务队列中队头场景码,如果是空,标识没有场景要下载,则退出程序
  42. if(Objects.isNull(downLoadTaskBean)){
  43. continue;
  44. }
  45. handlerService.download(downLoadTaskBean);
  46. }
  47. }
  48. @Override
  49. public void processV3() throws Exception {
  50. //统计本节点正在下载任务数量
  51. int downloadIngCnt = CurrentDownloadNumUtil.cntDownloadingLocal("v3");
  52. //如果正在下载的场景大于最大线程数,不往下执行
  53. if(downloadIngCnt >= downloadThreadMax){
  54. return;
  55. }
  56. for(int i = 0; i < downloadThreadMax - downloadIngCnt; i++){
  57. DownLoadTaskBean downLoadTaskBean = this.getTaskSceneNum("v3");
  58. //获取任务队列中队头场景码,如果是空,标识没有场景要下载,则退出程序
  59. if(Objects.isNull(downLoadTaskBean)){
  60. continue;
  61. }
  62. handlerService.downloadV3(downLoadTaskBean);
  63. }
  64. }
  65. private DownLoadTaskBean getTaskSceneNum(String version) throws Exception{
  66. //redis待下载任务出队
  67. String taskkey = RedisKey.SCENE_DOWNLOADS_TASK_V4;
  68. if("v3".equals(version)){
  69. taskkey = RedisKey.DOWNLOAD_TASK;
  70. // taskkey = "downloads:task:v3";
  71. }
  72. String downloadTask = redisUtil.lLeftPop(taskkey);
  73. if(StrUtil.isEmpty(downloadTask)){
  74. return null;
  75. }
  76. DownLoadTaskBean downLoadTaskBean = JSONUtil.toBean(downloadTask, DownLoadTaskBean.class);
  77. if(downLoadTaskBean == null || StrUtil.isEmpty(downLoadTaskBean.getNum()) || !"local".equals(downLoadTaskBean.getType())){
  78. throw new Exception("下载任务数据不正确,downloadTask:" + downloadTask);
  79. }
  80. //如果场景正在下载中,就直接丢弃
  81. String num = downLoadTaskBean.getNum();
  82. if(CurrentDownloadNumUtil.containSceneNum(num, version)){
  83. return null;
  84. }
  85. //本地缓存入队
  86. CurrentDownloadNumUtil.addSceneNum(num, version);
  87. //正在下载任务入队
  88. String downloadingKey = RedisKey.SCENE_DOWNLOAD_ING;
  89. if("v3".equals(version)){
  90. downloadingKey = RedisKey.SCENE_V3_DOWNLOAD_ING;
  91. }
  92. redisUtil.lLeftPush(downloadingKey, num);
  93. return downLoadTaskBean;
  94. }
  95. }