ting.yin 6 years ago
parent
commit
1412ae0aa5

+ 25 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java

@@ -9,6 +9,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
@@ -17,17 +18,19 @@ import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.impl.MemoryLockProvider;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.thread.MarkQualityThread;
 import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
 import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
+import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
+import cn.com.qmth.stmms.common.utils.Callback;
 
 /**
  * 与评卷相关的所有定时任务
@@ -63,6 +66,12 @@ public class MarkCronService {
     
     @Autowired
     private MarkerService markerService;
+    
+    @Autowired
+    private AsyncTaskExecutor taskExecutor;
+    
+    @Autowired
+    private LockService mlockService;
 
     @Value("${mark.cleanTimeoutMinute}")
     private long timeoutMinute;
@@ -137,12 +146,25 @@ public class MarkCronService {
         	List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subject.getCode(), MarkStatus.FORMAL);
         	for (MarkGroup markGroup : groups) {
         		if(!MarkStatus.FINISH.equals(markGroup.getStatus())){
-        			List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber());
-        			new MarkQualityThread(markers, null);
+        			final String lockKey = getLockKey(examId, subject.getCode(), markGroup.getNumber());
+                    if (mlockService.trylock(LockType.GROUP, lockKey)) {
+                        taskExecutor.submit(new MarkQualityThread(
+                                markerService.findByExamAndSubjectAndGroup(examId, subject.getCode(), markGroup.getNumber()), new Callback() {
+
+                                    @Override
+                                    public void invoke() {
+                                    	mlockService.unlock(LockType.GROUP, lockKey);
+                                    }
+                                }));
+                    }
         		}
 			}
         }
 	}
+    
+    private String getLockKey(Integer examId, String subjectCode, Integer groupNumber) {
+        return examId + "_" + subjectCode + "_" + groupNumber;
+    }
 
 	private void buildLibraryByExam(Integer examId, Map<String, Campus> campusMap) {
         // 获取主观题总分大于0的科目