|
@@ -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;
|