wangliang 4 yıl önce
ebeveyn
işleme
51eba660f7
40 değiştirilmiş dosya ile 423 ekleme ve 280 silme
  1. 2 2
      themis-backend/src/main/java/com/qmth/themis/backend/api/TBExamInvigilateUserController.java
  2. 7 3
      themis-backend/src/main/java/com/qmth/themis/backend/api/TBUserController.java
  3. 1 1
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamActivityController.java
  4. 4 4
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamController.java
  5. 1 1
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamPaperController.java
  6. 1 1
      themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamStudentController.java
  7. 1 1
      themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateCallMobileController.java
  8. 3 3
      themis-backend/src/main/java/com/qmth/themis/backend/api/TIeInvigilateController.java
  9. 18 12
      themis-backend/src/main/java/com/qmth/themis/backend/start/StartRunning.java
  10. 1 0
      themis-business/src/main/java/com/qmth/themis/business/dto/response/TEExamActivityDto.java
  11. 20 15
      themis-business/src/main/java/com/qmth/themis/business/enums/MqGroupEnum.java
  12. 5 3
      themis-business/src/main/java/com/qmth/themis/business/enums/MqTagEnum.java
  13. 1 1
      themis-business/src/main/java/com/qmth/themis/business/enums/MqTopicEnum.java
  14. 0 8
      themis-business/src/main/java/com/qmth/themis/business/service/MqDtoService.java
  15. 0 7
      themis-business/src/main/java/com/qmth/themis/business/service/TEExamStudentLogService.java
  16. 0 7
      themis-business/src/main/java/com/qmth/themis/business/service/TEUserLogService.java
  17. 1 1
      themis-business/src/main/java/com/qmth/themis/business/service/impl/CommonServiceImpl.java
  18. 0 26
      themis-business/src/main/java/com/qmth/themis/business/service/impl/MqDtoServiceImpl.java
  19. 5 5
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java
  20. 0 17
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamStudentLogServiceImpl.java
  21. 5 2
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEMobileServiceImpl.java
  22. 0 16
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TEUserLogServiceImpl.java
  23. 2 2
      themis-business/src/main/java/com/qmth/themis/business/service/impl/TOeExamRecordServiceImpl.java
  24. 9 27
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEExamController.java
  25. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEFaceController.java
  26. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/api/TELivenessController.java
  27. 23 10
      themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java
  28. 4 4
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java
  29. 4 4
      themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java
  30. 9 0
      themis-exam/src/main/java/com/qmth/themis/exam/listener/service/MqOeLogicService.java
  31. 43 4
      themis-exam/src/main/java/com/qmth/themis/exam/listener/service/impl/MqOeLogicServiceImpl.java
  32. 26 35
      themis-exam/src/main/java/com/qmth/themis/exam/start/StartRunning.java
  33. 44 1
      themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketMobileServer.java
  34. 1 1
      themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketOeServer.java
  35. 20 12
      themis-mq/src/main/java/com/qmth/themis/mq/service/MqLogicService.java
  36. 57 22
      themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java
  37. 76 0
      themis-mq/src/main/java/com/qmth/themis/mq/templete/impl/ExamBreakConcurrentlyImpl.java
  38. 3 3
      themis-task/src/main/java/com/qmth/themis/task/enums/QuartzTaskEnum.java
  39. 3 3
      themis-task/src/main/java/com/qmth/themis/task/listener/service/impl/MqTaskLogicServiceImpl.java
  40. 21 14
      themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java

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

@@ -161,7 +161,7 @@ public class TBExamInvigilateUserController {
             transMap.put("orgId", tbUser.getOrgId());
             transMap.put("orgId", tbUser.getOrgId());
             transMap.put("remark", tbAttachment.getRemark());
             transMap.put("remark", tbAttachment.getRemark());
             //mq发送消息start
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.ROOM_CODE_IMPORT.name(), transMap, MqTagEnum.ROOM_CODE_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
+            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.ROOM_CODE_IMPORT.name(), transMap, MqTagEnum.ROOM_CODE_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
             //mq发送消息end
         } catch (Exception e) {
         } catch (Exception e) {
@@ -198,7 +198,7 @@ public class TBExamInvigilateUserController {
                 transMap.put("createId", tbUser.getId());
                 transMap.put("createId", tbUser.getId());
                 transMap.put("orgId", tbUser.getOrgId());
                 transMap.put("orgId", tbUser.getOrgId());
                 //mq发送消息start
                 //mq发送消息start
-                MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.ROOM_CODE_EXPORT.name(), transMap, MqTagEnum.ROOM_CODE_EXPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
+                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.ROOM_CODE_EXPORT.name(), transMap, MqTagEnum.ROOM_CODE_EXPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
                 mqDtoService.assembleSendOneWayMsg(mqDto);
                 mqDtoService.assembleSendOneWayMsg(mqDto);
                 //mq发送消息end
                 //mq发送消息end
             } else {
             } else {

+ 7 - 3
themis-backend/src/main/java/com/qmth/themis/backend/api/TBUserController.java

@@ -9,6 +9,7 @@ import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.base.BasePage;
 import com.qmth.themis.business.base.BasePage;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
 import com.qmth.themis.business.dto.AuthDto;
+import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.response.TBUserDto;
 import com.qmth.themis.business.dto.response.TBUserDto;
 import com.qmth.themis.business.entity.TBOrg;
 import com.qmth.themis.business.entity.TBOrg;
 import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.entity.TBSession;
@@ -190,8 +191,10 @@ public class TBUserController {
         TBSession tbSession = new TBSession(sessionId, String.valueOf(user.getId()), authDto.getRoleCodes().toString(), source, platform.name(), deviceId, ServletUtil.getRequest().getLocalAddr(), token, expire);
         TBSession tbSession = new TBSession(sessionId, String.valueOf(user.getId()), authDto.getRoleCodes().toString(), source, platform.name(), deviceId, ServletUtil.getRequest().getLocalAddr(), token, expire);
         redisUtil.setUserSession(sessionId, tbSession, redisExpire);
         redisUtil.setUserSession(sessionId, tbSession, redisExpire);
         //mq发送消息start
         //mq发送消息start
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), platform.name(), tbSession, platform.name(), tbSession.getId(), user.getLoginName());
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), MqTagEnum.USER.name(), SystemOperationEnum.LOGIN, MqTagEnum.USER.name(), user.getId(), user.getLoginName());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), platform.name(), tbSession, MqTagEnum.valueOf(platform.name()), tbSession.getId(), user.getLoginName());
+        mqDtoService.assembleSendOneWayMsg(mqDto);
+        MqDto mqDtoLog = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name(), SystemOperationEnum.LOGIN, MqTagEnum.USER, String.valueOf(user.getId()), user.getLoginName());
+        mqDtoService.assembleSendOneWayMsg(mqDtoLog);
         //mq发送消息end
         //mq发送消息end
         //测试
         //测试
         String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);
         String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);
@@ -531,7 +534,8 @@ public class TBUserController {
             cacheService.removeAccountCache(tbUser.getId());
             cacheService.removeAccountCache(tbUser.getId());
         }
         }
         //mq发送消息start
         //mq发送消息start
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), MqTagEnum.USER.name(), SystemOperationEnum.LOGOUT, MqTagEnum.USER.name(), tbUser.getId(), tbUser.getLoginName());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name(), SystemOperationEnum.LOGOUT, MqTagEnum.USER, String.valueOf(tbUser.getId()), tbUser.getLoginName());
+        mqDtoService.assembleSendOneWayMsg(mqDto);
         //mq发送消息end
         //mq发送消息end
         return ResultUtil.ok(Collections.singletonMap("success", true));
         return ResultUtil.ok(Collections.singletonMap("success", true));
     }
     }

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

@@ -86,7 +86,7 @@ public class TEExamActivityController {
             prop.put("oper", "insert");
             prop.put("oper", "insert");
             prop.put("exam", teExam);
             prop.put("exam", teExam);
             if (Objects.nonNull(teExamActivityList.get(0)) && teExamActivityList.get(0).getEnable() == 1) {
             if (Objects.nonNull(teExamActivityList.get(0)) && teExamActivityList.get(0).getEnable() == 1) {
-                MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
+                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
                 mqDtoService.assembleSendOneWayMsg(mqDto);
                 mqDtoService.assembleSendOneWayMsg(mqDto);
             }
             }
             //新增quartz任务,发送mq消息end
             //新增quartz任务,发送mq消息end

+ 4 - 4
themis-backend/src/main/java/com/qmth/themis/backend/api/TEExamController.java

@@ -123,7 +123,7 @@ public class TEExamController {
                     Map<String, Object> prop = new HashMap<>();
                     Map<String, Object> prop = new HashMap<>();
                     prop.put("oper", "delete");
                     prop.put("oper", "delete");
                     if (Objects.nonNull(teExamActivityList.get(0)) && teExamActivityList.get(0).getEnable() == 1) {
                     if (Objects.nonNull(teExamActivityList.get(0)) && teExamActivityList.get(0).getEnable() == 1) {
-                        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
+                        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
                         mqDtoService.assembleSendOneWayMsg(mqDto);
                         mqDtoService.assembleSendOneWayMsg(mqDto);
                     }
                     }
                     //删除quartz任务,发送mq消息end
                     //删除quartz任务,发送mq消息end
@@ -152,7 +152,7 @@ public class TEExamController {
                     Map<String, Object> prop = new HashMap<>();
                     Map<String, Object> prop = new HashMap<>();
                     prop.put("oper", "insert");
                     prop.put("oper", "insert");
                     prop.put("exam", teExam);
                     prop.put("exam", teExam);
-                    MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
+                    MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(teExamActivityList), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
                     mqDtoService.assembleSendOneWayMsg(mqDto);
                     mqDtoService.assembleSendOneWayMsg(mqDto);
                     //新增quartz任务,发送mq消息end
                     //新增quartz任务,发送mq消息end
                     teExamActivityList.forEach(s -> {
                     teExamActivityList.forEach(s -> {
@@ -170,7 +170,7 @@ public class TEExamController {
                     prop.put("oper", "insert");
                     prop.put("oper", "insert");
                     prop.put("exam", teExam);
                     prop.put("exam", teExam);
                     if (Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {
                     if (Objects.nonNull(teExamActivity) && teExamActivity.getEnable() == 1) {
-                        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(Arrays.asList(teExamActivity)), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
+                        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), JacksonUtil.parseJson(Arrays.asList(teExamActivity)), MqTagEnum.EXAM_ACTIVITY, String.valueOf(teExam.getId()), prop, tbUser.getName());
                         mqDtoService.assembleSendOneWayMsg(mqDto);
                         mqDtoService.assembleSendOneWayMsg(mqDto);
                     }
                     }
                 }
                 }
@@ -467,7 +467,7 @@ public class TEExamController {
             transMap.put("examId", examId);
             transMap.put("examId", examId);
             transMap.put(SystemConstant.TASK_ID, tbTaskHistory.getId());
             transMap.put(SystemConstant.TASK_ID, tbTaskHistory.getId());
             //mq发送消息start
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_SCORE_CALCULATE.name(), transMap, MqTagEnum.EXAM_SCORE_CALCULATE, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
+            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_SCORE_CALCULATE.name(), transMap, MqTagEnum.EXAM_SCORE_CALCULATE, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
             //mq发送消息end
         } catch (Exception e) {
         } catch (Exception e) {

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

@@ -149,7 +149,7 @@ public class TEExamPaperController {
             transMap.put("processAnswer", processAnswer);
             transMap.put("processAnswer", processAnswer);
             transMap.put("remark", tbAttachment.getRemark());
             transMap.put("remark", tbAttachment.getRemark());
             //mq发送消息start
             //mq发送消息start
-            MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_PAPER_IMPORT.name(), transMap, MqTagEnum.EXAM_PAPER_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
+            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_PAPER_IMPORT.name(), transMap, MqTagEnum.EXAM_PAPER_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //mq发送消息end
             //mq发送消息end
         } catch (Exception e) {
         } catch (Exception e) {

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

@@ -326,7 +326,7 @@ public class TEExamStudentController {
 			}
 			}
 			transMap.put("remark", tbAttachment.getRemark());
 			transMap.put("remark", tbAttachment.getRemark());
 			// mq发送消息start
 			// mq发送消息start
-			MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name(), transMap,
+			MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name(), transMap,
 					MqTagEnum.EXAM_STUDENT_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
 					MqTagEnum.EXAM_STUDENT_IMPORT, String.valueOf(tbTaskHistory.getId()), tbUser.getName());
 			mqDtoService.assembleSendOneWayMsg(mqDto);
 			mqDtoService.assembleSendOneWayMsg(mqDto);
 			// mq发送消息end
 			// mq发送消息end

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

@@ -145,7 +145,7 @@ public class TIeInvigilateCallMobileController {
         MonitorStatusSourceEnum status = ExamRecordCacheUtil.getMonitorStatus(recordId, source.name());
         MonitorStatusSourceEnum status = ExamRecordCacheUtil.getMonitorStatus(recordId, source.name());
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         //监考监控通话信息 发送mq start
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("success", true));
         return ResultUtil.ok(Collections.singletonMap("success", true));

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

@@ -256,7 +256,7 @@ public class TIeInvigilateController {
         } else {
         } else {
             mqTagEnum = MqTagEnum.OE_HARD_FINISH;
             mqTagEnum = MqTagEnum.OE_HARD_FINISH;
         }
         }
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), mqTagEnum.name(), JacksonUtil.parseJson(recordIdList), mqTagEnum, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), mqTagEnum.name(), JacksonUtil.parseJson(recordIdList), mqTagEnum, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //发送mq给客户端强制收卷end
         //发送mq给客户端强制收卷end
         return ResultUtil.ok(Collections.singletonMap("success", true));
         return ResultUtil.ok(Collections.singletonMap("success", true));
@@ -399,12 +399,12 @@ public class TIeInvigilateController {
         }
         }
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         TBUser tbUser = (TBUser) ServletUtil.getRequestAccount();
         //发送mq给客户端监考消息start
         //发送mq给客户端监考消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_IM_CLUSTERING.name(), recordId, MqTagEnum.OE_IM_CLUSTERING, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_IM_CLUSTERING.name(), recordId, MqTagEnum.OE_IM_CLUSTERING, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //发送mq给客户端监考消息end
         //发送mq给客户端监考消息end
 
 
         //发送mq给客户端监考强制活体验证start
         //发送mq给客户端监考强制活体验证start
-        mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_LIVENESS_VERIFY.name(), recordId, MqTagEnum.OE_LIVENESS_VERIFY, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
+        mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_LIVENESS_VERIFY.name(), recordId, MqTagEnum.OE_LIVENESS_VERIFY, String.valueOf(tbUser.getId()), mapParameter, tbUser.getName());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //发送mq给客户端监考强制活体验证end
         //发送mq给客户端监考强制活体验证end
         return ResultUtil.ok(Collections.singletonMap("success", true));
         return ResultUtil.ok(Collections.singletonMap("success", true));

+ 18 - 12
themis-backend/src/main/java/com/qmth/themis/backend/start/StartRunning.java

@@ -39,41 +39,47 @@ public class StartRunning implements CommandLineRunner {
         /**
         /**
          * session
          * session
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.sessionConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.SESSION_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
         /**
         /**
          * userLog
          * userLog
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.userLogConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.USER_LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
         /**
         /**
          * task
          * task
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.taskConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.TASK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
         /**
         /**
          * log
          * log
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.logConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
         /**
         /**
          * websocket mq start
          * websocket mq start
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.websocketConsumerDelayGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.WEBSOCKET_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
         /**
         /**
          * websocket mq end
          * websocket mq end
          */
          */
         //计算客观分
         //计算客观分
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.calculateObjectiveScoreGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.CALCULATE_OBJECTIVE_SCORE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
         //人脸验证保存
         //人脸验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.faceVerifySaveGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.FACE_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
         //活体验证保存
         //活体验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.livenessVerifySaveGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LivenessVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LIVENESS_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.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.EXAM_RECORD_PERSISTED_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
         //考试记录数据更新
         //考试记录数据更新
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordUpdateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
         //考试记录数据初始化
         //考试记录数据初始化
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordInitGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_INIT_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
         
         
         //考试重新算分
         //考试重新算分
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.scoreCalculateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_SCORE_CALCULATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateScoreConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.SCORE_CALCULATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_SCORE_CALCULATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateScoreConcurrentlyImpl.class));
+
+        //考生数据更新
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_STUDENT_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamStudentUpdateConcurrentlyImpl.class));
+
+        //考试断点
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
         SystemConstant.initTempFiles();
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
         log.info("服务器启动时执行 end");
     }
     }

+ 1 - 0
themis-business/src/main/java/com/qmth/themis/business/dto/response/TEExamActivityDto.java

@@ -1,5 +1,6 @@
 package com.qmth.themis.business.dto.response;
 package com.qmth.themis.business.dto.response;
 
 
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamActivityCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;
 import com.qmth.themis.business.cache.bean.ExamCourseCacheBean;

+ 20 - 15
themis-business/src/main/java/com/qmth/themis/business/enums/MqGroupEnum.java

@@ -12,75 +12,80 @@ public enum MqGroupEnum {
     /**
     /**
      * session会话
      * session会话
      */
      */
-    sessionConsumerGroup("themis-group-exam-session"),
+    SESSION_GROUP("themis-group-exam-session"),
 
 
     /**
     /**
      * 用户轨迹
      * 用户轨迹
      */
      */
-    userLogConsumerGroup("themis-group-exam-userLog"),
+    USER_LOG_GROUP("themis-group-exam-userLog"),
 
 
     /**
     /**
      * 导入导出任务
      * 导入导出任务
      */
      */
-    taskConsumerGroup("themis-group-exam-task"),
+    TASK_GROUP("themis-group-exam-task"),
 
 
     /**
     /**
      * 日志
      * 日志
      */
      */
-    logConsumerGroup("themis-group-exam-log"),
+    LOG_GROUP("themis-group-exam-log"),
 
 
     /**
     /**
      * websocket oe 考生 group
      * websocket oe 考生 group
      */
      */
-    websocketConsumerOeGroup("themis-group-exam-websocketOe"),
+    WEBSOCKET_OE_GROUP("themis-group-exam-websocketOe"),
 
 
     /**
     /**
      * websocket超时退出 考生 group
      * websocket超时退出 考生 group
      */
      */
-    websocketConsumerDelayGroup("themis-group-exam-websocketDelay"),
+    WEBSOCKET_DELAY_GROUP("themis-group-exam-websocketDelay"),
 
 
     /**
     /**
      * quartz 考场 group
      * quartz 考场 group
      */
      */
-    quartzConsumerGroup("themis-group-exam-quartz"),
+    QUARTZ_GROUP("themis-group-exam-quartz"),
 
 
     /**
     /**
      * 计算客观分
      * 计算客观分
      */
      */
-    calculateObjectiveScoreGroup("themis-group-exam-calculateObjectiveScore"),
+    CALCULATE_OBJECTIVE_SCORE_GROUP("themis-group-exam-calculateObjectiveScore"),
 
 
     /**
     /**
      * 人脸验证
      * 人脸验证
      */
      */
-    faceVerifySaveGroup("themis-group-exam-faceVerifySave"),
+    FACE_VERIFY_SAVE_GROUP("themis-group-exam-faceVerifySave"),
     /**
     /**
      * 活体验证
      * 活体验证
      */
      */
-    livenessVerifySaveGroup("themis-group-exam-livenessVerifySave"),
+    LIVENESS_VERIFY_SAVE_GROUP("themis-group-exam-livenessVerifySave"),
 
 
     /**
     /**
      * 考试记录数据持久化
      * 考试记录数据持久化
      */
      */
-    examRecordPersistedGroup("themis-group-exam-examRecordPersisted"),
+    EXAM_RECORD_PERSISTED_GROUP("themis-group-exam-examRecordPersisted"),
     
     
     /**
     /**
      * 考试记录数据初始化
      * 考试记录数据初始化
      */
      */
-    examRecordInitGroup("themis-group-exam-examRecordInit"),
+    EXAM_RECORD_INIT_GROUP("themis-group-exam-examRecordInit"),
     
     
     /**
     /**
      * 考试记录数据更新
      * 考试记录数据更新
      */
      */
-    examRecordUpdateGroup("themis-group-exam-examRecordUpdate"),
+    EXAM_RECORD_UPDATE_GROUP("themis-group-exam-examRecordUpdate"),
 	
 	
 	/**
 	/**
      * 考试重新算分
      * 考试重新算分
      */
      */
-    scoreCalculateGroup("themis-group-exam-scoreCalculate"),
+    SCORE_CALCULATE_GROUP("themis-group-exam-scoreCalculate"),
     /**
     /**
      * 考生数据更新
      * 考生数据更新
      */
      */
-    examStudentUpdateGroup("themis-group-exam-examStudentUpdate");
+    EXAM_STUDENT_UPDATE_GROUP("themis-group-exam-examStudentUpdate"),
+
+    /**
+     * 考试断点
+     */
+    EXAM_BREAK_GROUP("themis-group-exam-examBreak");
 
 
     private MqGroupEnum(String code) {
     private MqGroupEnum(String code) {
         this.code = code;
         this.code = code;

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

@@ -27,7 +27,7 @@ public enum MqTagEnum {
     OE_WARNING_FINISH("websocket客户端预警强制离线(交卷)标签", "预警强制离线(交卷)", "normal", 15),
     OE_WARNING_FINISH("websocket客户端预警强制离线(交卷)标签", "预警强制离线(交卷)", "normal", 15),
     OE_HARD_FINISH("websocket客户端手动(交卷)标签", "手动(交卷)", "normal", 16),
     OE_HARD_FINISH("websocket客户端手动(交卷)标签", "手动(交卷)", "normal", 16),
     OE_LIVENESS_VERIFY("websocket客户端监考强制活体验证标签", "监考强制活体验证", "normal", 17),
     OE_LIVENESS_VERIFY("websocket客户端监考强制活体验证标签", "监考强制活体验证", "normal", 17),
-    OE_UN_NORMAL("websocket超时退出标签", "websocket超时退出超时退出", "delay", 18),
+    OE_UN_NORMAL("websocket超时退出标签", "websocket超时退出", "delay", 18),
     EXAM_ACTIVITY("考场一次性延时任务标签", "考场一次性延时任务", "normal", 19),
     EXAM_ACTIVITY("考场一次性延时任务标签", "考场一次性延时任务", "normal", 19),
     QUARTZ("quartz标签", "quartz任务", "normal", 20),
     QUARTZ("quartz标签", "quartz任务", "normal", 20),
     CALCULATE_OBJECTIVE_SCORE("计算客观分标签", "计算客观分", "normal", 21),
     CALCULATE_OBJECTIVE_SCORE("计算客观分标签", "计算客观分", "normal", 21),
@@ -39,8 +39,10 @@ public enum MqTagEnum {
     WARNING_LOG("预警标签", "预警", "normal", 27),
     WARNING_LOG("预警标签", "预警", "normal", 27),
     EXCEPTION_LOG("异常标签", "异常", "normal", 28),
     EXCEPTION_LOG("异常标签", "异常", "normal", 28),
     MONITOR_LOG("监考监控标签", "监考监控", "normal", 29),
     MONITOR_LOG("监考监控标签", "监考监控", "normal", 29),
-    EXAM_SCORE_CALCULATE("重新算分", "考试", "normal", 30),
-    EXAM_STUDNET_UPDATE("考生数据更新", "考试", "normal", 31),;
+    EXAM_SCORE_CALCULATE("重新算分标签", "重新算分", "normal", 30),
+    EXAM_STUDNET_UPDATE("考生数据更新标签", "考生数据更新", "normal", 31),
+    EXAM_BREAK("考试断点标签", "考试断点", "normal", 32),
+    EXAM_STOP("考试移动端监控暂停标签", "考试移动端监控暂停", "normal", 33);
 
 
     private MqTagEnum(String desc, String code, String type, int id) {
     private MqTagEnum(String desc, String code, String type, int id) {
         this.desc = desc;
         this.desc = desc;

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

@@ -9,7 +9,7 @@ package com.qmth.themis.business.enums;
  */
  */
 public enum MqTopicEnum {
 public enum MqTopicEnum {
 
 
-    themisTopic("themis-topic-exam");
+    THEMIS_TOPIC("themis-topic-exam");
 
 
     private MqTopicEnum(String code) {
     private MqTopicEnum(String code) {
         this.code = code;
         this.code = code;

+ 0 - 8
themis-business/src/main/java/com/qmth/themis/business/service/MqDtoService.java

@@ -11,14 +11,6 @@ import com.qmth.themis.business.dto.MqDto;
  */
  */
 public interface MqDtoService {
 public interface MqDtoService {
 
 
-    /**
-     * 组装单向消息
-     *
-     * @param o
-     * @return
-     */
-    public MqDto assembleSendOneWayMsg(Object... o);
-
     /**
     /**
      * 组装单向消息
      * 组装单向消息
      *
      *

+ 0 - 7
themis-business/src/main/java/com/qmth/themis/business/service/TEExamStudentLogService.java

@@ -12,11 +12,4 @@ import com.qmth.themis.business.entity.TEExamStudentLog;
  */
  */
 public interface TEExamStudentLogService extends IService<TEExamStudentLog> {
 public interface TEExamStudentLogService extends IService<TEExamStudentLog> {
 
 
-    /**
-     * 保存学生轨迹
-     *
-     * @param o
-     * @return
-     */
-    public boolean saveStudentLogInfo(Object... o);
 }
 }

+ 0 - 7
themis-business/src/main/java/com/qmth/themis/business/service/TEUserLogService.java

@@ -12,11 +12,4 @@ import com.qmth.themis.business.entity.TEUserLog;
  */
  */
 public interface TEUserLogService extends IService<TEUserLog> {
 public interface TEUserLogService extends IService<TEUserLog> {
 
 
-    /**
-     * 保存用户轨迹
-     *
-     * @param o
-     * @return
-     */
-    public boolean saveUserLogInfo(Object... o);
 }
 }

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

@@ -67,7 +67,7 @@ public class CommonServiceImpl implements CommonService {
 				Map<String, Object> propMap = new HashMap<String, Object>();
 				Map<String, Object> propMap = new HashMap<String, Object>();
 				propMap.put("timeOut", time);
 				propMap.put("timeOut", time);
 				propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
 				propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-				MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(),
+				MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(),
 						transMap, MqTagEnum.EXAM_RECORD_PERSISTED, recordId.toString(), propMap, recordId.toString());
 						transMap, MqTagEnum.EXAM_RECORD_PERSISTED, recordId.toString(), propMap, recordId.toString());
 
 
 				mqDtoService.assembleSendAsyncDelayMsg(mqDto);
 				mqDtoService.assembleSendAsyncDelayMsg(mqDto);

+ 0 - 26
themis-business/src/main/java/com/qmth/themis/business/service/impl/MqDtoServiceImpl.java

@@ -30,32 +30,6 @@ public class MqDtoServiceImpl implements MqDtoService {
     @Resource
     @Resource
     RedisUtil redisUtil;
     RedisUtil redisUtil;
 
 
-    /**
-     * 组装单向消息
-     *
-     * @param o
-     * @return
-     */
-    @Override
-    public MqDto assembleSendOneWayMsg(Object... o) {
-        MqDto mqDto = null;
-        MqTagEnum mqtagEnum = MqTagEnum.valueOf(String.valueOf(o[3]));
-        //往mq发送消息插入会话信息
-        mqDto = new MqDto(String.valueOf(o[0]), String.valueOf(o[1]), o[2], mqtagEnum, String.valueOf(o[4]), String.valueOf(o[5]));
-        mqDto.setAck(SystemConstant.DELIVERED_ACK_TYPE);
-        try {
-            producerServer.sendOneWay(mqDto);
-        } catch (Exception e) {
-            log.error("请求出错", e);
-            if (Objects.nonNull(mqDto)) {
-                mqDto.setAck(SystemConstant.UNSEND_ACK_TYPE);
-            }
-        } finally {
-            setTopicBuffer(mqDto);
-        }
-        return mqDto;
-    }
-
     /**
     /**
      * 组装单向消息
      * 组装单向消息
      *
      *

+ 5 - 5
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEExamServiceImpl.java

@@ -292,7 +292,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         teStudentCacheDto.setUnFinishedRecordId(recordId);
         teStudentCacheDto.setUnFinishedRecordId(recordId);
         redisUtil.setStudent(studentId, teStudentCacheDto);
         redisUtil.setStudent(studentId, teStudentCacheDto);
         //mq发送消息start
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FIRST_PREPARE, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), teStudentCacheDto.getIdentity());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FIRST_PREPARE, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), teStudentCacheDto.getIdentity());
         this.sendOeLogMessage(SystemOperationEnum.FIRST_PREPARE, examStudentId, recordId, mqDto);
         this.sendOeLogMessage(SystemOperationEnum.FIRST_PREPARE, examStudentId, recordId, mqDto);
         updateExamStudent(examStudentId, alreadyExamCount, recordId);
         updateExamStudent(examStudentId, alreadyExamCount, recordId);
         //mq发送消息end
         //mq发送消息end
@@ -304,7 +304,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         transMap.put("examStudentId", examStudentId);
         transMap.put("examStudentId", examStudentId);
         transMap.put("alreadyExamCount", alreadyExamCount);
         transMap.put("alreadyExamCount", alreadyExamCount);
         transMap.put("currentRecordId", currentRecordId);
         transMap.put("currentRecordId", currentRecordId);
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), transMap, MqTagEnum.EXAM_STUDNET_UPDATE, examStudentId.toString(), examStudentId.toString());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), transMap, MqTagEnum.EXAM_STUDNET_UPDATE, examStudentId.toString(), examStudentId.toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
     }
 
 
@@ -488,7 +488,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         transMap.put("subNumber", subNumber);
         transMap.put("subNumber", subNumber);
         transMap.put("subIndex", subIndex);
         transMap.put("subIndex", subIndex);
         // mq发送消息start
         // mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), transMap,
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), transMap,
                 MqTagEnum.CALCULATE_OBJECTIVE_SCORE, recordId.toString(), recordId.toString());
                 MqTagEnum.CALCULATE_OBJECTIVE_SCORE, recordId.toString(), recordId.toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
     }
@@ -755,7 +755,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         //异步持久化
         //异步持久化
         checkToPersisted(recordId);
         checkToPersisted(recordId);
         //mq发送消息start
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FINISHED, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), teStudentCacheDto.getIdentity());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.FINISHED, MqTagEnum.STUDENT, String.valueOf(teStudentCacheDto.getId()), teStudentCacheDto.getIdentity());
         this.sendOeLogMessage(SystemOperationEnum.FINISHED, examStudentId, recordId, mqDto);
         this.sendOeLogMessage(SystemOperationEnum.FINISHED, examStudentId, recordId, mqDto);
         //mq发送消息end
         //mq发送消息end
         return ret;
         return ret;
@@ -781,7 +781,7 @@ public class TEExamServiceImpl extends ServiceImpl<TEExamMapper, TEExam> impleme
         Map<String, Object> propMap = new HashMap<String, Object>();
         Map<String, Object> propMap = new HashMap<String, Object>();
         propMap.put("timeOut", time);
         propMap.put("timeOut", time);
         propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
         propMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(),
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(),
                 transMap, MqTagEnum.EXAM_RECORD_PERSISTED, recordId.toString(), propMap, recordId.toString());
                 transMap, MqTagEnum.EXAM_RECORD_PERSISTED, recordId.toString(), propMap, recordId.toString());
 
 
         mqDtoService.assembleSendAsyncDelayMsg(mqDto);
         mqDtoService.assembleSendAsyncDelayMsg(mqDto);

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

@@ -18,21 +18,4 @@ import java.util.Objects;
 @Service
 @Service
 public class TEExamStudentLogServiceImpl extends ServiceImpl<TEExamStudentLogMapper, TEExamStudentLog> implements TEExamStudentLogService {
 public class TEExamStudentLogServiceImpl extends ServiceImpl<TEExamStudentLogMapper, TEExamStudentLog> implements TEExamStudentLogService {
 
 
-    /**
-     * 保存学生轨迹
-     *
-     * @param o
-     * @return
-     */
-    @Override
-    public boolean saveStudentLogInfo(Object... o) {
-        TEExamStudentLog teExamStudentLog = null;
-        if (Objects.nonNull(o) && o.length == 4) {
-            teExamStudentLog = new TEExamStudentLog(String.valueOf(o[0]), String.valueOf(o[1]), String.valueOf(o[2]), Long.parseLong(String.valueOf(o[3])));
-        } else if (Objects.nonNull(o) && o.length == 6) {
-            teExamStudentLog = new TEExamStudentLog(String.valueOf(o[0]), String.valueOf(o[1]), String.valueOf(o[2]), Long.parseLong(String.valueOf(o[3])), Long.parseLong(String.valueOf(o[4])), Long.parseLong(String.valueOf(o[5])));
-        }
-        this.save(teExamStudentLog);
-        return true;
-    }
 }
 }

+ 5 - 2
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEMobileServiceImpl.java

@@ -12,6 +12,7 @@ import com.qmth.themis.business.cache.bean.ExamStudentAnswerCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
 import com.qmth.themis.business.dto.AuthDto;
+import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.MqDtoService;
@@ -90,8 +91,10 @@ public class TEMobileServiceImpl implements TEMobileService {
         ret.setTime(System.currentTimeMillis());
         ret.setTime(System.currentTimeMillis());
         ret.setMode(mode);
         ret.setMode(mode);
         //mq发送消息start
         //mq发送消息start
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), platform.name(), tbSession, platform.name(), tbSession.getId(), es.getIdentity());
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.LOGIN, MqTagEnum.STUDENT.name(), es.getStudentId(), es.getIdentity());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), platform.name(), tbSession, MqTagEnum.valueOf(platform.name()), tbSession.getId(), es.getIdentity());
+        mqDtoService.assembleSendOneWayMsg(mqDto);
+        MqDto mqDtoLog = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.LOGIN, MqTagEnum.STUDENT, String.valueOf(es.getStudentId()), es.getIdentity());
+        mqDtoService.assembleSendOneWayMsg(mqDtoLog);
         //mq发送消息end
         //mq发送消息end
         //测试
         //测试
         String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);
         String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);

+ 0 - 16
themis-business/src/main/java/com/qmth/themis/business/service/impl/TEUserLogServiceImpl.java

@@ -19,21 +19,5 @@ import java.util.Objects;
  */
  */
 @Service
 @Service
 public class TEUserLogServiceImpl extends ServiceImpl<TEUserLogMapper, TEUserLog> implements TEUserLogService {
 public class TEUserLogServiceImpl extends ServiceImpl<TEUserLogMapper, TEUserLog> implements TEUserLogService {
-    private final static Logger log = LoggerFactory.getLogger(TEUserLogServiceImpl.class);
 
 
-    /**
-     * 保存用户轨迹
-     *
-     * @param o
-     * @return
-     */
-    @Override
-    public boolean saveUserLogInfo(Object... o) {
-        TEUserLog teUserLog = null;
-        if (Objects.nonNull(o) && o.length == 4) {
-            teUserLog = new TEUserLog(String.valueOf(o[0]), String.valueOf(o[1]), String.valueOf(o[2]), Long.parseLong(String.valueOf(o[3])));
-        }
-        this.save(teUserLog);
-        return true;
-    }
 }
 }

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

@@ -411,7 +411,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
         transMap.put("colValue", colValue);
         transMap.put("colValue", colValue);
         transMap.put("isDate", isDate);
         transMap.put("isDate", isDate);
         //mq发送消息start
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), transMap, MqTagEnum.EXAM_RECORD_UPDATE, recordId.toString(), colName);
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), transMap, MqTagEnum.EXAM_RECORD_UPDATE, recordId.toString(), colName);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
     }
 
 
@@ -431,7 +431,7 @@ public class TOeExamRecordServiceImpl extends ServiceImpl<TOeExamRecordMapper, T
     public void dataInitMq(Map<String, Object> param) {
     public void dataInitMq(Map<String, Object> param) {
         Long id = (Long) param.get("id");
         Long id = (Long) param.get("id");
         //mq发送消息start
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), param, MqTagEnum.EXAM_RECORD_INIT, id.toString(), id.toString());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), param, MqTagEnum.EXAM_RECORD_INIT, id.toString(), id.toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
     }
     }
 
 

+ 9 - 27
themis-exam/src/main/java/com/qmth/themis/exam/api/TEExamController.java

@@ -5,8 +5,6 @@ import com.qmth.themis.business.annotation.ApiJsonObject;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.annotation.ApiJsonProperty;
 import com.qmth.themis.business.bean.exam.*;
 import com.qmth.themis.business.bean.exam.*;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
-import com.qmth.themis.business.cache.bean.ExamCacheBean;
-import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.dto.WebsocketDto;
@@ -14,14 +12,16 @@ import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
 import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamResultDto;
 import com.qmth.themis.business.dto.response.TEExamResultDto;
 import com.qmth.themis.business.entity.TEExam;
 import com.qmth.themis.business.entity.TEExam;
-import com.qmth.themis.business.enums.*;
+import com.qmth.themis.business.enums.MqTagEnum;
+import com.qmth.themis.business.enums.MqTopicEnum;
+import com.qmth.themis.business.enums.SystemOperationEnum;
+import com.qmth.themis.business.enums.WebsocketTypeEnum;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.MqDtoService;
 import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEExamStudentService;
 import com.qmth.themis.business.service.TEExamStudentService;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.business.util.ServletUtil;
-import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.util.Result;
 import com.qmth.themis.common.util.Result;
@@ -126,31 +126,13 @@ public class TEExamController {
             }
             }
             ExamStartBean examStartBean = teExamService.start(teStudent.getId(), param.getRecordId());
             ExamStartBean examStartBean = teExamService.start(teStudent.getId(), param.getRecordId());
             if (Objects.nonNull(param.getReason())) {
             if (Objects.nonNull(param.getReason())) {
-                Long recordId = param.getRecordId();
-                Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                ExamCacheBean exam=teExamService.getExamCacheBean(examStudentCacheBean.getExamId());
-                Integer alreadyBreakCount=ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
-                Integer leftBreakResumeCount = exam.getBreakResumeCount()-alreadyBreakCount;
-                leftBreakResumeCount = leftBreakResumeCount <= 0 ? 0 : leftBreakResumeCount;
-                if (leftBreakResumeCount <= 0) {
-                    Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
-                    teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
-                } else {
-                	alreadyBreakCount++;
-                    ExamRecordCacheUtil.setLastBreakId(param.getRecordId(), Constants.idGen.next());
-                    ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.RESUME_PREPARE);
-                    ExamRecordCacheUtil.setLastBreakTime(recordId);
-                    ExamRecordCacheUtil.setAlreadyBreakCount(recordId, alreadyBreakCount);
-                    ExamRecordCacheUtil.setLastStartTime(recordId);
-                    //考试断点异常原因 发送mq start
-                    MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXCEPTION_LOG.name(), JacksonUtil.parseJson(param), MqTagEnum.EXCEPTION_LOG, String.valueOf(param.getRecordId()), param.getReason());
-                    mqDtoService.assembleSendOneWayMsg(mqDto);
-                    //考试断点异常原因 发送mq end
-                }
+                //考试断点异常原因 发送mq start
+                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXCEPTION_LOG.name(), JacksonUtil.parseJson(param), MqTagEnum.EXCEPTION_LOG, String.valueOf(param.getRecordId()), param.getReason());
+                mqDtoService.assembleSendOneWayMsg(mqDto);
+                //考试断点异常原因 发送mq end
             } else {
             } else {
                 //mq发送消息start
                 //mq发送消息start
-                MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.ANSWERING, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()), teStudent.getIdentity());
+                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.ANSWERING, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()), teStudent.getIdentity());
                 teExamService.sendOeLogMessage(SystemOperationEnum.ANSWERING, ExamRecordCacheUtil.getExamStudentId(param.getRecordId()), param.getRecordId(), mqDto);
                 teExamService.sendOeLogMessage(SystemOperationEnum.ANSWERING, ExamRecordCacheUtil.getExamStudentId(param.getRecordId()), param.getRecordId(), mqDto);
                 //mq发送消息end
                 //mq发送消息end
             }
             }

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TEFaceController.java

@@ -84,7 +84,7 @@ public class TEFaceController {
         transMap.put("time", param.getTime());
         transMap.put("time", param.getTime());
         transMap.put("exception", param.getException());
         transMap.put("exception", param.getException());
         //mq发送消息start
         //mq发送消息start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), transMap, MqTagEnum.FACE_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), transMap, MqTagEnum.FACE_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         return ResultUtil.ok(ret);
         return ResultUtil.ok(ret);
     }
     }

+ 1 - 1
themis-exam/src/main/java/com/qmth/themis/exam/api/TELivenessController.java

@@ -85,7 +85,7 @@ public class TELivenessController {
 		transMap.put("finishTime", param.getFinishTime());
 		transMap.put("finishTime", param.getFinishTime());
 		transMap.put("exception", param.getException());
 		transMap.put("exception", param.getException());
 		// mq发送消息start
 		// mq发送消息start
-		MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), transMap,
+		MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), transMap,
 				MqTagEnum.LIVENESS_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
 				MqTagEnum.LIVENESS_VERIFY_SAVE, param.getRecordId().toString(), param.getRecordId().toString());
 		mqDtoService.assembleSendOneWayMsg(mqDto);
 		mqDtoService.assembleSendOneWayMsg(mqDto);
 		return ResultUtil.ok(ret);
 		return ResultUtil.ok(ret);

+ 23 - 10
themis-exam/src/main/java/com/qmth/themis/exam/api/TEStudentController.java

@@ -14,6 +14,7 @@ import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.config.SystemConfig;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.AuthDto;
 import com.qmth.themis.business.dto.AuthDto;
+import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
 import com.qmth.themis.business.dto.cache.TEStudentCacheDto;
 import com.qmth.themis.business.dto.response.TEExamActivityDto;
 import com.qmth.themis.business.dto.response.TEExamActivityDto;
 import com.qmth.themis.business.dto.response.TEExamDto;
 import com.qmth.themis.business.dto.response.TEExamDto;
@@ -23,6 +24,7 @@ import com.qmth.themis.business.entity.TEConfig;
 import com.qmth.themis.business.entity.TEStudent;
 import com.qmth.themis.business.entity.TEStudent;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.service.*;
+import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.business.util.SessionUtil;
 import com.qmth.themis.business.util.SessionUtil;
@@ -185,8 +187,10 @@ public class TEStudentController {
         TBSession tbSession = new TBSession(sessionId, String.valueOf(teStudent.getId()), authDto.getRoleCodes().toString(), source, platform.name(), deviceId, ServletUtil.getRequest().getLocalAddr(), token, expire);
         TBSession tbSession = new TBSession(sessionId, String.valueOf(teStudent.getId()), authDto.getRoleCodes().toString(), source, platform.name(), deviceId, ServletUtil.getRequest().getLocalAddr(), token, expire);
         redisUtil.setUserSession(sessionId, tbSession, redisExpire);
         redisUtil.setUserSession(sessionId, tbSession, redisExpire);
         //mq发送消息start
         //mq发送消息start
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), platform.name(), tbSession, platform.name(), tbSession.getId(), teStudent.getIdentity());
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.LOGIN, MqTagEnum.STUDENT.name(), teStudent.getId(), teStudent.getIdentity());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), platform.name(), tbSession, MqTagEnum.valueOf(platform.name()), tbSession.getId(), teStudent.getIdentity());
+        mqDtoService.assembleSendOneWayMsg(mqDto);
+        MqDto mqDtoLog = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.LOGIN, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()), teStudent.getIdentity());
+        mqDtoService.assembleSendOneWayMsg(mqDtoLog);
         //mq发送消息end
         //mq发送消息end
         //测试
         //测试
         String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);
         String test = SignatureInfo.build(SignatureType.TOKEN, sessionId, token);
@@ -217,9 +221,9 @@ public class TEStudentController {
             //获取最近同步时间
             //获取最近同步时间
             Date clientLastSyncTime = ExamRecordCacheUtil.getClientLastSyncTime(recordId);
             Date clientLastSyncTime = ExamRecordCacheUtil.getClientLastSyncTime(recordId);
             //获取剩余断点次数
             //获取剩余断点次数
-            Integer alreadyBreakCount=ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
-            Integer leftBreakResumeCount = ec.getBreakResumeCount()-alreadyBreakCount;
-            
+            Integer alreadyBreakCount = ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
+            Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
+            leftBreakResumeCount = leftBreakResumeCount <= 0 ? 0 : leftBreakResumeCount;
             //如果断点时间大于整体断点时间,则强制交卷
             //如果断点时间大于整体断点时间,则强制交卷
             if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING) || Objects.equals(status, ExamRecordStatusEnum.BREAK_OFF) || Objects.equals(status, ExamRecordStatusEnum.RESUME_PREPARE)) {
             if (Objects.equals(status, ExamRecordStatusEnum.ANSWERING) || Objects.equals(status, ExamRecordStatusEnum.BREAK_OFF) || Objects.equals(status, ExamRecordStatusEnum.RESUME_PREPARE)) {
                 if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 > breakExpireSeconds) {
                 if (Objects.nonNull(clientLastSyncTime) && (System.currentTimeMillis() - clientLastSyncTime.getTime()) / 1000 > breakExpireSeconds) {
@@ -228,9 +232,7 @@ public class TEStudentController {
                     if (Objects.nonNull(list) && list.size() > 0) {
                     if (Objects.nonNull(list) && list.size() > 0) {
                         map.put("waiting", list);
                         map.put("waiting", list);
                     }
                     }
-                } else {//否则断点次数减1
-                    leftBreakResumeCount--;
-                    leftBreakResumeCount = leftBreakResumeCount <= 0 ? 0 : leftBreakResumeCount;
+                } else {
                     //如果断点次数为0,也强制交卷
                     //如果断点次数为0,也强制交卷
                     if (leftBreakResumeCount <= 0) {
                     if (leftBreakResumeCount <= 0) {
                         teExamService.finish(teStudentCacheDto.getId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
                         teExamService.finish(teStudentCacheDto.getId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
@@ -238,7 +240,17 @@ public class TEStudentController {
                         if (Objects.nonNull(list) && list.size() > 0) {
                         if (Objects.nonNull(list) && list.size() > 0) {
                             map.put("waiting", list);
                             map.put("waiting", list);
                         }
                         }
-                    } else {
+                    } else {//否则断点次数+1
+                        alreadyBreakCount++;
+                        ExamRecordCacheUtil.setLastBreakId(recordId, Constants.idGen.next());
+                        ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.RESUME_PREPARE);
+                        ExamRecordCacheUtil.setLastBreakTime(recordId);
+                        ExamRecordCacheUtil.setAlreadyBreakCount(recordId, alreadyBreakCount);
+                        ExamRecordCacheUtil.setLastStartTime(recordId);
+                        //考试断点异常原因 发送mq start
+                        MqDto mqDtoBreak = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), ExceptionEnum.NET_TIME_OUT, MqTagEnum.EXAM_BREAK, String.valueOf(recordId), String.valueOf(recordId));
+                        mqDtoService.assembleSendOneWayMsg(mqDtoBreak);
+                        //考试断点异常原因 发送mq end
                         ExamUnFinishBean examUnFinishBean = this.unFinishCommon(recordId, ec, examStudentCacheBean, examActivityCacheBean, examStudentId);
                         ExamUnFinishBean examUnFinishBean = this.unFinishCommon(recordId, ec, examStudentCacheBean, examActivityCacheBean, examStudentId);
                         map.put("unFinished", examUnFinishBean);
                         map.put("unFinished", examUnFinishBean);
                     }
                     }
@@ -286,7 +298,8 @@ public class TEStudentController {
             cacheService.removeStudentCache(teStudent.getId());
             cacheService.removeStudentCache(teStudent.getId());
         }
         }
         //mq发送消息start
         //mq发送消息start
-        mqDtoService.assembleSendOneWayMsg(MqTopicEnum.themisTopic.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.LOGOUT, MqTagEnum.STUDENT.name(), teStudent.getId(), teStudent.getIdentity());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.STUDENT.name(), SystemOperationEnum.LOGOUT, MqTagEnum.STUDENT, String.valueOf(teStudent.getId()), teStudent.getIdentity());
+        mqDtoService.assembleSendOneWayMsg(mqDto);
         //mq发送消息end
         //mq发送消息end
         return ResultUtil.ok(Collections.singletonMap("success", true));
         return ResultUtil.ok(Collections.singletonMap("success", true));
     }
     }

+ 4 - 4
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallMobileController.java

@@ -85,7 +85,7 @@ public class TIeInvigilateCallMobileController {
             ExamRecordCacheUtil.setMonitorLiveUrl(recordId, source.name(), liveUrl);
             ExamRecordCacheUtil.setMonitorLiveUrl(recordId, source.name(), liveUrl);
 
 
             //监考监控通话信息 发送mq start
             //监考监控通话信息 发送mq start
-            MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //监考监控通话信息 发送mq end
             //监考监控通话信息 发送mq end
         } catch (Exception e) {
         } catch (Exception e) {
@@ -136,7 +136,7 @@ public class TIeInvigilateCallMobileController {
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
 
 
         //监考监控通话信息 发送mq start
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
@@ -191,7 +191,7 @@ public class TIeInvigilateCallMobileController {
         }
         }
 
 
         //监考监控通话信息 发送mq start
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         //监考监控通话信息 发送mq end
 
 
@@ -246,7 +246,7 @@ public class TIeInvigilateCallMobileController {
         MonitorStatusSourceEnum status = ExamRecordCacheUtil.getMonitorStatus(recordId, source.name());
         MonitorStatusSourceEnum status = ExamRecordCacheUtil.getMonitorStatus(recordId, source.name());
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         //监考监控通话信息 发送mq start
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));

+ 4 - 4
themis-exam/src/main/java/com/qmth/themis/exam/api/TIeInvigilateCallOeController.java

@@ -77,7 +77,7 @@ public class TIeInvigilateCallOeController {
             ExamRecordCacheUtil.setMonitorStatus(recordId, source.name(), tIeExamInvigilateCallLog.getStatus());
             ExamRecordCacheUtil.setMonitorStatus(recordId, source.name(), tIeExamInvigilateCallLog.getStatus());
 
 
             //监考监控通话信息 发送mq start
             //监考监控通话信息 发送mq start
-            MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+            MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
             mqDtoService.assembleSendOneWayMsg(mqDto);
             mqDtoService.assembleSendOneWayMsg(mqDto);
             //监考监控通话信息 发送mq end
             //监考监控通话信息 发送mq end
         } catch (Exception e) {
         } catch (Exception e) {
@@ -132,7 +132,7 @@ public class TIeInvigilateCallOeController {
         }
         }
 
 
         //监考监控通话信息 发送mq start
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         //监考监控通话信息 发送mq end
         Map map = new HashMap();
         Map map = new HashMap();
@@ -174,7 +174,7 @@ public class TIeInvigilateCallOeController {
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.START);
 
 
         //监考监控通话信息 发送mq start
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
@@ -209,7 +209,7 @@ public class TIeInvigilateCallOeController {
         String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
         String monitorKey = ExamRecordCacheUtil.getMonitorKey(recordId);
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         TIeExamInvigilateCallLog tIeExamInvigilateCallLog = new TIeExamInvigilateCallLog(recordId, source, liveUrl, status, monitorKey, MonitorCallStatusSourceEnum.STOP);
         //监考监控通话信息 发送mq start
         //监考监控通话信息 发送mq start
-        MqDto mqDto = new MqDto(MqTopicEnum.themisTopic.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
+        MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.MONITOR_LOG.name(), tIeExamInvigilateCallLog, MqTagEnum.MONITOR_LOG, String.valueOf(tIeExamInvigilateCallLog.getId()), source.name());
         mqDtoService.assembleSendOneWayMsg(mqDto);
         mqDtoService.assembleSendOneWayMsg(mqDto);
         //监考监控通话信息 发送mq end
         //监考监控通话信息 发送mq end
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));
         return ResultUtil.ok(Collections.singletonMap("updateTime", System.currentTimeMillis()));

+ 9 - 0
themis-exam/src/main/java/com/qmth/themis/exam/listener/service/MqOeLogicService.java

@@ -28,4 +28,13 @@ public interface MqOeLogicService {
      * @param key
      * @param key
      */
      */
     public void execMqOeLogic(MqDto mqDto, String key) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException;
     public void execMqOeLogic(MqDto mqDto, String key) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException;
+
+    /**
+     * oe mobile 逻辑
+     *
+     * @param mqDto
+     * @param key
+     */
+    public void execMqOeMobileLogic(MqDto mqDto, String key);
+
 }
 }

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

@@ -7,6 +7,7 @@ import com.qmth.themis.business.cache.bean.ExamStudentCacheBean;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.dto.WebsocketDto;
+import com.qmth.themis.business.entity.TEExamStudentLog;
 import com.qmth.themis.business.entity.TIeExamInvigilateNotice;
 import com.qmth.themis.business.entity.TIeExamInvigilateNotice;
 import com.qmth.themis.business.entity.TMRocketMessage;
 import com.qmth.themis.business.entity.TMRocketMessage;
 import com.qmth.themis.business.enums.FinishTypeEnum;
 import com.qmth.themis.business.enums.FinishTypeEnum;
@@ -20,6 +21,7 @@ import com.qmth.themis.business.service.TMRocketMessageService;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.exam.listener.service.MqOeLogicService;
 import com.qmth.themis.exam.listener.service.MqOeLogicService;
+import com.qmth.themis.exam.websocket.WebSocketMobileServer;
 import com.qmth.themis.exam.websocket.WebSocketOeServer;
 import com.qmth.themis.exam.websocket.WebSocketOeServer;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -109,7 +111,8 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     map.put(SystemConstant.MESSAGE, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
                     map.put(SystemConstant.MESSAGE, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
                     WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_STOP_EXAM.name(), map);
                     WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_STOP_EXAM.name(), map);
                     webSocketOeServer.sendMessage(websocketDto);
                     webSocketOeServer.sendMessage(websocketDto);
-                    teExamStudentLogService.saveStudentLogInfo(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                    TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                    teExamStudentLogService.save(teExamStudentLog);
                 }
                 }
             });
             });
         } else if (tag.contains(MqTagEnum.OE_HARD_FINISH.name())) {//手动交卷
         } else if (tag.contains(MqTagEnum.OE_HARD_FINISH.name())) {//手动交卷
@@ -125,7 +128,8 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     map.put(SystemConstant.MESSAGE, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
                     map.put(SystemConstant.MESSAGE, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
                     WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.HAND_STOP_EXAM.name(), map);
                     WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.HAND_STOP_EXAM.name(), map);
                     webSocketOeServer.sendMessage(websocketDto);
                     webSocketOeServer.sendMessage(websocketDto);
-                    teExamStudentLogService.saveStudentLogInfo(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                    TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                    teExamStudentLogService.save(teExamStudentLog);
                 }
                 }
             });
             });
         } else if (tag.contains(MqTagEnum.OE_WARNING_FINISH.name())) {//预警交卷
         } else if (tag.contains(MqTagEnum.OE_WARNING_FINISH.name())) {//预警交卷
@@ -141,7 +145,8 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     map.put(SystemConstant.BREACH_STATUS, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
                     map.put(SystemConstant.BREACH_STATUS, FinishTypeEnum.valueOf(String.valueOf(mqDto.getProperties().get("type"))).getCode());
                     WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.BREACH_STOP_EXAM.name(), map);
                     WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.BREACH_STOP_EXAM.name(), map);
                     webSocketOeServer.sendMessage(websocketDto);
                     webSocketOeServer.sendMessage(websocketDto);
-                    teExamStudentLogService.saveStudentLogInfo(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                    TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                    teExamStudentLogService.save(teExamStudentLog);
                 }
                 }
             });
             });
         } else if (tag.contains(MqTagEnum.OE_IM_CLUSTERING.name())) {//点对点消息
         } else if (tag.contains(MqTagEnum.OE_IM_CLUSTERING.name())) {//点对点消息
@@ -176,7 +181,41 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                 map.put(SystemConstant.RECORD_ID, recordId);
                 map.put(SystemConstant.RECORD_ID, recordId);
                 WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_LIVENESS_VERIFY.name(), map);
                 WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.INVIGILATE_LIVENESS_VERIFY.name(), map);
                 webSocketOeServer.sendMessage(websocketDto);
                 webSocketOeServer.sendMessage(websocketDto);
-                teExamStudentLogService.saveStudentLogInfo(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                TEExamStudentLog teExamStudentLog = new TEExamStudentLog(mqDto.getType().name(), mqDto.getType().getCode(), mqDto.getType().getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+                teExamStudentLogService.save(teExamStudentLog);
+            }
+        }
+        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());
+    }
+
+    /**
+     * oe mobile逻辑
+     *
+     * @param mqDto
+     * @param key
+     * @throws ClassNotFoundException
+     * @throws IllegalAccessException
+     * @throws InstantiationException
+     * @throws NoSuchMethodException
+     * @throws InvocationTargetException
+     */
+    @Override
+    public void execMqOeMobileLogic(MqDto mqDto, String key) {
+        Gson gson = new Gson();
+        ConcurrentHashMap<Long, WebSocketMobileServer> webSocketMap = WebSocketMobileServer.getWebSocketMap();
+        String tag = mqDto.getTag();
+        if (tag.contains(MqTagEnum.EXAM_STOP.name())) {//考试暂停
+            Long recordId = Long.parseLong(String.valueOf(mqDto.getBody()));
+            if (Objects.nonNull(webSocketMap.get(recordId))) {
+                WebSocketMobileServer webSocketMobileServer = webSocketMap.get(recordId);
+                Map map = new HashMap<>();
+                map.put(SystemConstant.RECORD_ID, recordId);
+                WebsocketDto websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), map);
+                webSocketMobileServer.sendMessage(websocketDto);
             }
             }
         }
         }
         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);

+ 26 - 35
themis-exam/src/main/java/com/qmth/themis/exam/start/StartRunning.java

@@ -1,14 +1,5 @@
 package com.qmth.themis.exam.start;
 package com.qmth.themis.exam.start;
 
 
-import javax.annotation.Resource;
-
-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.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.enums.MqGroupEnum;
 import com.qmth.themis.business.enums.MqGroupEnum;
@@ -16,18 +7,15 @@ import com.qmth.themis.business.enums.MqTagEnum;
 import com.qmth.themis.business.enums.MqTopicEnum;
 import com.qmth.themis.business.enums.MqTopicEnum;
 import com.qmth.themis.exam.websocket.WebSocketOeServer;
 import com.qmth.themis.exam.websocket.WebSocketOeServer;
 import com.qmth.themis.mq.listener.RocketMessageConsumer;
 import com.qmth.themis.mq.listener.RocketMessageConsumer;
-import com.qmth.themis.mq.templete.impl.CalculateObjectiveScoreConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.ExamRecordInitConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.ExamRecordPersistedConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.ExamRecordUpdateConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.ExamStudentUpdateConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.FaceVerifyConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.LivenessVerifyConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.LogConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.SessionConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.TaskConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.UserLogConcurrentlyImpl;
-import com.qmth.themis.mq.templete.impl.WebsocketUnNormalConcurrentlyImpl;
+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 javax.annotation.Resource;
 
 
 /**
 /**
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
  * @Description: 服务启动时初始化运行,哪个微服务模块需要则拿此模版去用
@@ -52,46 +40,49 @@ public class StartRunning implements CommandLineRunner {
         /**
         /**
          * session
          * session
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.sessionConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.SESSION_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
         /**
         /**
          * userLog
          * userLog
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.userLogConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.USER_LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
         /**
         /**
          * task
          * task
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.taskConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.TASK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
         /**
         /**
          * log
          * log
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.logConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
         /**
         /**
          * websocket mq start
          * websocket mq start
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.websocketConsumerOeGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_HARD_FINISH.name() + "||" + MqTagEnum.OE_IM_BROADCASTING.name() + "||" + MqTagEnum.OE_IM_CLUSTERING.name() + "||" + MqTagEnum.OE_LIVENESS_VERIFY.name() + "||" + MqTagEnum.OE_MONITOR_FINISH.name() + "||" + MqTagEnum.OE_WARNING_FINISH.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketOeServer.class));
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.websocketConsumerDelayGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.WEBSOCKET_OE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_HARD_FINISH.name() + "||" + MqTagEnum.OE_IM_BROADCASTING.name() + "||" + MqTagEnum.OE_IM_CLUSTERING.name() + "||" + MqTagEnum.OE_LIVENESS_VERIFY.name() + "||" + MqTagEnum.OE_MONITOR_FINISH.name() + "||" + MqTagEnum.OE_WARNING_FINISH.name() + "||" + MqTagEnum.EXAM_STOP.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketOeServer.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.WEBSOCKET_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
         /**
         /**
          * websocket mq end
          * websocket mq end
          */
          */
         //计算客观分
         //计算客观分
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.calculateObjectiveScoreGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.CALCULATE_OBJECTIVE_SCORE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
 
 
         //人脸验证保存
         //人脸验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.faceVerifySaveGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.FACE_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
 
 
         //活体验证保存
         //活体验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.livenessVerifySaveGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LivenessVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LIVENESS_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.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.EXAM_RECORD_PERSISTED_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
 
 
         //考试记录数据更新
         //考试记录数据更新
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordUpdateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
         //考试记录数据初始化
         //考试记录数据初始化
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordInitGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
-        
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_INIT_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
+
         //考生数据更新
         //考生数据更新
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examStudentUpdateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamStudentUpdateConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_STUDENT_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamStudentUpdateConcurrentlyImpl.class));
+
+        //考试断点
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
         SystemConstant.initTempFiles();
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
         log.info("服务器启动时执行 end");
     }
     }

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

@@ -5,6 +5,7 @@ import com.google.gson.Gson;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.entity.TBSession;
 import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
 import com.qmth.themis.business.enums.MonitorStatusSourceEnum;
@@ -13,11 +14,17 @@ import com.qmth.themis.business.enums.WebsocketTypeEnum;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.JacksonUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.WebsocketUtil;
 import com.qmth.themis.business.util.WebsocketUtil;
+import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.common.signature.SignatureInfo;
 import com.qmth.themis.common.signature.SignatureInfo;
 import com.qmth.themis.common.signature.SignatureType;
 import com.qmth.themis.common.signature.SignatureType;
+import com.qmth.themis.exam.listener.service.MqOeLogicService;
 import com.qmth.themis.exam.websocketTemplete.WebSocketMobileMessageTemplete;
 import com.qmth.themis.exam.websocketTemplete.WebSocketMobileMessageTemplete;
+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.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -42,7 +49,7 @@ import java.util.concurrent.ConcurrentHashMap;
  */
  */
 @ServerEndpoint("/mobile")
 @ServerEndpoint("/mobile")
 @Component
 @Component
-public class WebSocketMobileServer {
+public class WebSocketMobileServer implements Concurrently {
     private final static Logger log = LoggerFactory.getLogger(WebSocketMobileServer.class);
     private final static Logger log = LoggerFactory.getLogger(WebSocketMobileServer.class);
     private volatile static ConcurrentHashMap<Long, WebSocketMobileServer> webSocketMap = new ConcurrentHashMap<>();
     private volatile static ConcurrentHashMap<Long, WebSocketMobileServer> webSocketMap = new ConcurrentHashMap<>();
     /**
     /**
@@ -253,5 +260,41 @@ public class WebSocketMobileServer {
     public Long getRecordId() {
     public Long getRecordId() {
         return recordId;
         return recordId;
     }
     }
+
+    @Override
+    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
+        RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+        MqOeLogicService mqOeLogicService = SpringContextHolder.getBean(MqOeLogicService.class);
+        MqDto mqDto = null;
+        try {
+            long threadId = Thread.currentThread().getId();
+            String threadName = Thread.currentThread().getName();
+            for (MessageExt messageExt : msgs) {
+                log.info(":{}-:{} websocket oe Consumer重试次数:{}", threadId, threadName, messageExt.getReconsumeTimes());
+                mqDto = JacksonUtil.readJson(new String(messageExt.getBody(), Constants.CHARSET), MqDto.class);
+                log.info(":{}-:{} websocket oe Consumer接收到的消息:{}", threadId, threadName, JacksonUtil.parseJson(mqDto));
+                int reconsumeTime = messageExt.getReconsumeTimes();
+                if (reconsumeTime >= SystemConstant.MAXRECONSUMETIMES) {
+                    mqOeLogicService.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)) {
+                        mqOeLogicService.execMqOeLogic(mqDto, SystemConstant.MQ_TOPIC_BUFFER_LIST);
+                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+                    } else {
+                        log.info(":{}-:{} 消息ack未确认,重发", threadId, threadName);
+                        return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("mq websocket oe,消息消费出错", e);
+            return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
+        } finally {
+            if (Objects.nonNull(mqDto)) {
+                redisUtil.releaseLock(SystemConstant.REDIS_LOCK_MQ_PREFIX + mqDto.getId());
+            }
+        }
+        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//成功
+    }
 }
 }
 
 

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

@@ -162,7 +162,7 @@ public class WebSocketOeServer implements Concurrently {
 //                dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
 //                dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
                 tranMap.put("timeOut", time);
                 tranMap.put("timeOut", time);
                 tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
                 tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-                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);
+                MqDto mqDto = new MqDto(MqTopicEnum.THEMIS_TOPIC.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);
                 mqDtoService.assembleSendAsyncDelayMsg(mqDto);
                 //发送延时mq消息end
                 //发送延时mq消息end
             }
             }

+ 20 - 12
themis-mq/src/main/java/com/qmth/themis/mq/service/MqLogicService.java

@@ -107,16 +107,24 @@ public interface MqLogicService {
      */
      */
     public void execMqLogLogic(MqDto mqDto, String key);
     public void execMqLogLogic(MqDto mqDto, String key);
 
 
-	/**
-	 * 重新算分
-	 *
-	 * @param mqDto
-	 * @param key
-	 */
-	void execMqCalculateScoreLogic(MqDto mqDto, String key);
-
-	/**
-	 *更新考生信息
-	 */
-	void execMqExamStudentUpdateLogic(MqDto mqDto, String key);
+    /**
+     * 重新算分
+     *
+     * @param mqDto
+     * @param key
+     */
+    void execMqCalculateScoreLogic(MqDto mqDto, String key);
+
+    /**
+     * 更新考生信息
+     */
+    void execMqExamStudentUpdateLogic(MqDto mqDto, String key);
+
+    /**
+     * 考试断点
+     *
+     * @param mqDto
+     * @param key
+     */
+    void execMqExamBreakLogic(MqDto mqDto, String key);
 }
 }

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

@@ -2,7 +2,6 @@ package com.qmth.themis.mq.service.impl;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.google.gson.Gson;
 import com.google.gson.Gson;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.ExamRecordCacheUtil;
 import com.qmth.themis.business.cache.RedisKeyHelper;
 import com.qmth.themis.business.cache.RedisKeyHelper;
@@ -11,6 +10,7 @@ import com.qmth.themis.business.constant.SpringContextHolder;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.MqDto;
 import com.qmth.themis.business.dto.WarningDto;
 import com.qmth.themis.business.dto.WarningDto;
+import com.qmth.themis.business.dto.WebsocketDto;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.entity.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.enums.*;
 import com.qmth.themis.business.service.*;
 import com.qmth.themis.business.service.*;
@@ -34,6 +34,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.*;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 
 /**
 /**
  * @Description: mq执行逻辑 impl
  * @Description: mq执行逻辑 impl
@@ -97,6 +98,9 @@ public class MqLogicServiceImpl implements MqLogicService {
     @Resource
     @Resource
     WarningService warningService;
     WarningService warningService;
 
 
+    @Resource
+    MqDtoService mqDtoService;
+
     /**
     /**
      * mq最大重试次数逻辑
      * mq最大重试次数逻辑
      *
      *
@@ -127,13 +131,16 @@ public class MqLogicServiceImpl implements MqLogicService {
         Gson gson = new Gson();
         Gson gson = new Gson();
         String tag = mqDto.getTag();
         String tag = mqDto.getTag();
         if (tag.contains(MqTagEnum.USER.name())) {
         if (tag.contains(MqTagEnum.USER.name())) {
-            teUserLogService.saveUserLogInfo(String.valueOf(mqDto.getBody()), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), mqDto.getObjId());
+            TEUserLog teUserLog = new TEUserLog(String.valueOf(mqDto.getBody()), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), Long.parseLong(String.valueOf(mqDto.getObjId())));
+            teUserLogService.save(teUserLog);
         } else if (tag.contains(MqTagEnum.STUDENT.name())) {
         } else if (tag.contains(MqTagEnum.STUDENT.name())) {
+            TEExamStudentLog teExamStudentLog = null;
             if (Objects.nonNull(mqDto.getProperties())) {
             if (Objects.nonNull(mqDto.getProperties())) {
-                teExamStudentLogService.saveStudentLogInfo(String.valueOf(mqDto.getBody()), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), mqDto.getProperties().get("remark"), mqDto.getObjId(), mqDto.getProperties().get("examStudentId"), mqDto.getProperties().get("examRecordId"));
+                teExamStudentLog = new TEExamStudentLog(String.valueOf(mqDto.getBody()), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), String.valueOf(mqDto.getProperties().get("remark")), Long.parseLong(String.valueOf(mqDto.getObjId())), Long.parseLong(String.valueOf(mqDto.getProperties().get("examStudentId"))), Long.parseLong(String.valueOf(mqDto.getProperties().get("examRecordId"))));
             } else {
             } else {
-                teExamStudentLogService.saveStudentLogInfo(String.valueOf(mqDto.getBody()), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), mqDto.getObjId());
+                teExamStudentLog = new TEExamStudentLog(String.valueOf(mqDto.getBody()), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), Long.parseLong(String.valueOf(mqDto.getObjId())));
             }
             }
+            teExamStudentLogService.save(teExamStudentLog);
         }
         }
         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
         mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
@@ -232,12 +239,20 @@ public class MqLogicServiceImpl implements MqLogicService {
                     ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.BREAK_OFF);
                     ExamRecordCacheUtil.setStatus(recordId, ExamRecordStatusEnum.BREAK_OFF);
                 }
                 }
             }
             }
+            //发送考试暂停mq消息 start
+            MqDto mqDtoExamStop = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STOP.name(), recordId, MqTagEnum.EXAM_STOP, String.valueOf(recordId), String.valueOf(recordId));
+            mqDtoService.assembleSendOneWayMsg(mqDtoExamStop);
+            //发送考试暂停mq消息 end
+
             //增加异常日志
             //增加异常日志
             Long examId = ExamRecordCacheUtil.getExamId(recordId);
             Long examId = ExamRecordCacheUtil.getExamId(recordId);
             Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
             Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
             Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
             Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+            ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
             TIeInvigilateExceptionInfo tIeInvigilateExceptionInfo = new TIeInvigilateExceptionInfo(examId, examActivityId, recordId, examStudentId, ExceptionEnum.NET_TIME_OUT.getCode(), ExceptionEnum.NET_TIME_OUT, diff);
             TIeInvigilateExceptionInfo tIeInvigilateExceptionInfo = new TIeInvigilateExceptionInfo(examId, examActivityId, recordId, examStudentId, ExceptionEnum.NET_TIME_OUT.getCode(), ExceptionEnum.NET_TIME_OUT, diff);
             tIeInvigilateExceptionInfoService.saveOrUpdate(tIeInvigilateExceptionInfo);
             tIeInvigilateExceptionInfoService.saveOrUpdate(tIeInvigilateExceptionInfo);
+            TEExamStudentLog teExamStudentLog = new TEExamStudentLog(SystemOperationEnum.BREAK_OFF.name(), SystemOperationEnum.BREAK_OFF.getCode(), SystemOperationEnum.BREAK_OFF.getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
+            teExamStudentLogService.save(teExamStudentLog);
         }
         }
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
         Map map = new HashMap();
         Map map = new HashMap();
@@ -365,6 +380,7 @@ public class MqLogicServiceImpl implements MqLogicService {
      * @param key
      * @param key
      */
      */
     @Override
     @Override
+    @Transactional
     public void execMqExamRecordPersistedLogic(MqDto mqDto, String key) {
     public void execMqExamRecordPersistedLogic(MqDto mqDto, String key) {
         Gson gson = new Gson();
         Gson gson = new Gson();
         Map<String, Object> param = (Map<String, Object>) mqDto.getBody();
         Map<String, Object> param = (Map<String, Object>) mqDto.getBody();
@@ -475,22 +491,6 @@ public class MqLogicServiceImpl implements MqLogicService {
             Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
             Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
             ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
             ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
 
 
-            //先查询之前的断点记录
-            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(ExamRecordCacheUtil.getLastBreakId(recordId), recordId, new Date(), exceptionEnum, exceptionEnum.name());
-            tOeExamBreakHistoryService.save(tOeExamBreakHistory);
-            redisUtil.setForHash(RedisKeyHelper.examBreakCacheKey(tOeExamBreakHistory.getId()), SimpleBeanUtil.objectToMap(tOeExamBreakHistory));
-            teExamStudentLogService.saveStudentLogInfo(SystemOperationEnum.RESUME_PREPARE.name(), SystemOperationEnum.RESUME_PREPARE.getCode(), SystemOperationEnum.RESUME_PREPARE.getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId);
-
             //增加异常日志
             //增加异常日志
             Long examId = ExamRecordCacheUtil.getExamId(recordId);
             Long examId = ExamRecordCacheUtil.getExamId(recordId);
             Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
             Long examActivityId = ExamRecordCacheUtil.getExamActivityId(recordId);
@@ -530,9 +530,9 @@ public class MqLogicServiceImpl implements MqLogicService {
         tmRocketMessageService.saveOrUpdate(tmRocketMessage);
         tmRocketMessageService.saveOrUpdate(tmRocketMessage);
         redisUtil.delete(key, mqDto.getId());
         redisUtil.delete(key, mqDto.getId());
     }
     }
-    
+
     /**
     /**
-     *更新考生信息
+     * 更新考生信息
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
@@ -546,4 +546,39 @@ public class MqLogicServiceImpl implements MqLogicService {
         tmRocketMessageService.saveOrUpdate(tmRocketMessage);
         tmRocketMessageService.saveOrUpdate(tmRocketMessage);
         redisUtil.delete(key, mqDto.getId());
         redisUtil.delete(key, mqDto.getId());
     }
     }
+
+    /**
+     * 考试断点
+     *
+     * @param mqDto
+     * @param key
+     */
+    @Override
+    @Transactional
+    public void execMqExamBreakLogic(MqDto mqDto, String key) {
+        ExceptionEnum exceptionEnum = ExceptionEnum.valueOf(String.valueOf(mqDto.getBody()));
+        Long recordId = Long.parseLong(mqDto.getObjId());
+
+        //先查询之前的断点记录
+        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(ExamRecordCacheUtil.getLastBreakId(recordId), recordId, new Date(), exceptionEnum, exceptionEnum.name());
+        tOeExamBreakHistoryService.save(tOeExamBreakHistory);
+        redisUtil.setForHash(RedisKeyHelper.examBreakCacheKey(tOeExamBreakHistory.getId()), SimpleBeanUtil.objectToMap(tOeExamBreakHistory));
+
+        Gson gson = new Gson();
+        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());
+    }
 }
 }

+ 76 - 0
themis-mq/src/main/java/com/qmth/themis/mq/templete/impl/ExamBreakConcurrentlyImpl.java

@@ -0,0 +1,76 @@
+package com.qmth.themis.mq.templete.impl;
+
+import com.qmth.themis.business.constant.SystemConstant;
+import com.qmth.themis.business.dto.MqDto;
+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.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 javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+
+/**
+* @Description: 考试断点
+* @Param:
+* @return:
+* @Author: wangliang
+* @Date: 2020/9/17
+*/
+@Service
+public class ExamBreakConcurrentlyImpl implements Concurrently {
+    private final static Logger log = LoggerFactory.getLogger(ExamBreakConcurrentlyImpl.class);
+
+    @Resource
+    RedisUtil redisUtil;
+    @Resource
+    MqLogicService mqLogicService;
+
+    @Override
+    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
+        MqDto mqDto = null;
+        try {
+            long threadId = Thread.currentThread().getId();
+            String threadName = Thread.currentThread().getName();
+            for (MessageExt messageExt : msgs) {
+                log.debug(":{}-:{} exam break 重试次数:{}", threadId, threadName,
+                        messageExt.getReconsumeTimes());
+                mqDto = JacksonUtil.readJson(new String(messageExt.getBody(), Constants.CHARSET), MqDto.class);
+                log.debug(":{}-:{} exam break 接收到的消息:{}", 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.debug(":{}-:{} 更新db", threadId, threadName);
+                        mqLogicService.execMqExamBreakLogic(mqDto, SystemConstant.MQ_TOPIC_BUFFER_LIST);
+                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
+                    } else {
+                        log.debug(":{}-:{} 消息ack未确认,重发", threadId, threadName);
+                        return ConsumeConcurrentlyStatus.RECONSUME_LATER;// 重试
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("mq 考试断点数据,消息消费出错", e);
+            return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
+        } finally {
+            if (Objects.nonNull(mqDto)) {
+                redisUtil.releaseLock(SystemConstant.REDIS_LOCK_MQ_PREFIX + mqDto.getId());
+            }
+        }
+        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;// 成功
+    }
+}

+ 3 - 3
themis-task/src/main/java/com/qmth/themis/task/enums/QuartzTaskEnum.java

@@ -9,11 +9,11 @@ package com.qmth.themis.task.enums;
  */
  */
 public enum QuartzTaskEnum {
 public enum QuartzTaskEnum {
 
 
-    mqJobName("mqjob"),
+    MQ_JOB_NAME("mqjob"),
 
 
-    mqJobGroupName("mqjob group"),
+    MQ_JOB_GROUP_NAME("mqjob group"),
 
 
-    examActivityJobGroupName("考场一次性延时job group");
+    EXAM_ACTIVITY_JOB_GROUP_NAME("考场一次性延时job group");
 
 
     private QuartzTaskEnum(String code) {
     private QuartzTaskEnum(String code) {
         this.code = code;
         this.code = code;

+ 3 - 3
themis-task/src/main/java/com/qmth/themis/task/listener/service/impl/MqTaskLogicServiceImpl.java

@@ -77,7 +77,7 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
         for (int i = 0; i < jsonArray.size(); i++) {
         for (int i = 0; i < jsonArray.size(); i++) {
             TEExamActivity teExamActivity = JSONObject.toJavaObject((JSON) jsonArray.get(i), TEExamActivity.class);
             TEExamActivity teExamActivity = JSONObject.toJavaObject((JSON) jsonArray.get(i), TEExamActivity.class);
             if (Objects.equals("delete", oper)) {
             if (Objects.equals("delete", oper)) {
-                quartzService.deleteJob(teExamActivity.getCode(), QuartzTaskEnum.examActivityJobGroupName.name());
+                quartzService.deleteJob(teExamActivity.getCode(), QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name());
             } else {
             } else {
 //                Integer forceFinish = teExam.getForceFinish();
 //                Integer forceFinish = teExam.getForceFinish();
                 Date startTime = teExamActivity.getStartTime();
                 Date startTime = teExamActivity.getStartTime();
@@ -108,8 +108,8 @@ public class MqTaskLogicServiceImpl implements MqTaskLogicService {
                         //执行一次性延时任务
                         //执行一次性延时任务
                         Map mapJob = new HashMap();
                         Map mapJob = new HashMap();
                         mapJob.put("name", activityCode);
                         mapJob.put("name", activityCode);
-                        quartzService.deleteJob(activityCode, QuartzTaskEnum.examActivityJobGroupName.name());
-                        quartzService.addJob(ExamActivityJob.class, activityCode, QuartzTaskEnum.examActivityJobGroupName.name(), cron, mapJob);
+                        quartzService.deleteJob(activityCode, QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name());
+                        quartzService.addJob(ExamActivityJob.class, activityCode, QuartzTaskEnum.EXAM_ACTIVITY_JOB_GROUP_NAME.name(), cron, mapJob);
                     }
                     }
 //                }
 //                }
             }
             }

+ 21 - 14
themis-task/src/main/java/com/qmth/themis/task/start/StartRunning.java

@@ -48,56 +48,63 @@ public class StartRunning implements CommandLineRunner {
         log.info("增加mqjob start");
         log.info("增加mqjob start");
         Map mqMap = new HashMap();
         Map mqMap = new HashMap();
         mqMap.put("name", MqJob.class.getName());
         mqMap.put("name", MqJob.class.getName());
-        quartzService.deleteJob(QuartzTaskEnum.mqJobName.name(), QuartzTaskEnum.mqJobGroupName.name());
-        quartzService.addJob(MqJob.class, QuartzTaskEnum.mqJobName.name(), QuartzTaskEnum.mqJobGroupName.name(), "0 0/2 * * * ?", mqMap);
+        quartzService.deleteJob(QuartzTaskEnum.MQ_JOB_NAME.name(), QuartzTaskEnum.MQ_JOB_GROUP_NAME.name());
+        quartzService.addJob(MqJob.class, QuartzTaskEnum.MQ_JOB_NAME.name(), QuartzTaskEnum.MQ_JOB_GROUP_NAME.name(), "0 0/2 * * * ?", mqMap);
         log.info("增加mqjob end");
         log.info("增加mqjob end");
 
 
         /**
         /**
          * session
          * session
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.sessionConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.SESSION_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.WEB.name() + "||" + MqTagEnum.WIN.name() + "||" + MqTagEnum.MAC.name() + "||" + MqTagEnum.WXAPP.name() + "||" + MqTagEnum.IOS.name() + "||" + MqTagEnum.ANDROID.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(SessionConcurrentlyImpl.class));
         /**
         /**
          * userLog
          * userLog
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.userLogConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.USER_LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.USER.name() + "||" + MqTagEnum.STUDENT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(UserLogConcurrentlyImpl.class));
         /**
         /**
          * task
          * task
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.taskConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.TASK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDENT_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_IMPORT.name() + "||" + MqTagEnum.ROOM_CODE_EXPORT.name() + "||" + MqTagEnum.EXAM_PAPER_IMPORT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(TaskConcurrentlyImpl.class));
         /**
         /**
          * log
          * log
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.logConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LOG_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXCEPTION_LOG.name() + "||" + MqTagEnum.WARNING_LOG.name() + "||" + MqTagEnum.MONITOR_LOG.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LogConcurrentlyImpl.class));
         /**
         /**
          * websocket mq start
          * websocket mq start
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.websocketConsumerDelayGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.WEBSOCKET_DELAY_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.OE_UN_NORMAL.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebsocketUnNormalConcurrentlyImpl.class));
         /**
         /**
          * websocket mq end
          * websocket mq end
          */
          */
         /**
         /**
          * quartz mq start
          * quartz mq start
          */
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.quartzConsumerGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(QuartzOrderlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.QUARTZ_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_ACTIVITY.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(QuartzOrderlyImpl.class));
         /**
         /**
          * quartz mq end
          * quartz mq end
          */
          */
         //计算客观分
         //计算客观分
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.calculateObjectiveScoreGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.CALCULATE_OBJECTIVE_SCORE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.CALCULATE_OBJECTIVE_SCORE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(CalculateObjectiveScoreConcurrentlyImpl.class));
 
 
         //人脸验证保存
         //人脸验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.faceVerifySaveGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.FACE_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.FACE_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(FaceVerifyConcurrentlyImpl.class));
 
 
         //活体验证保存
         //活体验证保存
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.livenessVerifySaveGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.LIVENESS_VERIFY_SAVE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(LivenessVerifyConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.LIVENESS_VERIFY_SAVE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.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.EXAM_RECORD_PERSISTED_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_PERSISTED.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordPersistedConcurrentlyImpl.class));
 
 
         //考试记录数据更新
         //考试记录数据更新
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordUpdateGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordUpdateConcurrentlyImpl.class));
+
         //考试记录数据初始化
         //考试记录数据初始化
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.examRecordInitGroup.getCode(), MqTopicEnum.themisTopic.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_RECORD_INIT_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_RECORD_INIT.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamRecordInitConcurrentlyImpl.class));
+
+        //考生数据更新
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_STUDENT_UPDATE_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_STUDNET_UPDATE.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamStudentUpdateConcurrentlyImpl.class));
+
+        //考试断点
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, MqGroupEnum.EXAM_BREAK_GROUP.getCode(), MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(ExamBreakConcurrentlyImpl.class));
         SystemConstant.initTempFiles();
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
         log.info("服务器启动时执行 end");
     }
     }