Explorar el Código

监考端接口

wangliang hace 4 años
padre
commit
ef235ef5c2
Se han modificado 18 ficheros con 68 adiciones y 222 borrados
  1. 1 1
      themis-backend/src/main/java/com/qmth/themis/backend/api/SysController.java
  2. 0 4
      themis-backend/src/main/java/com/qmth/themis/backend/start/StartRunning.java
  3. 2 1
      themis-business/src/main/java/com/qmth/themis/business/dao/TBExamInvigilateUserMapper.java
  4. 13 48
      themis-business/src/main/java/com/qmth/themis/business/entity/TEExamStudentLog.java
  5. 1 6
      themis-business/src/main/java/com/qmth/themis/business/enums/MqGroupEnum.java
  6. 3 4
      themis-business/src/main/java/com/qmth/themis/business/enums/MqTagEnum.java
  7. 1 3
      themis-business/src/main/java/com/qmth/themis/business/enums/SystemOperationEnum.java
  8. 2 1
      themis-business/src/main/java/com/qmth/themis/business/service/TBExamInvigilateUserService.java
  9. 3 2
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TBExamInvigilateUserServiceImpl.java
  10. 1 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamStudentLogServiceImpl.java
  11. 5 0
      themis-business/src/main/resources/mapper/TBExamInvigilateUserMapper.xml
  12. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/listener/service/impl/MqOeLogicServiceImpl.java
  13. 0 3
      themis-exam/src/main/java/com/qmth/themis/exam/start/StartRunning.java
  14. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketOeServer.java
  15. 0 8
      themis-mq/src/main/java/com/qmth/themis/mq/service/MqLogicService.java
  16. 22 53
      themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java
  17. 0 68
      themis-mq/src/main/java/com/qmth/themis/mq/templete/impl/ExamBreakHistoryConcurrentlyImpl.java
  18. 12 17
      themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java

+ 1 - 1
themis-backend/src/main/java/com/qmth/themis/backend/api/SysController.java

@@ -279,7 +279,7 @@ public class SysController {
     @ApiOperation(value = "考场查询接口")
     @RequestMapping(value = "/examRoom/query", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "角色信息", response = RoomCodeQueryDto.class)})
-    public Result examRoomQuery() {
+    public Result examRoomQuery(@ApiParam(value = "考场编码", required = false) @RequestParam(required = false) String roomCode) {
         List<RoomCodeQueryDto> roomCodeQueryDtoList = tbExamInvigilateUserService.examRoomQuery();
         Map map = new HashMap();
         map.put(SystemConstant.RECORDS, roomCodeQueryDtoList);

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

@@ -67,10 +67,6 @@ public class StartRunning implements CommandLineRunner {
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.livenessVerifySaveGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LivenessVerifyConcurrentlyImpl.class));
         //考试记录数据持久化
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordPersistedGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
-
-        //考试断点记录
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examBreakHistoryGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_BREAK_HISTORY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakHistoryConcurrentlyImpl.class));
-
         //考试记录数据更新
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordUpdateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
         //考试记录数据初始化

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/dao/TBExamInvigilateUserMapper.java

@@ -41,8 +41,9 @@ public interface TBExamInvigilateUserMapper extends BaseMapper<TBExamInvigilateU
 
     /**
      * 考场查询
+     * @param roomCode
      *
      * @return
      */
-    public List<RoomCodeQueryDto> examRoomQuery();
+    public List<RoomCodeQueryDto> examRoomQuery(@Param("roomCode") String roomCode);
 }

+ 13 - 48
themis-business/src/main/java/com/qmth/themis/business/entity/TEExamStudentLog.java

@@ -26,21 +26,9 @@ public class TEExamStudentLog implements Serializable {
     @TableId(value = "id")
     private Long id;
 
-    @ApiModelProperty(value = "考试ID")
-    @TableField(value = "exam_id")
-    private Long examId;
-
-    @ApiModelProperty(value = "场次ID")
-    @TableField(value = "exam_activity_id")
-    private Long examActivityId;
-
-    @ApiModelProperty(value = "考试记录ID")
-    @TableField(value = "exam_record_id")
-    private Long examRecordId;
-
-    @ApiModelProperty(value = "考生id")
-    @TableField(value = "exam_student_id")
-    private Long examStudentId;
+    @ApiModelProperty(value = "学生id")
+    @TableField(value = "student_id")
+    private Long studentId;
 
     @ApiModelProperty(value = "类型")
     @TableField(value = "type")
@@ -62,11 +50,12 @@ public class TEExamStudentLog implements Serializable {
 
     }
 
-    public TEExamStudentLog(Integer type, String description, String remark) {
+    public TEExamStudentLog(Integer type, String description, String remark, Long studentId) {
         this.id = Constants.idGen.next();
         this.type = type;
         this.description = description;
         this.remark = remark;
+        this.studentId = studentId;
     }
 
     public static long getSerialVersionUID() {
@@ -81,38 +70,6 @@ public class TEExamStudentLog implements Serializable {
         this.id = id;
     }
 
-    public Long getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Long examId) {
-        this.examId = examId;
-    }
-
-    public Long getExamActivityId() {
-        return examActivityId;
-    }
-
-    public void setExamActivityId(Long examActivityId) {
-        this.examActivityId = examActivityId;
-    }
-
-    public Long getExamRecordId() {
-        return examRecordId;
-    }
-
-    public void setExamRecordId(Long examRecordId) {
-        this.examRecordId = examRecordId;
-    }
-
-    public Long getExamStudentId() {
-        return examStudentId;
-    }
-
-    public void setExamStudentId(Long examStudentId) {
-        this.examStudentId = examStudentId;
-    }
-
     public Integer getType() {
         return type;
     }
@@ -144,4 +101,12 @@ public class TEExamStudentLog implements Serializable {
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
 }

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

@@ -71,12 +71,7 @@ public enum MqGroupEnum {
     /**
      * 考试记录数据更新
      */
-    examRecordUpdateGroup("themis-group-exam-examRecordUpdate"),
-
-    /**
-     * 考试断点记录
-     */
-    examBreakHistoryGroup("themis-group-exam-examBreakHistory");
+    examRecordUpdateGroup("themis-group-exam-examRecordUpdate");
 
     private MqGroupEnum(String code) {
         this.code = code;

+ 3 - 4
themis-business/src/main/java/com/qmth/themis/business/enums/MqTagEnum.java

@@ -36,10 +36,9 @@ public enum MqTagEnum {
     EXAM_RECORD_PERSISTED("考试记录数据持久化", "考试日志", "normal", 24),
     EXAM_RECORD_UPDATE("考试记录数据更新", "考试日志", "normal", 25),
     EXAM_RECORD_INIT("考试记录数据初始化", "考试日志", "normal", 26),
-    EXAM_BREAK_HISTORY("考试断点记录", "考试日志", "normal", 27),
-    WARNING_LOG("预警日志标签", "预警日志", "normal", 28),
-    EXCEPTION_LOG("异常日志标签", "异常日志", "normal", 29),
-    MONITOR_LOG("监考监控日志标签", "监考监控日志", "normal", 30);
+    WARNING_LOG("预警日志标签", "预警日志", "normal", 27),
+    EXCEPTION_LOG("异常日志标签", "异常日志", "normal", 28),
+    MONITOR_LOG("监考监控日志标签", "监考监控日志", "normal", 29);
 
     private MqTagEnum(String desc, String code, String type, int id) {
         this.desc = desc;

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

@@ -11,9 +11,7 @@ public enum SystemOperationEnum {
 
     LOGIN(1, "登录"),
 
-    LOGOUT(2, "注销"),
-
-    OE_NET_UN_NORMAL(3, "客户端websocket网络延时");
+    LOGOUT(2, "注销");
 
     private int id;
 

+ 2 - 1
themis-business/src/main/java/com/qmth/themis/business/service/TBExamInvigilateUserService.java

@@ -38,8 +38,9 @@ public interface TBExamInvigilateUserService extends IService<TBExamInvigilateUs
 
     /**
      * 考场查询
+     * @param roomCode
      *
      * @return
      */
-    public List<RoomCodeQueryDto> examRoomQuery();
+    public List<RoomCodeQueryDto> examRoomQuery(String roomCode);
 }

+ 3 - 2
themis-business/src/main/java/com/qmth/themis/business/service/impl/TBExamInvigilateUserServiceImpl.java

@@ -52,11 +52,12 @@ public class TBExamInvigilateUserServiceImpl extends ServiceImpl<TBExamInvigilat
 
     /**
      * 考场查询
+     * @param roomCode
      *
      * @return
      */
     @Override
-    public List<RoomCodeQueryDto> examRoomQuery() {
-        return tbExamInvigilateUserMapper.examRoomQuery();
+    public List<RoomCodeQueryDto> examRoomQuery(String roomCode) {
+        return tbExamInvigilateUserMapper.examRoomQuery(roomCode);
     }
 }

+ 1 - 1
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamStudentLogServiceImpl.java

@@ -25,7 +25,7 @@ public class TEExamStudentLogServiceImpl extends ServiceImpl<TEExamStudentLogMap
      */
     @Override
     public boolean saveStudentLogInfo(long mqTimestamp, Object... o) {
-        TEExamStudentLog teExamStudentLog = new TEExamStudentLog(Integer.parseInt(String.valueOf(o[0])), String.valueOf(o[1]), String.valueOf(o[2]));
+        TEExamStudentLog teExamStudentLog = new TEExamStudentLog(Integer.parseInt(String.valueOf(o[0])), String.valueOf(o[1]), String.valueOf(o[2]), Long.parseLong(String.valueOf(o[3])));
         this.save(teExamStudentLog);
         return true;
     }

+ 5 - 0
themis-business/src/main/resources/mapper/TBExamInvigilateUserMapper.xml

@@ -57,5 +57,10 @@
             tbeiu.room_name as roomName
         from
             t_b_exam_invigilate_user tbeiu
+        <where>
+            <if test="roomCode != null and roomCode != ''">
+                and tbeiu.room_code like concat('%', #{roomCode}, '%')
+            </if>
+        </where>
     </select>
 </mapper>

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/listener/service/impl/MqOeLogicServiceImpl.java

@@ -151,7 +151,7 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
             }
         }
         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-        teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqTagEnum.valueOf(String.valueOf(mqDto.getType())).getId(), mqDto.getType().getCode(), JacksonUtil.parseJson(mqDto));
+//        teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqTagEnum.valueOf(String.valueOf(mqDto.getType())).getId(), mqDto.getType().getCode(), JacksonUtil.parseJson(mqDto));
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
         tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
         tmRocketMessageService.saveOrUpdate(tmRocketMessage);

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

@@ -73,9 +73,6 @@ public class StartRunning implements CommandLineRunner {
         //考试记录数据持久化
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordPersistedGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
 
-        //考试断点记录
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examBreakHistoryGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_BREAK_HISTORY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakHistoryConcurrentlyImpl.class));
-
         //考试记录数据更新
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordUpdateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
         //考试记录数据初始化

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketOeServer.java

@@ -154,7 +154,7 @@ public class WebSocketOeServer implements Concurrently {
 //                dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
                 tranMap.put("timeOut", time);
                 tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-                MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_UN_NORMAL.name(), SystemOperationEnum.OE_NET_UN_NORMAL, MqTagEnum.OE_UN_NORMAL, String.valueOf(this.recordId), this.tranMap, this.sessionId);
+                MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MqTagEnum.OE_UN_NORMAL, MqTagEnum.OE_UN_NORMAL, String.valueOf(this.recordId), this.tranMap, this.sessionId);
                 mqDtoService.assembleSendAsyncDelayMsg(mqDto);
                 //发送延时mq消息end
             }

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

@@ -83,14 +83,6 @@ public interface MqLogicService {
      */
     public void execMqExamRecordPersistedLogic(MqDto mqDto, String key);
 
-    /**
-     * 增加考试断点记录
-     *
-     * @param mqDto
-     * @param key
-     */
-    public void execMqExamBreakHistoryLogic(MqDto mqDto, String key);
-
     /**
      * 考试记录数据更新
      *

+ 22 - 53
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -122,7 +122,7 @@ public class MqLogicServiceImpl implements MqLogicService {
         if (tag.contains(MqTagEnum.USER.name())) {
             teUserLogService.saveUserLogInfo(mqDto.getTimestamp(), mqDto.getObjId(), MqTagEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto));
         } else if (tag.contains(MqTagEnum.STUDENT.name())) {
-            teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqTagEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto));
+            teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqTagEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto), mqDto.getObjId());
         }
         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
@@ -210,13 +210,23 @@ public class MqLogicServiceImpl implements MqLogicService {
         Map<String, Object> tranMap = mqDto.getProperties();
         Long recordId = Long.parseLong(String.valueOf(tranMap.get("recordId")));
         Date clientLastSyncTime = ExamRecordCacheUtil.getClientLastSyncTime(recordId);
-        if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 / 60 >= 2) {//大于等于当前时间,说明未重连或重登录
-            //是否增加断点记录或者交卷处理统一放登录逻辑里处理,这里只更新考试记录状态为中断
-            Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
-            objectMap.put("status", ExamRecordStatusEnum.BREAK_OFF);
-            redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
+        Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
+        Integer diff = 0;
+        if (Objects.nonNull(clientLastSyncTime)) {//大于等于当前时间,说明未重连或重登录
+            Long l = (System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 / 60;
+            if (l >= 2) {
+                diff = l.intValue();
+                //是否增加断点记录或者交卷处理统一放登录逻辑里处理,这里只更新考试记录状态为中断
+                objectMap.put("status", ExamRecordStatusEnum.BREAK_OFF);
+                redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
+            }
         }
-        teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqTagEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto));
+        //增加异常日志
+        Long examId = Long.parseLong(String.valueOf(objectMap.get("examId")));
+        Long examActivityId = Long.parseLong(String.valueOf(objectMap.get("examActivityId")));
+        Long examStudentId = Long.parseLong(String.valueOf(objectMap.get("examStudentId")));
+        TIeInvigilateExceptionInfo tIeInvigilateExceptionInfo = new TIeInvigilateExceptionInfo(examId, examActivityId, recordId, examStudentId, ExceptionEnum.NET_TIME_OUT.name(), ExceptionEnum.NET_TIME_OUT, String.valueOf(diff));
+        tIeInvigilateExceptionInfoService.saveOrUpdate(tIeInvigilateExceptionInfo);
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
         Map map = new HashMap();
         map.put(SystemConstant.MQDTO_OBJ, JacksonUtil.parseJson(mqDto));
@@ -322,47 +332,6 @@ public class MqLogicServiceImpl implements MqLogicService {
         redisUtil.delete(key, mqDto.getId());
     }
 
-    /**
-     * 增加考试断点记录
-     *
-     * @param mqDto
-     * @param key
-     */
-    @Override
-    @Transactional
-    public void execMqExamBreakHistoryLogic(MqDto mqDto, String key) {
-        ExamStartParamBean examStartParamBean = JacksonUtil.readJson(JacksonUtil.parseJson(mqDto.getBody()), ExamStartParamBean.class);
-        //更新考试记录
-        Long recordId = Long.parseLong(mqDto.getObjId());
-        Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
-        //先查询之前的断点记录
-        QueryWrapper<TOeExamBreakHistory> tOeExamBreakHistoryQueryWrapper = new QueryWrapper<>();
-        tOeExamBreakHistoryQueryWrapper.lambda().eq(TOeExamBreakHistory::getExamRecordId, recordId);
-        List<TOeExamBreakHistory> tOeExamBreakHistoryList = tOeExamBreakHistoryService.list(tOeExamBreakHistoryQueryWrapper);
-        //删除历史断点缓存
-        if (Objects.nonNull(tOeExamBreakHistoryList) && tOeExamBreakHistoryList.size() > 0) {
-            tOeExamBreakHistoryList.forEach(s -> {
-                redisUtil.delete(RedisKeyHelper.examBreakCacheKey(s.getId()));
-            });
-        }
-        //增加断点记录
-        TOeExamBreakHistory tOeExamBreakHistory = new TOeExamBreakHistory(recordId, new Date(), BreakReasonEnum.NET_TIME_OUT, BreakReasonEnum.NET_TIME_OUT.name());
-        tOeExamBreakHistoryService.save(tOeExamBreakHistory);
-        redisUtil.setForHash(RedisKeyHelper.examBreakCacheKey(tOeExamBreakHistory.getId()), SimpleBeanUtil.objectToMap(tOeExamBreakHistory));
-
-        objectMap.put("lastBreakId", tOeExamBreakHistory.getId());
-        redisUtil.setForHash(RedisKeyHelper.examRecordCacheKey(recordId), objectMap);
-
-        Gson gson = new Gson();
-        teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqTagEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto));
-        mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
-        TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
-        tmRocketMessage.setBody(JacksonUtil.parseJson(tmRocketMessage.getBody()));
-        tmRocketMessageService.saveOrUpdate(tmRocketMessage);
-        redisUtil.delete(key, mqDto.getId());
-    }
-
-
     @Override
     @Transactional
     public void execMqRecordUpdateLogic(MqDto mqDto, String key) {
@@ -438,11 +407,11 @@ public class MqLogicServiceImpl implements MqLogicService {
             //更新考试记录
             Long recordId = Long.parseLong(mqDto.getObjId());
             Map<String, Object> objectMap = redisUtil.getHashEntries(RedisKeyHelper.examRecordCacheKey(recordId));
-            //获取最近断点时间
-            Date lastBreakTime = (Date) objectMap.get("lastBreakTime");
-            Integer diff = null;
-            if (Objects.nonNull(lastBreakTime)) {
-                Long l = ((System.currentTimeMillis() - lastBreakTime.getTime()) / 1000 / 60);
+            //获取最近同步时间
+            Date clientLastSyncTime = ExamRecordCacheUtil.getClientLastSyncTime(recordId);
+            Integer diff = 0;
+            if (Objects.nonNull(clientLastSyncTime)) {
+                Long l = ((System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 / 60);
                 diff = l.intValue();
             }
             //先查询之前的断点记录

+ 0 - 68
themis-mq/src/main/java/com/qmth/themis/mq/templete/impl/ExamBreakHistoryConcurrentlyImpl.java

@@ -1,68 +0,0 @@
-package com.qmth.themis.mq.templete.impl;
-
-import com.qmth.themis.business.constant.SpringContextHolder;
-import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.business.util.JacksonUtil;
-import com.qmth.themis.business.util.RedisUtil;
-import com.qmth.themis.common.contanst.Constants;
-import com.qmth.themis.business.dto.MqDto;
-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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * @Description: mq 考试断点记录并行消费监听
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2020/7/28
- */
-@Service
-public class ExamBreakHistoryConcurrentlyImpl implements Concurrently {
-    private final static Logger log = LoggerFactory.getLogger(ExamBreakHistoryConcurrentlyImpl.class);
-
-    @Override
-    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
-        RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
-        MqLogicService mqLogicService = SpringContextHolder.getBean(MqLogicService.class);
-        MqDto mqDto = null;
-        try {
-            long threadId = Thread.currentThread().getId();
-            String threadName = Thread.currentThread().getName();
-            for (MessageExt messageExt : msgs) {
-                mqDto = JacksonUtil.readJson(new String(messageExt.getBody(), Constants.CHARSET), MqDto.class);
-                log.info(":{}-:{} examBreakHistory Consumer重试次数:{}", threadId, threadName, messageExt.getReconsumeTimes());
-                log.info(":{}-:{} examBreakHistory Consumer接收到的消息:{}", threadId, threadName, JacksonUtil.parseJson(mqDto));
-                int reconsumeTime = messageExt.getReconsumeTimes();
-                if (reconsumeTime >= SystemConstant.MAXRECONSUMETIMES) {
-                    mqLogicService.execMqMaxReconsumeTime(mqDto, SystemConstant.MQ_TOPIC_BUFFER_LIST);
-                } else {
-                    if (Objects.nonNull(mqDto.getAck()) && mqDto.getAck().intValue() != SystemConstant.STANDARD_ACK_TYPE && Objects.nonNull(redisUtil.get(SystemConstant.MQ_TOPIC_BUFFER_LIST, mqDto.getId())) && redisUtil.lock(SystemConstant.REDIS_LOCK_MQ_PREFIX + mqDto.getId(), SystemConstant.REDIS_LOCK_MQ_TIME_OUT)) {
-                        log.info(":{}-:{} 插入用户轨迹日志", threadId, threadName);
-                        mqLogicService.execMqExamBreakHistoryLogic(mqDto, SystemConstant.MQ_TOPIC_BUFFER_LIST);
-                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
-                    } else {
-                        log.info(":{}-:{} 消息ack未确认,重发", threadId, threadName);
-                        return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
-        } finally {
-            if (Objects.nonNull(mqDto)) {
-                redisUtil.releaseLock(SystemConstant.REDIS_LOCK_MQ_PREFIX + mqDto.getId());
-            }
-        }
-        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//成功
-    }
-}

+ 12 - 17
themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java

@@ -1,28 +1,26 @@
 package com.qmth.themis.task.start;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.annotation.Resource;
-
-import com.qmth.themis.business.constant.SystemConstant;
-import com.qmth.themis.mq.templete.impl.*;
-import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.stereotype.Component;
-
 import com.qmth.themis.business.constant.SpringContextHolder;
+import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.MqGroupEnum;
 import com.qmth.themis.business.enums.MqTagEnum;
 import com.qmth.themis.business.enums.MqTopicEnum;
 import com.qmth.themis.mq.listener.RocketMessageConsumer;
+import com.qmth.themis.mq.templete.impl.*;
 import com.qmth.themis.task.enums.QuartzTaskEnum;
 import com.qmth.themis.task.listener.QuartzOrderlyImpl;
 import com.qmth.themis.task.quartz.MqJob;
 import com.qmth.themis.task.service.QuartzService;
+import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
@@ -96,9 +94,6 @@ public class StartRunning implements CommandLineRunner {
         //考试记录数据持久化
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordPersistedGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
 
-        //考试断点记录
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examBreakHistoryGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_BREAK_HISTORY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakHistoryConcurrentlyImpl.class));
-
         //考试记录数据更新
         rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordUpdateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
         //考试记录数据初始化