xiatian 4 роки тому
батько
коміт
34a1f7d745

+ 1 - 1
themis-backend/src/main/java/com/qmth/themis/backend/aspect/ApiControllerAspect.java

@@ -65,7 +65,7 @@ public class ApiControllerAspect {
             log.info("============耗时============:{}秒", (end - start) / 1000);
             return proceed;
         } catch (Exception e) {
-            e.printStackTrace();
+        	log.error("请求出错",e);
             return ResultUtil.error(e.getMessage());
         }
     }

+ 3 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -120,6 +120,9 @@ public class SystemConstant {
 
     //考试记录数据持久化锁
     public static final String REDIS_LOCK_EXAM_RECORD_PERSISTED_PREFIX = "lock:exam_record_persisted:record_id_";
+    
+    //重新算分锁
+    public static final String REDIS_LOCK_CALCULATE_SCORE_PREFIX = "lock:calculate_score:exam_id_";
     /**
      * redis过期时间
      */

+ 16 - 6
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -960,11 +960,18 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
      */
     @Override
     public void calculateScore(Long examId,Long taskId) {
-    	TBTaskHistory task=tbTaskHistoryService.getById(taskId);
-    	task.setStatus(TaskStatusEnum.RUNNING);
-    	tbTaskHistoryService.saveOrUpdate(task);
-    	Long recordId=null;
-    	try {
+    	int timeOutSecond=60*5;
+    	String lockKey = SystemConstant.REDIS_LOCK_CALCULATE_SCORE_PREFIX + examId;
+        Boolean lock = redisUtil.lock(lockKey, timeOutSecond);
+        if (!lock) {
+            return;
+        }
+        TBTaskHistory task=null;
+        Long recordId=null;
+        try {
+	    	task=tbTaskHistoryService.getById(taskId);
+	    	task.setStatus(TaskStatusEnum.RUNNING);
+	    	tbTaskHistoryService.saveOrUpdate(task);
     		Long startId=0L;
     		Long index=0L;
     		Long total=toeExamRecordService.getCountByExamId(examId);
@@ -981,6 +988,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 	    					recordId=rc.getId();
 	    					toeExamRecordService.calculateScore(rc.getId());
 	    				}
+	    				redisUtil.expire(lockKey, timeOutSecond);
 	    			}
 	    			task.setProgress(getPercentage(index, total));
 	    			tbTaskHistoryService.saveOrUpdate(task);
@@ -995,7 +1003,9 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
 			task.setSummary("处理出错");
 			task.setStatus(TaskStatusEnum.FINISH);
 			task.setFinishTime(new Date());
-		}
+		} finally {
+            redisUtil.releaseLock(lockKey);
+        }
     	tbTaskHistoryService.saveOrUpdate(task);
     }
     

+ 5 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java

@@ -208,6 +208,10 @@ public class TEStudentController {
                 durationSeconds = Integer.parseInt(String.valueOf(objectMap.get("durationSeconds")));
             }
             ExamCacheBean ec = teExamService.getExamCacheBean(examIdMap);//考试缓存
+            Integer breakExpireSeconds=ec.getBreakExpireSeconds();
+            if(breakExpireSeconds==null) {
+            	breakExpireSeconds=0;
+            }
             ExamActivityCacheBean examActivityCacheBean = teExamActivityService.getExamActivityCacheBean(examActivityId);//考试场次缓存
             ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
 
@@ -217,7 +221,7 @@ public class TEStudentController {
             Integer leftBreakResumeCount = Objects.isNull(ExamRecordCacheUtil.getLeftBreakResumeCount(recordId)) ? 0 : ExamRecordCacheUtil.getLeftBreakResumeCount(recordId);
             //如果断点时间大于整体断点时间,则强制交卷
             if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING) || Objects.equals(status, ExamRecordStatusEnum.BREAK_OFF) || Objects.equals(status, ExamRecordStatusEnum.RESUME_PREPARE)) {
-                if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 > ec.getBreakExpireSeconds()) {
+                if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 > breakExpireSeconds) {
                     teExamService.finish(teStudentCacheDto.getId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
                     List<TEExamDto> list = teExamService.getWaitingExam(teStudent.getId(), examId, orgId);
                     if (Objects.nonNull(list) && list.size() > 0) {