Prechádzať zdrojové kódy

考务学生分页多线程

qinchao 4 rokov pred
rodič
commit
808f826a45

+ 94 - 79
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/controller/ExamStudentController.java

@@ -60,6 +60,12 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -176,7 +182,7 @@ public class ExamStudentController extends ControllerSupport {
             @RequestParam(required = false) String infoCollector,
             @RequestParam(required = false) BooleanSelect enable,
             @RequestParam(required = false) Boolean withStarted,
-            @RequestParam(required = false, defaultValue = "false") Boolean skipRule) {
+            @RequestParam(required = false, defaultValue = "false") Boolean skipRule) throws InterruptedException {
 
         User accessUser = getAccessUser();
         PageRequest pageable = PageRequest.of(curPage, pageSize, Sort.by(Direction.DESC, "updateTime", "id"));
@@ -266,90 +272,99 @@ public class ExamStudentController extends ControllerSupport {
 
         List<ExamStudentDomain> ret = Lists.newArrayList();
 
-        for (ExamStudentEntity cur : examStudents) {
-            ExamEntity exam = GlobalHelper.getEntity(examRepo, cur.getExamId(), ExamEntity.class);
-
-            GetOrgReq getOrgReq = new GetOrgReq();
-            getOrgReq.setOrgId(cur.getOrgId());
-            GetOrgResp getOrgResp = orgCloudService.getOrg(getOrgReq);
-            OrgBean org = getOrgResp.getOrg();
-
-            GetStudentReq getStudentReq = new GetStudentReq();
-            getStudentReq.setRootOrgId(accessUser.getRootOrgId());
-            getStudentReq.setIdentityNumber(cur.getIdentityNumber());
-            GetStudentResp getStudentResp = studentCloudService.getStudent(getStudentReq);
-            StudentBean studentBean = getStudentResp.getStudentInfo();
-
-            Boolean started = null;
-            if (null != withStarted && withStarted) {
-                CheckExamIsStartedReq checkExamIsStartedReq = new CheckExamIsStartedReq();
-                checkExamIsStartedReq.setExamId(exam.getId());
-                checkExamIsStartedReq.setCourseId(cur.getCourseId());
-                checkExamIsStartedReq.setStudentId(studentBean.getId());
-                checkExamIsStartedReq.setExamId(exam.getId());
-                try {
-                    CheckExamIsStartedResp checkExamIsStartedResp = examRecordCloudService
-                            .checkExamIsStarted(checkExamIsStartedReq);
-                    started = checkExamIsStartedResp.getIsStarted();
-                } catch (Exception e) {
-                    LOGGER.error("fail to invoke remote method: checkExamIsStarted()", e);
-                }
+        ExecutorService service = new ThreadPoolExecutor(6, 10, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
+        final CountDownLatch latch = new CountDownLatch(examStudents.getContent().size());
 
-            }
+        for (ExamStudentEntity cur : examStudents) {
+            Runnable runnable = () -> {
+                ExamEntity exam = GlobalHelper.getEntity(examRepo, cur.getExamId(), ExamEntity.class);
+
+                GetOrgReq getOrgReq = new GetOrgReq();
+                getOrgReq.setOrgId(cur.getOrgId());
+                GetOrgResp getOrgResp = orgCloudService.getOrg(getOrgReq);
+                OrgBean org = getOrgResp.getOrg();
+
+                GetStudentReq getStudentReq = new GetStudentReq();
+                getStudentReq.setRootOrgId(accessUser.getRootOrgId());
+                getStudentReq.setIdentityNumber(cur.getIdentityNumber());
+                GetStudentResp getStudentResp = studentCloudService.getStudent(getStudentReq);
+                StudentBean studentBean = getStudentResp.getStudentInfo();
+
+                Boolean started = null;
+                if (null != withStarted && withStarted) {
+                    CheckExamIsStartedReq checkExamIsStartedReq = new CheckExamIsStartedReq();
+                    checkExamIsStartedReq.setExamId(exam.getId());
+                    checkExamIsStartedReq.setCourseId(cur.getCourseId());
+                    checkExamIsStartedReq.setStudentId(studentBean.getId());
+                    checkExamIsStartedReq.setExamId(exam.getId());
+                    try {
+                        CheckExamIsStartedResp checkExamIsStartedResp = examRecordCloudService
+                                .checkExamIsStarted(checkExamIsStartedReq);
+                        started = checkExamIsStartedResp.getIsStarted();
+                    } catch (Exception e) {
+                        LOGGER.error("fail to invoke remote method: checkExamIsStarted()", e);
+                    }
 
-            ExamStudentDomain bean = new ExamStudentDomain();
-            bean.setRootOrgId(cur.getRootOrgId());
-            bean.setId(cur.getId());
-            bean.setExamId(exam.getId());
-            bean.setExamName(exam.getName());
-            bean.setStudentId(cur.getStudentId());
-            bean.setStudentName(cur.getName());
-            bean.setStudentCode(cur.getStudentCode());
-            bean.setIdentityNumber(cur.getIdentityNumber());
-            bean.setCourseId(cur.getCourseId());
-            bean.setCourseCode(cur.getCourseCode());
-            bean.setCourseName(cur.getCourseName());
-            bean.setCourseLevel(cur.getCourseLevel());
-            bean.setInfoCollector(cur.getInfoCollector());
-            bean.setOrgId(cur.getOrgId());
-            bean.setOrgCode(org.getCode());
-            bean.setOrgName(org.getName());
-            bean.setPaperType(cur.getPaperType());
-            bean.setPhone(studentBean.getPhoneNumber());
-            bean.setGrade(cur.getGrade());
-            bean.setSpecialtyName(cur.getSpecialtyName());
-            bean.setExamSite(cur.getExamSite());
-            bean.setExamType(exam.getExamType().name());
-            bean.setUpdateTime(cur.getUpdateTime());
-            bean.setEnable(cur.getEnable());
-            bean.setLocked(
-                    null == exam.getExamStudentLocked() ? false : exam.getExamStudentLocked());
-            bean.setStarted(started);
-            bean.setPhotoPath(studentBean.getPhotoPath());
-
-            bean.setExt1(cur.getExt1());
-            bean.setExt2(IdentityNumberHelper.conceal(cur.getRootOrgId(), cur.getIdentityNumber()));//特殊处理:把ext2
-            // 当作隐私模式下的身份证号
-            bean.setExt3(cur.getExt3());
-            bean.setExt4(cur.getExt4());
-            bean.setExt5(cur.getExt5());
-            if (null != cur.getExamStageId()) {
-                ExamStageEntity examStageEntity = GlobalHelper.getEntity(examStageRepo, cur.getExamStageId(), ExamStageEntity.class);
-                if (null == examStageEntity) {
-                    throw new StatusException("005001", "场次id不正确");
                 }
 
-                if (examStageEntity.getEnable() == false) {
-                    throw new StatusException("005002", "场次被禁用,请重新选择场次");
+                ExamStudentDomain bean = new ExamStudentDomain();
+                bean.setRootOrgId(cur.getRootOrgId());
+                bean.setId(cur.getId());
+                bean.setExamId(exam.getId());
+                bean.setExamName(exam.getName());
+                bean.setStudentId(cur.getStudentId());
+                bean.setStudentName(cur.getName());
+                bean.setStudentCode(cur.getStudentCode());
+                bean.setIdentityNumber(cur.getIdentityNumber());
+                bean.setCourseId(cur.getCourseId());
+                bean.setCourseCode(cur.getCourseCode());
+                bean.setCourseName(cur.getCourseName());
+                bean.setCourseLevel(cur.getCourseLevel());
+                bean.setInfoCollector(cur.getInfoCollector());
+                bean.setOrgId(cur.getOrgId());
+                bean.setOrgCode(org.getCode());
+                bean.setOrgName(org.getName());
+                bean.setPaperType(cur.getPaperType());
+                bean.setPhone(studentBean.getPhoneNumber());
+                bean.setGrade(cur.getGrade());
+                bean.setSpecialtyName(cur.getSpecialtyName());
+                bean.setExamSite(cur.getExamSite());
+                bean.setExamType(exam.getExamType().name());
+                bean.setUpdateTime(cur.getUpdateTime());
+                bean.setEnable(cur.getEnable());
+                bean.setLocked(
+                        null == exam.getExamStudentLocked() ? false : exam.getExamStudentLocked());
+                bean.setStarted(started);
+                bean.setPhotoPath(studentBean.getPhotoPath());
+
+                bean.setExt1(cur.getExt1());
+                bean.setExt2(IdentityNumberHelper.conceal(cur.getRootOrgId(), cur.getIdentityNumber()));//特殊处理:把ext2
+                // 当作隐私模式下的身份证号
+                bean.setExt3(cur.getExt3());
+                bean.setExt4(cur.getExt4());
+                bean.setExt5(cur.getExt5());
+                if (null != cur.getExamStageId()) {
+                    ExamStageEntity examStageEntity = GlobalHelper.getEntity(examStageRepo, cur.getExamStageId(), ExamStageEntity.class);
+                    if (null == examStageEntity) {
+                        throw new StatusException("005001", "场次id不正确");
+                    }
+
+                    if (examStageEntity.getEnable() == false) {
+                        throw new StatusException("005002", "场次被禁用,请重新选择场次");
+                    }
+                    bean.setExamStageOrder(examStageEntity.getStageOrder());
+                    bean.setStartTime(examStageEntity.getStartTime());
+                    bean.setEndTime(examStageEntity.getEndTime());
                 }
-                bean.setExamStageOrder(examStageEntity.getStageOrder());
-                bean.setStartTime(examStageEntity.getStartTime());
-                bean.setEndTime(examStageEntity.getEndTime());
-            }
-            bean.setExamStageId(cur.getExamStageId());
-            ret.add(bean);
+                bean.setExamStageId(cur.getExamStageId());
+                ret.add(bean);
+                latch.countDown();
+            };
+            service.execute(runnable);
+
         }
-        return new PageInfo<ExamStudentDomain>(examStudents, ret);
+        latch.await();
+        return new PageInfo<>(examStudents, ret);
     }
 
     /**