Переглянути джерело

Merge branch 'hotfix-zipAnnex' into 'Release'

打包反馈



See merge request !1098

menduo 5 роки тому
батько
коміт
6afbcbab2d

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/AnswerAnnexService.java

@@ -1,5 +1,7 @@
 package cn.iselab.mooctest.site.service;
 
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
+
 import java.util.List;
 
 /**

+ 3 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/OSSService.java

@@ -1,5 +1,7 @@
 package cn.iselab.mooctest.site.service;
 
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
+
 /**
  * @author yyy
  * @date 2019/11/13 15:53
@@ -15,6 +17,6 @@ public interface OSSService {
      * @return 新zip的oss地址
      * @throws Exception 异常
      */
-    String zipFolder(String bucket, String contextPath,String putBucket, String newFilePath) throws Exception;
+    String zipFolder(String bucket, String contextPath, String putBucket, String newFilePath, String cacheKey) throws Exception;
 
 }

+ 3 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/AnswerAnnexServiceImpl.java

@@ -10,6 +10,7 @@ import cn.iselab.mooctest.site.service.AnswerAnnexService;
 import cn.iselab.mooctest.site.service.Exam2CaseService;
 import cn.iselab.mooctest.site.service.OSSService;
 import cn.iselab.mooctest.site.util.data.CacheUtil;
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import lombok.extern.slf4j.Slf4j;
@@ -80,7 +81,8 @@ public class AnswerAnnexServiceImpl implements AnswerAnnexService {
         cacheUtil.setDownloadStatus(examId, paperId, caseId, DownloadStatus.TASKING);
         String contextPath = "answerAnnex/"+examId+"/"+caseId+"/";
         String newFilePath = "answerAnnexZip/"+examId+"_"+caseId+"_"+System.currentTimeMillis()+".zip";
-        String downloadUrl = ossService.zipFolder(bucketName, contextPath, bucketName, newFilePath);
+        String downloadUrl = ossService.zipFolder(bucketName, contextPath, bucketName, newFilePath,
+                examId+"-"+paperId+"-"+caseId);
         exam2CaseService.setExam2CaseProperty(examId, paperId, caseId, Exam2CasePropertiesConstant.ANNEX_URL, downloadUrl);
         cacheUtil.setDownloadStatus(examId, paperId, caseId, DownloadStatus.NO_TASK);
     }

+ 19 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/OSSServiceImpl.java

@@ -1,9 +1,13 @@
 package cn.iselab.mooctest.site.service.impl;
 
 import cn.iselab.mooctest.site.service.OSSService;
+import cn.iselab.mooctest.site.util.data.CacheUtil;
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
 import com.aliyun.oss.OSSClient;
 import com.aliyun.oss.model.*;
 import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -28,13 +32,19 @@ public class OSSServiceImpl implements OSSService {
     @Resource
     OSSClient ossClient;
 
+    @Resource
+    CacheUtil cacheUtil;
+
+    private final Logger LOG = LoggerFactory.getLogger(getClass());
+
     /**
      * 1. 将contextPath下的文件批量打包成服务器上的临时文件.zip
      * 2. 将临时文件上传到oss
      * 3. 删除临时文件,返回oss上zip的下载链接
      */
     @Override
-    public String zipFolder(String bucket, String contextPath, String putBucket, String newFilePath) throws Exception {
+    public String zipFolder(String bucket, String contextPath, String putBucket,
+                            String newFilePath, String cacheKey) throws Exception {
         //打包zip
 
         //列举contextPath下的所有文件
@@ -59,8 +69,14 @@ public class OSSServiceImpl implements OSSService {
         CheckedOutputStream cos = new CheckedOutputStream(fos, new Adler32());
         ZipOutputStream zos = new ZipOutputStream(cos);
 
-        for(OSSObjectSummary summary: sums){
+        int totalNum = sums.size();
+        for(int i=0; i<totalNum;i++){
+            OSSObjectSummary summary = sums.get(i);
             String fileName = summary.getKey();
+            LOG.info(String.format("批量下载,共[%d]个文件,当前至第[%d]个文件,文件名为[%s]",
+                    totalNum, i, fileName));
+            cacheUtil.setDownloadProcess(cacheKey, String.format("批量下载,共[%d]个文件,当前至第[%d]个文件,文件名为[%s]",
+                    totalNum, i, fileName));
             zos.putNextEntry(new ZipEntry(fileName.replace(contextPath, "")));
 
             OSSObject ossObject = ossClient.getObject(bucket, fileName);
@@ -74,6 +90,7 @@ public class OSSServiceImpl implements OSSService {
         zos.close();
 
         // 上传到oss
+        cacheUtil.setDownloadProcess(cacheKey, "准备上传到oss");
         PutObjectRequest putObjectRequest = new PutObjectRequest(putBucket, newFilePath, zipFile);
         PutObjectResult result = ossClient.putObject(putObjectRequest);
 

+ 16 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/data/CacheUtil.java

@@ -28,7 +28,9 @@ public class CacheUtil {
 
     private Cache<String, DownloadStatus> downloadStatus;
 
-    @PostConstruct
+    private Cache<String, String> downloadProcess;
+
+  @PostConstruct
     private void init(){
         metaNodeCache = CacheBuilder
                 .newBuilder()
@@ -40,6 +42,11 @@ public class CacheUtil {
                 .maximumSize(100)
                 .expireAfterWrite(expireDuration, TimeUnit.MINUTES)
                 .build();
+        downloadProcess = CacheBuilder
+                .newBuilder()
+                .maximumSize(100)
+                .expireAfterWrite(expireDuration, TimeUnit.MINUTES)
+                .build();
     }
 
     public CaseGraphDTO getMetaNode(long caseId) throws ExecutionException {
@@ -62,4 +69,12 @@ public class CacheUtil {
     public void setDownloadStatus(long examId,long paperId, long caseId, DownloadStatus status){
         downloadStatus.put(examId+"_"+paperId+"_"+caseId, status);
     }
+
+    public String getDownloadProcess(String key) throws ExecutionException {
+        return downloadProcess.get(key, ()->"当前无进度,准备处理");
+    }
+
+    public void setDownloadProcess(String key, String process){
+        downloadProcess.put(key, process);
+    }
 }

+ 5 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ExamController.java

@@ -7,6 +7,8 @@ import cn.iselab.mooctest.site.models.Exam;
 import cn.iselab.mooctest.site.models.instancePermission.ExamPermission;
 import cn.iselab.mooctest.site.service.AnswerAnnexService;
 import cn.iselab.mooctest.site.web.data.*;
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
+import cn.iselab.mooctest.site.web.data.response.ServerCode;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
 import cn.iselab.mooctest.site.web.logic.*;
 import cn.iselab.mooctest.site.common.enums.EntityTypeEnum;
@@ -450,12 +452,12 @@ public class ExamController extends BaseSearchController {
 
     @RequiresPermissions("task:view")
     @RequestMapping(value = UrlConstants.API+"exam2case/annexUrl", method=RequestMethod.GET)
-    public String getAnnexZipUrl(@RequestParam("examId") long examId,@RequestParam("paperId") long paperId, @RequestParam("caseId") long caseId){
+    public ResponseVO<String> getAnnexZipUrl(@RequestParam("examId") long examId, @RequestParam("paperId") long paperId, @RequestParam("caseId") long caseId){
         try{
-            return examLogic.queryAnnexZipUrl(examId, paperId, caseId);
+           return examLogic.queryAnnexZipUrl(examId, paperId, caseId);
         }catch (Exception e){
             e.printStackTrace();
-            return null;
+            return new ResponseVO<>(50000, e.getMessage(), null);
         }
     }
 

+ 2 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ExamLogic.java

@@ -1,6 +1,7 @@
 package cn.iselab.mooctest.site.web.logic;
 
 import cn.iselab.mooctest.site.web.data.*;
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
 import cn.iselab.mooctest.site.web.exception.AssignedTaskNotExistException;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -84,6 +85,6 @@ public interface ExamLogic {
      * @return 已生成返回url,否则返回null
      * @throws Exception
      */
-    String queryAnnexZipUrl(long examId, long paperId, long caseId) throws Exception;
+    ResponseVO<String> queryAnnexZipUrl(long examId, long paperId, long caseId) throws Exception;
 
 }

+ 11 - 9
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ExamLogicImpl.java

@@ -14,6 +14,8 @@ import cn.iselab.mooctest.site.service.instancePermission.ExamPermissionService;
 import cn.iselab.mooctest.site.service.validation.ValidateResult;
 import cn.iselab.mooctest.site.util.data.CacheUtil;
 import cn.iselab.mooctest.site.web.data.*;
+import cn.iselab.mooctest.site.web.data.response.ResponseVO;
+import cn.iselab.mooctest.site.web.data.response.ServerCode;
 import cn.iselab.mooctest.site.web.data.wrapper.*;
 import cn.iselab.mooctest.site.web.exception.AssignedTaskNotExistException;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
@@ -49,7 +51,6 @@ import java.util.stream.Collectors;
  */
 
 @Service
-@Slf4j
 public class ExamLogicImpl extends BaseLogic implements ExamLogic {
 
     @Autowired
@@ -500,7 +501,7 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     }
 
     @Override
-    public String queryAnnexZipUrl(long examId, long paperId, long caseId) throws Exception{
+    public ResponseVO<String> queryAnnexZipUrl(long examId, long paperId, long caseId) throws Exception{
         //首先查询数据库中是否已有下载链接
         Exam2Case exam2Case = exam2CaseService.findByExamIdPaperIdCaseId(examId,paperId,caseId);
         String json = exam2Case.getProperties();
@@ -508,19 +509,20 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
             Map<String, String> properties = new Gson().fromJson(json, new
                     TypeToken<HashMap<String, String>>(){}.getType());
             if(properties.get(Exam2CasePropertiesConstant.ANNEX_URL)!=null){
-                return properties.get(Exam2CasePropertiesConstant.ANNEX_URL);
+                return new ResponseVO<>(ServerCode.SUCCESS,properties.get(Exam2CasePropertiesConstant.ANNEX_URL));
             }
         }
+
         //数据库无下载链接时查询缓存中是否正在处理
         if(cacheUtil.getDownloadStatus(examId, paperId, caseId).equals(DownloadStatus.TASKING)){
-            log.info("正在生成下载链接...examId-paperId-caseId:"+examId+"-"+paperId+"-"+caseId);
-            return null;
+            LOG.info("正在处理生成下载链接...examId-paperId-caseId:"+examId+"-"+paperId+"-"+caseId);
+        }else{
+            //无缓存,触发生成下载附件链接
+            LOG.info("触发生成下载链接...examId-paperId-caseId:"+examId+"-"+paperId+"-"+caseId);
+            answerAnnexService.generateAnnexUrl(examId, paperId, caseId);
         }
-        //触发生成下载附件链接
-        log.info("触发生成下载链接...examId-paperId-caseId:"+examId+"-"+paperId+"-"+caseId);
-        answerAnnexService.generateAnnexUrl(examId, paperId, caseId);
 
-        return null;
+        return new ResponseVO<>(30000, cacheUtil.getDownloadProcess(examId+"-"+paperId+"-"+caseId), null);
     }