소스 검색

优化处理未比对的抓拍照片队列

deason 2 년 전
부모
커밋
f6d174d31d

+ 30 - 4
examcloud-core-oe-task-service/src/main/java/cn/com/qmth/examcloud/core/oe/task/service/impl/ExamRecordDataServiceImpl.java

@@ -9,6 +9,7 @@ import cn.com.qmth.examcloud.core.oe.student.api.response.CalcFaceBiopsyResultRe
 import cn.com.qmth.examcloud.core.oe.student.dao.ExamCaptureQueueRepo;
 import cn.com.qmth.examcloud.core.oe.student.dao.ExamRecordDataRepo;
 import cn.com.qmth.examcloud.core.oe.student.dao.entity.ExamRecordDataEntity;
+import cn.com.qmth.examcloud.core.oe.task.service.ExamCaptureQueueService;
 import cn.com.qmth.examcloud.core.oe.task.service.ExamCaptureService;
 import cn.com.qmth.examcloud.core.oe.task.service.ExamRecordDataService;
 import cn.com.qmth.examcloud.core.oe.task.service.bean.CalculateFaceCheckResultInfo;
@@ -19,6 +20,8 @@ import cn.com.qmth.examcloud.support.enums.IsSuccess;
 import cn.com.qmth.examcloud.support.examing.ExamRecordData;
 import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
 import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
+import cn.com.qmth.examcloud.web.exception.SequenceLockException;
+import cn.com.qmth.examcloud.web.helpers.SequenceLockHelper;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
@@ -52,6 +55,9 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
     @Autowired
     private ExamCaptureQueueRepo examCaptureQueueRepo;
 
+    @Autowired
+    private ExamCaptureQueueService examCaptureQueueService;
+
     @Autowired
     private ExamRecordDataRepo examRecordDataRepo;
 
@@ -118,9 +124,29 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
     public ExamRecordData processAfterHandInExam(ExamRecordData examRecordData) {
         //只有开启的人脸的才会进行如下处理
         if (FaceBiopsyHelper.isFaceEnable(examRecordData.getRootOrgId(), examRecordData.getExamId(), examRecordData.getStudentId())) {
-            // 判断是否存在未处理的图片
-            if (examCaptureQueueRepo.existsUnhandledByExamRecordDataId(examRecordData.getId()) != null) {
-                throw new StatusException(Constants.CAPTURE_PROCESSING_STATUS_CODE, "抓拍照片比对尚未处理完!");
+
+            // 判断是否存在未处理的抓拍照片比对
+            int queueSize = examCaptureQueueRepo.countByExamRecordDataId(examRecordData.getId());
+            if (queueSize > 0) {
+                final String lockKey = Constants.FACE_COMPARE_LOCK_PREFIX + examRecordData.getId();
+                try {
+                    SequenceLockHelper.getLockSimple(lockKey);
+
+                    // 处理剩余未比对的抓拍照片
+                    examCaptureQueueService.handlerExamCaptureQueuesByExamRecordDataId(examRecordData.getId());
+                } catch (Exception e) {
+                    if (e instanceof SequenceLockException) {
+                        // 若锁问题,下次会继续执行
+                        log.warn("当前抓拍照比对任务获取锁失败!examRecordDataId:{}, redisKey:{}", examRecordData.getId(), lockKey);
+                    } else {
+                        // 若异常,下次会继续执行(需要排查原因)
+                        log.error("当前抓拍照比对任务处理失败!examRecordDataId:{}, error:{}", examRecordData.getId(), e.getMessage(), e);
+                    }
+
+                    throw new StatusException(Constants.CAPTURE_PROCESSING_STATUS_CODE, "抓拍照片比对尚未处理完!");
+                } finally {
+                    SequenceLockHelper.releaseLockSimple(lockKey);
+                }
             }
 
             // 计算人脸检测结果
@@ -157,7 +183,7 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
                     IsSuccess.FAILED == calcFaceBiopsyResultResp.getFaceVerifyResult()) {
                 examRecordData.setIsIllegality(true);//活检失败,直接判定为违纪
             } else {
-                //人脸检测或活中有一个判断为违纪,则为违纪
+                //人脸检测或活中有一个判断为违纪,则为违纪
                 boolean bi = (null != faceCheckResult.getIsIllegality() && faceCheckResult.getIsIllegality()) ||
                         (null != calcFaceBiopsyResultResp.getIsIllegality() && calcFaceBiopsyResultResp.getIsIllegality());
                 examRecordData.setIsIllegality(bi);

+ 5 - 5
examcloud-core-oe-task-service/src/main/java/cn/com/qmth/examcloud/core/oe/task/service/job/FaceVerifyJobHandler.java

@@ -28,7 +28,7 @@ public class FaceVerifyJobHandler {
     private ExamCaptureQueueService examCaptureQueueService;
 
     public void run(int shardTotal, int shardIndex, String jobParam) throws Exception {
-        int batchSize = 100, maxErrorNum = 100;
+        int batchSize = 100, maxErrorNum = 10;
         List<Long> todoExamRecordDataIds = examCaptureQueueRepo.findQueuesGroupByExamRecordDataId(shardTotal, shardIndex, batchSize, maxErrorNum);
 
         log.warn("shardTotal:{}, shardIndex:{}, todoExamRecordDataIdsSize:{}", shardTotal, shardIndex, todoExamRecordDataIds.size());
@@ -41,19 +41,19 @@ public class FaceVerifyJobHandler {
             try {
                 SequenceLockHelper.getLockSimple(lockKey);
 
-                // 处理业务
+                // 处理未比对的抓拍照片
                 examCaptureQueueService.handlerExamCaptureQueuesByExamRecordDataId(examRecordDataId);
             } catch (Exception e) {
                 if (e instanceof InterruptedException) {
                     // 若线程终止,则抛出交由任务调度中心处理
-                    log.warn("当前任务线程被终止!examRecordDataId:{}, error:{}", examRecordDataId, e.getMessage());
+                    log.warn("当前抓拍照比对任务线程被终止!examRecordDataId:{}, error:{}", examRecordDataId, e.getMessage());
                     throw e;
                 } else if (e instanceof SequenceLockException) {
                     // 若锁问题,下次会继续执行
-                    log.warn("当前考试记录数据获取锁失败!examRecordDataId:{}, redisKey:{}", examRecordDataId, lockKey);
+                    log.warn("当前抓拍照比对任务获取锁失败!examRecordDataId:{}, redisKey:{}", examRecordDataId, lockKey);
                 } else {
                     // 若异常,下次会继续执行(需要排查原因)
-                    log.error("当前考试记录数据处理失败!examRecordDataId:{}, error:{}", examRecordDataId, e.getMessage(), e);
+                    log.error("当前抓拍照比对任务处理失败!examRecordDataId:{}, error:{}", examRecordDataId, e.getMessage(), e);
                 }
             } finally {
                 SequenceLockHelper.releaseLockSimple(lockKey);