package com.bw.fileDownload.service.impl; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONObject; import com.bw.fileDownload.components.SpringBootKafka; import com.bw.fileDownload.entity.Constants; import com.bw.fileDownload.service.DownloadExecService; import com.bw.fileDownload.service.FileDownloadService; import lombok.extern.slf4j.Slf4j; /** * 附件下载逻辑实现类 * @author jian.mao * @date 2025年2月6日 * @description */ @Service @Slf4j public class FileDownloadServiceImpl implements FileDownloadService { @Autowired private SpringBootKafka springBootKafka; @Autowired private DownloadExecService downloadExecService; @Value("${kafka.producer.topic}") private String topic; @Override public void video(Map task) { //视频队列的任务不仅仅做视频下载,还需要判断是否进行图片和文档的下载 Map parseData = (Map) task.get(Constants.PARSEDATA); Map data = (Map) parseData.get(Constants.DATA); String cid = (String) data.get(Constants.CID); String url = (String) data.get(Constants.URL); //获取视频链接 List videoList = (List) data.get(Constants.VIDEOLIST); //视频下载 Map resultMap = downloadExecService.downloadAndUploadVidoAndAudio(videoList, data); int downloadStatusCode = (int) resultMap.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("视频下载成功: url={},cid={}",url,cid); } else { log.info("视频下载失败: url={},cid={}",url,cid); } //判断文档和图片,包含进行下载操作 List fileList = (List) data.get(Constants.FILELIST); if(fileList != null && fileList.size() > 0) { //有文档 Map docRes = downloadExecService.DownloadAndUploadFile(fileList, data); downloadStatusCode = (int) docRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("文档下载成功: url={},cid={}",url,cid); } else { log.warn("文档下载失败,尝试无ua请求下载----"); docRes = downloadExecService.DownloadAndUploadFileNoUa(fileList, data); downloadStatusCode = (int) docRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("文档下载成功: url={},cid={}",url,cid); } else { log.error("文档下载失败: url={},cid={}",url,cid); } } } List imgList = (List) data.get(Constants.IMGLIST); if(imgList != null && imgList.size() > 0) { //有图片 Map imgRes = downloadExecService.DownloadAndUploadImg(imgList, data); downloadStatusCode = (int) imgRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("download task success: url=" + url + ",cid=" + cid); } else { log.warn("图片下载失败,切换无ua方式下载---"); imgRes = downloadExecService.DownloadAndUploadImgNoUa(imgList, data); downloadStatusCode = (int) imgRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("图片下载成功: url={},cid={}",url,cid); } else { log.error("图片下载失败: url={},cid={}",url,cid); } } } //发送kafka,完成数据流闭环 try { springBootKafka.send(topic, JSONObject.toJSONString(task)); } catch (Exception e) { log.error("视频类型任务发送失败。task:{},异常:{}",JSONObject.toJSON(task),e); } } @Override public void docOrImg(Map task) { //文档or图潘队列的任务 Map parseData = (Map) task.get(Constants.PARSEDATA); Map data = (Map) parseData.get(Constants.DATA); String cid = (String) data.get(Constants.CID); String url = (String) data.get(Constants.URL); //判断文档和图片,包含进行下载操作 List fileList = (List) data.get(Constants.FILELIST); if(fileList != null && fileList.size() > 0) { //有文档 Map docRes = downloadExecService.DownloadAndUploadFile(fileList, data); int downloadStatusCode = (int) docRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("文档下载成功: url={},cid={}",url,cid); } else { log.warn("文档下载失败,尝试无ua请求下载----"); docRes = downloadExecService.DownloadAndUploadFileNoUa(fileList, data); downloadStatusCode = (int) docRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("文档下载成功: url={},cid={}",url,cid); } else { log.error("文档下载失败: url={},cid={}",url,cid); } } } List imgList = (List) data.get(Constants.IMGLIST); if(imgList != null && imgList.size() > 0) { //有图片 Map imgRes = downloadExecService.DownloadAndUploadImg(imgList, data); int downloadStatusCode = (int) imgRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("download task success: url=" + url + ",cid=" + cid); } else { log.warn("图片下载失败,切换无ua方式下载---"); imgRes = downloadExecService.DownloadAndUploadImgNoUa(imgList, data); downloadStatusCode = (int) imgRes.get("downloadStatusCode"); if (downloadStatusCode == Constants.DOWNLOAD_SUCCESS) { log.info("图片下载成功: url={},cid={}",url,cid); } else { log.error("图片下载失败: url={},cid={}",url,cid); } } } //发送kafka,完成数据流闭环 try { springBootKafka.send(topic, JSONObject.toJSONString(task)); } catch (Exception e) { log.error("文档or图片类型任务发送失败。task:{},异常:{}",JSONObject.toJSON(task),e); } } @Override public void notFile(Map task) { try { //无附件不进行处理,直接发送kafka springBootKafka.send(topic, JSONObject.toJSONString(task)); } catch (Exception e) { log.error("无附件类型任务发送失败。task:{},异常:{}",JSONObject.toJSON(task),e); } } }