FastDFS并发问题的排查经历

打印 上一主题 下一主题

主题 1044|帖子 1044|积分 3132

附件用的fastdf上传和下载的, 本地开发时就没考虑过多文件上传就会有并发的问题,比如多个只上传成功了一个或者上传了但是文档内容缺失了,变成0字节。
呵。。都是一次难忘的经历。
经过本地模拟大批量的上传下载, 发现fastdf是在启动时就初始化了tracker和stroge, 每次调用过他的接口后都会关闭连接, 这样就导致上传的不完整或者不成功。也是后面找的博客看到的,非常感谢这篇文章。https://blog.csdn.net/AFSGEFEGH/article/details/109034532?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-109034532-blog-114929991.235^v27^pc_relevant_multi_platform_whitelistv3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-3-109034532-blog-114929991.235^v27^pc_relevant_multi_platform_whitelistv3&utm_relevant_index=6


记得方法上面加上synchronized
点击查看代码
  1.         @RequestMapping(value = "/batchDownloadForThesisCheck2", method = RequestMethod.POST)
  2.         public synchronized void batchDownloadForThesisCheck2(@RequestBody List<FileInfoDto> fileInfoList)  {
  3.                 if(CollectionUtils.isEmpty(fileInfoList)){
  4.                         throw new EducationException("下载附件失败");
  5.                 }
  6.                 List<FileInfoDto> fileInfoDtos = differentFileName(fileInfoList);
  7. //                List<FileInfoDto> fileInfoDtos = new ArrayList<>();
  8. //                for(int fi=0;fi<300;fi++){
  9. //                        FileInfoDto it = new FileInfoDto();
  10. //                        it.setFileName("20210115_小鱼儿"+fi+"_jjlw.doc");
  11. //                        fileInfoDtos.add(it);
  12. //                }
  13.                 String zipName = request.getParameter("zipName");
  14.                 if(StringUtils.isEmpty(zipName)) zipName = "批量下载";
  15.                 ZipOutputStream zipOS = null ;
  16.                 InputStream is = null;
  17.                 OutputStream os = null;
  18.                 // 计算百分值
  19.                 int index =1;
  20.                 int totalSize =CollectionUtils.isNotEmpty(fileInfoDtos) ? fileInfoDtos.size():1;
  21.                 try {
  22.                         response.setContentType("application/octet-stream; charset=UTF-8");
  23.                         response.setHeader("Access-Control-Expose-Headers", "fileName");
  24.                         response.setHeader("fileName", URLEncoder.encode(zipName, "UTF-8"));
  25.                         os = response.getOutputStream();
  26.                         zipOS = new ZipOutputStream(os);
  27.                         for (FileInfoDto info : fileInfoDtos) {
  28.                                 // 机检论文换名字,学号_姓名_jjlw命名
  29.                                 String itemFileName= info.getFileName();
  30. //                                itemFileName = "S20020804005_陈明鑫_jjlw .docx";
  31.                                 int secondShowIndex = Common.findNumber(itemFileName,"_",2);
  32.                                 int firstShowIndex = Common.findNumber(itemFileName,"_",1);
  33.                                 if("1".equals(info.getPaperToName())){
  34.                                         // 文件格式1:学校代码_学号_LW.doc 2:学号_姓名_jjlw
  35.                                         itemFileName = "10356_"+itemFileName.substring(0,firstShowIndex)+"_LW"+itemFileName.substring(itemFileName.lastIndexOf("."),itemFileName.length());
  36.                                 }else{
  37.                                         itemFileName = itemFileName.substring(0,secondShowIndex)+"_jjlw"+itemFileName.substring(itemFileName.lastIndexOf("."),itemFileName.length());
  38.                                 }
  39.                                 logger.error("已下载学生:{} "  ,itemFileName);
  40.                                 zipOS.putNextEntry(new ZipEntry(itemFileName));
  41.                                 try{
  42.                                         is = fastDFS.downloadFile(info.getFileId());
  43. //                                        is = fastDFS.downloadFile("group1/M00/00/C0/wKgjdWQYEJ-AbefsAdOyZXrKanw028.doc");
  44.                                         int len = 0;
  45.                                         byte[] buffer = new byte[1024*8];
  46.                                         while ((len = is.read(buffer)) != -1) {
  47.                                                 zipOS.write(buffer, 0, len);
  48.                                         }
  49. //                                        is.close();
  50.                                         // 计算进度,向下取整
  51.                                         double nowProcess = Math.floor((index*100)/totalSize);
  52.                                         logger.error("已下载”{}",index);
  53. //                                        createProcessDownFile(nowProcess,"已下载"+nowProcess+"%",info.getTimeId(),info.getUserId());
  54.                                         index ++;
  55.                                 }catch(Exception ignored){
  56.                                 }
  57.                                 zipOS.flush();
  58. //                                zipOS.closeEntry();
  59.                         }
  60.                 } catch (IOException e) {
  61. //                        createProcessDownFile(100d,"批量下载发生错误",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
  62.                         logger.error("批量下载发生错误: " + e.getMessage(), e);
  63.                 } finally {
  64.                         try {
  65.                                 if (zipOS != null) {
  66.                                         zipOS.closeEntry();
  67.                                         zipOS.close();
  68.                                 }
  69.                                 if (os != null) os.close();
  70. //                                createProcessDownFile(100d,"已下载100%",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
  71.                                 logger.warn("关闭机检下载 :"  );
  72.                         } catch (IOException e) {
  73. //                                createProcessDownFile(100d,"批量下载发生错误,关闭文件流失败",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
  74.                                 logger.warn("关闭文件流失败, cause by :" + e.getMessage());
  75.                         }
  76. //                        finally {
  77. //                                createProcessDownFile(100d,"已下载100%",fileInfoList.get(0).getTimeId(),fileInfoList.get(0).getUserId());
  78. //                                logger.warn("关闭机检下载 :"  );
  79. //                        }
  80.                 }
  81.         }
复制代码
fastdf源码中storageServer每次用完都会关闭


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表