|
@@ -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的科目
|