package com.fdkankan.download.service.impl; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.fdkankan.download.bean.CurrentDownloadNumUtil; import com.fdkankan.download.bean.DownLoadTaskBean; import com.fdkankan.download.service.ISceneDownLoadService; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.util.RedisUtil; import java.util.Objects; 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; /** *
* TODO *
* * @author dengsixing * @since 2022/2/22 **/ @RefreshScope @Service public class SceneDownLoadServiceImpl implements ISceneDownLoadService { @Value("${scene.download.threadMax:3}") private Integer downloadThreadMax; @Autowired RedisUtil redisUtil; @Autowired SceneDownloadHandlerServiceImpl handlerService; @Override public void process() throws Exception { //统计本节点正在下载任务数量 int downloadIngCnt = CurrentDownloadNumUtil.cntDownloadingLocal("v4"); //如果正在下载的场景大于最大线程数,不往下执行 if(downloadIngCnt >= downloadThreadMax){ return; } for(int i = 0; i < downloadThreadMax - downloadIngCnt; i++){ DownLoadTaskBean downLoadTaskBean = this.getTaskSceneNum("v4"); //获取任务队列中队头场景码,如果是空,标识没有场景要下载,则退出程序 if(Objects.isNull(downLoadTaskBean)){ continue; } handlerService.download(downLoadTaskBean); } } @Override public void processV3() throws Exception { //统计本节点正在下载任务数量 int downloadIngCnt = CurrentDownloadNumUtil.cntDownloadingLocal("v3"); //如果正在下载的场景大于最大线程数,不往下执行 if(downloadIngCnt >= downloadThreadMax){ return; } for(int i = 0; i < downloadThreadMax - downloadIngCnt; i++){ DownLoadTaskBean downLoadTaskBean = this.getTaskSceneNum("v3"); //获取任务队列中队头场景码,如果是空,标识没有场景要下载,则退出程序 if(Objects.isNull(downLoadTaskBean)){ continue; } handlerService.downloadV3(downLoadTaskBean); } } private DownLoadTaskBean getTaskSceneNum(String version) throws Exception{ //redis待下载任务出队 String taskkey = RedisKey.SCENE_DOWNLOADS_TASK_V4; if("v3".equals(version)){ taskkey = RedisKey.DOWNLOAD_TASK; // taskkey = "downloads:task:v3"; } String downloadTask = redisUtil.lLeftPop(taskkey); if(StrUtil.isEmpty(downloadTask)){ return null; } DownLoadTaskBean downLoadTaskBean = JSONUtil.toBean(downloadTask, DownLoadTaskBean.class); if(downLoadTaskBean == null || StrUtil.isEmpty(downLoadTaskBean.getNum()) || !"local".equals(downLoadTaskBean.getType())){ throw new Exception("下载任务数据不正确,downloadTask:" + downloadTask); } //如果场景正在下载中,就直接丢弃 String num = downLoadTaskBean.getNum(); if(CurrentDownloadNumUtil.containSceneNum(num, version)){ return null; } //本地缓存入队 CurrentDownloadNumUtil.addSceneNum(num, version); //正在下载任务入队 String downloadingKey = RedisKey.SCENE_DOWNLOAD_ING; if("v3".equals(version)){ downloadingKey = RedisKey.SCENE_V3_DOWNLOAD_ING; } redisUtil.lLeftPush(downloadingKey, num); return downLoadTaskBean; } }