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

公共交卷方法添加分布式锁

lideyin 5 роки тому
батько
коміт
f0ddefdf7a

+ 7 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamControlServiceImpl.java

@@ -40,6 +40,7 @@ import cn.com.qmth.examcloud.support.cache.bean.ExtractConfigPaperCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
 import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
 import cn.com.qmth.examcloud.web.helpers.GlobalHelper;
+import cn.com.qmth.examcloud.web.helpers.SequenceLockHelper;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
 import com.google.common.base.Splitter;
 import main.java.com.upyun.Base64Coder;
@@ -63,6 +64,7 @@ import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.LockSupport;
 import java.util.stream.Collectors;
 
 /**
@@ -678,6 +680,11 @@ public class ExamControlServiceImpl implements ExamControlService {
     @Override
     @Transactional
     public void handInExam(ExamRecordDataEntity examRecordData, HandInExamType handInExamType) {
+        //此锁是为了避免自动交卷服务与断点续考交卷或活检失败交卷,同一时刻交卷争抢资源导致死锁
+        String sequenceLockKey = Constants.HAND_IN_EXAM_LOCK_PREFIX + examRecordData.getId();
+        //系统在请求结束后会,自动释放锁,无需手动解锁
+        SequenceLockHelper.getLock(sequenceLockKey);
+
         //如果当前考试记录状态不为考试中,则直接返回
         if (examRecordData.getExamRecordStatus() != ExamRecordStatus.EXAM_ING) {
             return;