wangliang 4 лет назад
Родитель
Сommit
a10733ee88

+ 54 - 2
themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateController.java

@@ -122,13 +122,17 @@ public class TIeInvigilateController {
         IPage<InvigilateListVideoBean> invigilateListVideoBeanIPage = tOeExamRecordService.invigilatePageListVideo(new Page<>(pageNumber, pageSize), examId, examActivityId, roomCode, paperDownload, status, name, identity, minWarningCount, maxWarningCount, clientWebsocketStatus, userId, tbUser.getOrgId());
         if (Objects.nonNull(invigilateListVideoBeanIPage)) {
             List<InvigilateListVideoBean> invigilateListVideoBeanList = invigilateListVideoBeanIPage.getRecords();
-            ExamCacheBean examCacheBean = teExamService.getExamCacheBean(examId);
+            ExamCacheBean examCacheBean = null;
+            if (Objects.nonNull(examId)) {
+                examCacheBean = teExamService.getExamCacheBean(examId);
+            }
             List<String> monitorVideoSourceList = null;
-            if (Objects.nonNull(examCacheBean.getMonitorVideoSource()) && !Objects.equals(examCacheBean.getMonitorVideoSource().toString().trim().replaceAll(" ", ""), "")) {
+            if (Objects.nonNull(examCacheBean) && Objects.nonNull(examCacheBean.getMonitorVideoSource()) && !Objects.equals(examCacheBean.getMonitorVideoSource().toString().trim().replaceAll(" ", ""), "")) {
                 monitorVideoSourceList = Arrays.asList(examCacheBean.getMonitorVideoSource().trim().toUpperCase().replaceAll(" ", "").split(","));
             }
             if (Objects.nonNull(invigilateListVideoBeanList) && invigilateListVideoBeanList.size() > 0) {
                 List<String> finalMonitorVideoSourceList = monitorVideoSourceList;
+                ExamCacheBean finalExamCacheBean = examCacheBean;
                 invigilateListVideoBeanList.forEach(s -> {
                     if (Objects.nonNull(finalMonitorVideoSourceList) && finalMonitorVideoSourceList.size() > 0) {
                         finalMonitorVideoSourceList.forEach(l -> {
@@ -165,6 +169,10 @@ public class TIeInvigilateController {
                     if (Objects.nonNull(paperDownLoad)) {
                         s.setPaperDownload(paperDownLoad);
                     }
+                    //剩余时间计算
+                    if (Objects.nonNull(finalExamCacheBean)) {
+                        s.setRemainTime(this.getRemainTime(finalExamCacheBean.getMode(), s.getExamRecordId()));
+                    }
                 });
             }
         }
@@ -187,6 +195,11 @@ public class TIeInvigilateController {
         }
         List<InvigilateListVideoBean> invigilateListVideoBeanList = tOeExamRecordService.invigilatePageListVideoRandom(examId, userId, randomNum, tbUser.getOrgId());
         if (Objects.nonNull(invigilateListVideoBeanList) && invigilateListVideoBeanList.size() > 0) {
+            ExamCacheBean examCacheBean = null;
+            if (Objects.nonNull(examId)) {
+                examCacheBean = teExamService.getExamCacheBean(examId);
+            }
+            ExamCacheBean finalExamCacheBean = examCacheBean;
             invigilateListVideoBeanList.forEach(s -> {
                 String monitorLiveUrl = ExamRecordCacheUtil.getMonitorLiveUrl(s.getExamRecordId(), MonitorVideoSourceEnum.CLIENT_CAMERA);
                 if (Objects.nonNull(monitorLiveUrl)) {
@@ -200,6 +213,10 @@ public class TIeInvigilateController {
                 if (Objects.nonNull(paperDownLoad)) {
                     s.setPaperDownload(paperDownLoad);
                 }
+                //剩余时间计算
+                if (Objects.nonNull(finalExamCacheBean)) {
+                    s.setRemainTime(this.getRemainTime(finalExamCacheBean.getMode(), s.getExamRecordId()));
+                }
             });
         }
         return ResultUtil.ok(invigilateListVideoBeanList);
@@ -382,11 +399,20 @@ public class TIeInvigilateController {
         if (Objects.nonNull(invigilateListPatrolBeanIPage)) {
             List<InvigilateListPatrolBean> invigilateListPatrolBeanList = invigilateListPatrolBeanIPage.getRecords();
             if (Objects.nonNull(invigilateListPatrolBeanList) && invigilateListPatrolBeanList.size() > 0) {
+                ExamCacheBean examCacheBean = null;
+                if (Objects.nonNull(examId)) {
+                    examCacheBean = teExamService.getExamCacheBean(examId);
+                }
+                ExamCacheBean finalExamCacheBean = examCacheBean;
                 invigilateListPatrolBeanList.forEach(s -> {
                     WebsocketStatusEnum websocketStatusEnum = ExamRecordCacheUtil.getClientWebsocketStatus(s.getExamRecordId());
                     if (Objects.nonNull(websocketStatusEnum)) {
                         s.setClientWebsocketStatus(websocketStatusEnum);
                     }
+                    //剩余时间计算
+                    if (Objects.nonNull(finalExamCacheBean)) {
+                        s.setRemainTime(this.getRemainTime(finalExamCacheBean.getMode(), s.getExamRecordId()));
+                    }
                 });
             }
         }
@@ -652,4 +678,30 @@ public class TIeInvigilateController {
         examPropCountDto.setExamCount(examCount.get());
         return ResultUtil.ok(examPropCountDto);
     }
+
+    /**
+     * 获取剩余时间
+     *
+     * @param mode
+     * @param recordId
+     * @return
+     */
+    private String getRemainTime(ExamModeEnum mode, Long recordId) {
+        String remainTime = null;
+        Integer forceFinish = ExamRecordCacheUtil.getForceFinish(recordId);
+        Integer maxDurationSeconds = Objects.isNull(ExamRecordCacheUtil.getMaxDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getMaxDurationSeconds(recordId);
+        Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
+        Long endTime = Objects.isNull(ExamRecordCacheUtil.getEndTime(recordId)) ? 0 : ExamRecordCacheUtil.getEndTime(recordId);
+        if (Objects.nonNull(mode) && Objects.equals(mode, ExamModeEnum.ANYTIME)) {
+            Long diffTime = (maxDurationSeconds.longValue() - durationSeconds.longValue()) * 1000;
+            remainTime = diffTime.intValue() == 0 ? "00:00:00" : SystemConstant.getRemainTime(diffTime);
+        } else if (Objects.nonNull(mode) && Objects.equals(mode, ExamModeEnum.TOGETHER) && Objects.nonNull(forceFinish) && forceFinish.intValue() == 1) {
+            Long diffTime = endTime - System.currentTimeMillis();
+            remainTime = diffTime.intValue() == 0 ? "00:00:00" : SystemConstant.getRemainTime(diffTime);
+        } else {
+            Long diffTime = (maxDurationSeconds.longValue() - durationSeconds.longValue()) * 1000;
+            remainTime = diffTime.intValue() == 0 ? "00:00:00" : SystemConstant.getRemainTime(diffTime);
+        }
+        return remainTime;
+    }
 }

+ 2 - 0
themis-backend/src/main/java/com/qmth/themis/backend/start/StartRunning.java

@@ -80,6 +80,8 @@ public class StartRunning implements CommandLineRunner {
 
         //考试断点
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK_DELAY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakDelayConcurrentlyImpl.class));
+
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
     }

+ 21 - 3
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -126,13 +126,13 @@ public class SystemConstant {
 
     //重新算分锁
     public static final String REDIS_LOCK_CALCULATE_SCORE_PREFIX = "lock:calculate_score:exam_id_";
-    
+
     //试卷导入锁
     public static final String REDIS_LOCK_PAPER_IMPORT_PREFIX = "lock:paper_import:exam_id_";
-    
+
     //重新算分和试卷导入互斥锁
     public static final String REDIS_LOCK_CALCULATE_SCORE_PAPER_IMPORT_PREFIX = "lock:calculate_score_paper_import:exam_id_";
-    
+
     //交卷锁
     public static final String REDIS_LOCK_FINISH_EXXAM_PREFIX = "lock:finish_exxam:record_id_";
     /**
@@ -286,4 +286,22 @@ public class SystemConstant {
         FILES_DIR = dir.getPath();
         TEMP_FILES_DIR = tempdir.getPath();
     }
+
+    /**
+     * 获取剩余时间
+     *
+     * @param diff
+     * @return
+     */
+    public static String getRemainTime(Long diff) {
+        long day = 0;
+        long hour = 0;
+        long min = 0;
+        long sec = 0;
+        day = diff / (24 * 60 * 60 * 1000);
+        hour = (diff / (60 * 60 * 1000) - day * 24);
+        min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
+        sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
+        return String.format("%02d", hour) + ":" + String.format("%02d", min) + ":" + String.format("%02d", sec);
+    }
 }

+ 3 - 1
themis-business/src/main/java/com/qmth/themis/business/enums/MqExecTypeEnum.java

@@ -37,7 +37,9 @@ public enum MqExecTypeEnum {
 
     EXEC_MQ_CALCULATE_OBJECTIVE_SCORE_LOGIC("计算客观分逻辑", "execMqCalculateObjectiveScoreLogic"),
 
-    EXEC_MQ_WEBSOCKET_UN_NORMAL_LOGIC("websocket非正常退出,延时消息逻辑", "execMqWebsocketUnNormalLogic");
+    EXEC_MQ_WEBSOCKET_UN_NORMAL_LOGIC("websocket非正常退出,延时消息逻辑", "execMqWebsocketUnNormalLogic"),
+
+    EXEC_MQ_EXAM_BREAK_DELAY_LOGIC("考试断点,延时消息逻辑", "execMqExamBreakDelayLogic");
 
     private String code;
     private String desc;

+ 6 - 1
themis-business/src/main/java/com/qmth/themis/business/enums/MqGroupEnum.java

@@ -90,7 +90,12 @@ public enum MqGroupEnum {
     /**
      * 考试断点
      */
-    EXAM_BREAK_GROUP("themis-group-exam-examBreak");
+    EXAM_BREAK_GROUP("themis-group-exam-examBreak"),
+
+    /**
+     * 考试断点延时消息
+     */
+    EXAM_BREAK_DELAY_GROUP("themis-group-exam-examBreakDelay");
 
     private MqGroupEnum(String code) {
         this.code = code;

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/enums/MqTagEnum.java

@@ -47,7 +47,8 @@ public enum MqTagEnum {
     EXAM_STUDENT("考生一次性延时任务标签", "考生一次性延时任务", "normal", 35),
     EXAM_STUDENT_EXPORT("考生导出任务标签", "考生导出任务", "normal", 36),
     MARK_RESULT_SIMPLE_EXPORT("成绩查询简版导出任务标签", "成绩查询简版导出任务", "normal", 37),
-    MARK_RESULT_STANDARD_EXPORT("成绩查询标准版导出任务标签", "成绩查询标准版导出任务", "normal", 38);
+    MARK_RESULT_STANDARD_EXPORT("成绩查询标准版导出任务标签", "成绩查询标准版导出任务", "normal", 38),
+    EXAM_BREAK_DELAY("断点时间标签", "断点时间", "delay", 39);
 
     private MqTagEnum(String desc, String code, String type, int id) {
         this.desc = desc;

+ 39 - 0
themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java

@@ -976,6 +976,45 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
                 MqDtoService mqDtoService = SpringContextHolder.getBean(MqDtoService.class);
                 mqDtoService.assembleSendOneWayMsg(mqDtoBreak);
                 //考试断点异常原因 发送mq end
+
+                Long examId = ExamRecordCacheUtil.getExamId(recordId);
+                ExamCacheBean ec = examService.getExamCacheBean(examId);//考试缓存
+                Integer breakExpireSeconds = Objects.isNull(ec.getBreakExpireSeconds()) ? 0 : ec.getBreakExpireSeconds();
+                if (breakExpireSeconds > 0) {
+                    List<String> list = SystemConstant.mqDelayLevelList.subList(5, 15);
+                    String level = null;
+                    if (breakExpireSeconds <= 60) {
+                        level = "1m";
+                    } else {
+                        Integer time = breakExpireSeconds.intValue() / 60;
+                        if (time >= 30) {
+                            level = "30m";
+                        } else {
+                            for (String s : list) {
+                                Integer value = Integer.parseInt(s.substring(0, s.length() - 1));
+                                if (time.intValue() <= value.intValue()) {
+                                    level = value + "m";
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    Map<String, Object> tranMap = new HashMap<>();
+                    Integer time = SystemConstant.mqDelayLevel.get(level);
+                    LocalDateTime dt = LocalDateTime.now();
+                    if (level.contains("m")) {
+                        dt = dt.plusMinutes(Long.parseLong(level.replace("m", "")));
+                    } else {
+                        dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
+                    }
+                    tranMap.put("recordId", recordId);
+                    tranMap.put("timeOut", time);
+                    tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
+                    //考试断点延时消息 发送mq start
+                    MqDto mqDtoBreakDelay = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK_DELAY.name(), MqTagEnum.EXAM_BREAK_DELAY, MqTagEnum.EXAM_BREAK_DELAY, String.valueOf(recordId), tranMap, String.valueOf(recordId));
+                    mqDtoService.assembleSendAsyncDelayMsg(mqDtoBreakDelay);
+                    //考试断点延时消息 发送mq end
+                }
                 //更新场次-考试记录缓存
                 ExamActivityRecordCacheUtil.setExamRecordStatus(examActivityId, recordId, new ExamActivityRecordCacheBean(ExamRecordCacheUtil.getExamStudentId(recordId), ExamRecordCacheUtil.getStatus(recordId)));
             } catch (Exception e) {

+ 8 - 8
themis-business/src/main/resources/mapper/TOeExamRecordMapper.xml

@@ -218,11 +218,11 @@
 		<include refid="invigilatePageHead"/>
 		,(select count(1) from t_ie_invigilate_warn_info tiiwi where tiiwi.exam_record_id = t.id and
 		tiiwi.approve_status = 0) as warningNew
-		,case
+		<!--,case
 		when tee.mode = 'ANYTIME' then SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
 		when tee.mode = 'TOGETHER' and tee.force_finish = 1 then SEC_TO_TIME((IFNULL(teea.finish_time, tee.end_time) - unix_timestamp(current_timestamp()) * 1000) / 1000)
 		else SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
-		end as remainTime
+		end as remainTime-->
 		<include refid="invigilatePageMiddle"/>
 		<include refid="invigilatePageFoot"/>
 		<if test="paperDownload != null and paperDownload != '' or paperDownload == 0">
@@ -245,11 +245,11 @@
 		<include refid="invigilatePageHead" />
 		,t.monitor_live_url as monitorLiveUrl
 		,(select count(1) from t_ie_invigilate_warn_info tiiwi where tiiwi.exam_record_id = t.id and tiiwi.approve_status = 0) as warningNew
-		,case
+		<!--,case
 		when tee.mode = 'ANYTIME' then SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
 		when tee.mode = 'TOGETHER' and tee.force_finish = 1 then SEC_TO_TIME((IFNULL(teea.finish_time, tee.end_time) - unix_timestamp(current_timestamp()) * 1000) / 1000)
 		else SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
-		end as remainTime
+		end as remainTime-->
 		<include refid="invigilatePageMiddle" />
 		<include refid="invigilatePageFoot" />
 		<if test="paperDownload != null and paperDownload != '' or paperDownload == 0">
@@ -267,11 +267,11 @@
 		<include refid="invigilatePageHead" />
 		,t.monitor_live_url as monitorLiveUrl
 		,(select count(1) from t_ie_invigilate_warn_info tiiwi where tiiwi.exam_record_id = t.id and tiiwi.approve_status = 0) as warningNew
-		,case
+		<!--,case
 		when tee.mode = 'ANYTIME' then SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
 		when tee.mode = 'TOGETHER' and tee.force_finish = 1 then SEC_TO_TIME((IFNULL(teea.finish_time, tee.end_time) - unix_timestamp(current_timestamp()) * 1000) / 1000)
 		else SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
-		end as remainTime
+		end as remainTime-->
 		<include refid="invigilatePageMiddle" />
 		<where> 1 = 1
 			<if test="examId != null and examId != ''">
@@ -290,11 +290,11 @@
 		,(select count(1) from t_ie_invigilate_exception_info tiiei where tiiei.exam_record_id = t.id) as exceptionCount
 		,(select count(1) from t_ie_invigilate_warn_info tiiwi where tiiwi.exam_record_id = t.id and tiiwi.`type` =
 		'FACE_COUNT_ERROR' and tiiwi.`level` = 'D8') as multipleFaceCount
-		,case
+		<!--,case
 		when tee.mode = 'ANYTIME' then SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
 		when tee.mode = 'TOGETHER' and tee.force_finish = 1 then SEC_TO_TIME((IFNULL(teea.finish_time, tee.end_time) - unix_timestamp(current_timestamp()) * 1000) / 1000)
 		else SEC_TO_TIME(IFNULL(teea.max_duration_seconds, tee.max_duration_seconds) - t.duration_seconds)
-		end as remainTime
+		end as remainTime-->
 		<include refid="invigilatePageMiddle" />
 		<include refid="invigilatePageFoot" />
 		<if test="status == null or status == ''">

+ 1 - 0
themis-exam/src/main/java/com/qmth/themis/exam/start/StartRunning.java

@@ -85,6 +85,7 @@ public class StartRunning implements CommandLineRunner {
 
         //考试断点
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK_DELAY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakDelayConcurrentlyImpl.class));
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
     }

+ 8 - 0
themis-mq/src/main/java/com/qmth/themis/mq/service/MqLogicService.java

@@ -134,6 +134,14 @@ public interface MqLogicService {
      */
     void execMqExamBreakLogic(MqDto mqDto, String key);
 
+    /**
+     * 考试断点延时消息
+     *
+     * @param mqDto
+     * @param key
+     */
+    void execMqExamBreakDelayLogic(MqDto mqDto, String key);
+
     /**
      * 普通消息
      *

+ 26 - 0
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -789,6 +789,32 @@ public class MqLogicServiceImpl implements MqLogicService {
         redisUtil.delete(key, mqDto.getId());
     }
 
+    /**
+     * 考试断点延时消息
+     *
+     * @param mqDto
+     * @param key
+     */
+    @Override
+    @Transactional
+    public void execMqExamBreakDelayLogic(MqDto mqDto, String key) {
+        Gson gson = new Gson();
+        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);//表示成功处理
+        Map<String, Object> tranMap = mqDto.getProperties();
+        Long recordId = Long.parseLong(String.valueOf(tranMap.get("recordId")));
+        ExamRecordStatusEnum statusEnum = ExamRecordCacheUtil.getStatus(recordId);
+        if (Objects.nonNull(statusEnum) && !Objects.equals(statusEnum, ExamRecordStatusEnum.FINISHED) && !Objects.equals(statusEnum, ExamRecordStatusEnum.PERSISTED) && !Objects.equals(statusEnum, ExamRecordStatusEnum.ANSWERING)) {
+            Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+            Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
+            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+            teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+        }
+        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
+        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
+        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
+        redisUtil.delete(key, mqDto.getId());
+    }
+
     /**
      * 普通消息
      *

+ 29 - 0
themis-mq/src/main/java/com/qmth/themis/mq/templete/impl/ExamBreakDelayConcurrentlyImpl.java

@@ -0,0 +1,29 @@
+package com.qmth.themis.mq.templete.impl;
+
+import com.qmth.themis.business.constant.SpringContextHolder;
+import com.qmth.themis.business.enums.MqExecTypeEnum;
+import com.qmth.themis.mq.service.MqLogicService;
+import com.qmth.themis.mq.templete.Concurrently;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
+import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
+import org.apache.rocketmq.common.message.MessageExt;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Description: mq 延时消息监听 考试断点延时消息 并行消费监听
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/7/28
+ */
+@Service
+public class ExamBreakDelayConcurrentlyImpl implements Concurrently {
+
+    @Override
+    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
+        MqLogicService mqLogicService = SpringContextHolder.getBean(MqLogicService.class);
+        return mqLogicService.consumeMessageDelay(msgs, consumeConcurrentlyContext, MqExecTypeEnum.EXEC_MQ_EXAM_BREAK_DELAY_LOGIC);
+    }
+}

+ 1 - 0
themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java

@@ -113,6 +113,7 @@ public class StartRunning implements CommandLineRunner {
 
         //考试断点
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK_DELAY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakDelayConcurrentlyImpl.class));
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
     }