Explorar el Código

Merge branch 'dev'
11

wangliang hace 4 años
padre
commit
e08ea1e66a

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

@@ -102,11 +102,11 @@ public class WebSocketMobileServer implements Concurrently {
             } else {
                 if (info.validate(tbSession.getAccessToken()) && info.getTimestamp() < tbSession.getExpireTime().getTime()
                         && platform.equalsIgnoreCase(tbSession.getPlatform()) && Objects.equals(deviceId, tbSession.getDeviceId())) {
-                    ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(this.recordId);
-                    if (Objects.nonNull(status) && Objects.equals(ExamRecordStatusEnum.BREAK_OFF, status)) {//如果是已中断状态,则给客户端和移动端发送考试停止的消息
-                        ExamConstant.sendExamStopMsg(recordId);
-                        throw new BusinessException("考试已中断,请重新登录");
-                    } else {
+//                    ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(this.recordId);
+//                    if (Objects.nonNull(status) && Objects.equals(ExamRecordStatusEnum.BREAK_OFF, status)) {//如果是已中断状态,则给客户端和移动端发送考试停止的消息
+//                        ExamConstant.sendExamStopMsg(recordId);
+//                        throw new BusinessException("考试已中断,请重新登录");
+//                    } else {
                         this.session = session;
                         session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
                         this.sessionId = tbSession.getId();
@@ -131,7 +131,7 @@ public class WebSocketMobileServer implements Concurrently {
                         tranMap.put("ip", this.ip);
                         this.updateTime = System.currentTimeMillis();
                         tranMap.put("updateTime", this.updateTime);
-                    }
+//                    }
                 } else {
                     throw new BusinessException(ExceptionResultEnum.AUTHORIZATION_ERROR);
                 }

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

@@ -103,46 +103,46 @@ public class WebSocketOeServer implements Concurrently {
                 if (info.validate(tbSession.getAccessToken()) && info.getTimestamp() < tbSession.getExpireTime().getTime()
                         && platform.equalsIgnoreCase(tbSession.getPlatform()) && Objects.equals(deviceId, tbSession.getDeviceId())) {
                     ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(this.recordId);
-                    if (Objects.nonNull(status) && Objects.equals(ExamRecordStatusEnum.BREAK_OFF, status)) {//如果是已中断状态,则给客户端和移动端发送考试停止的消息
-                        ExamConstant.sendExamStopMsg(recordId);
-                        throw new BusinessException("考试已中断,请重新登录");
+//                    if (Objects.nonNull(status) && Objects.equals(ExamRecordStatusEnum.BREAK_OFF, status)) {//如果是已中断状态,则给客户端和移动端发送考试停止的消息
+//                        ExamConstant.sendExamStopMsg(recordId);
+//                        throw new BusinessException("考试已中断,请重新登录");
+//                    } else {
+                    this.session = session;
+                    session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
+                    this.sessionId = tbSession.getId();
+                    if (webSocketMap.containsKey(this.recordId)) {
+                        webSocketMap.remove(this.recordId);
+                        webSocketMap.put(this.recordId, this);
+                        //加入set中
                     } else {
-                        this.session = session;
-                        session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
-                        this.sessionId = tbSession.getId();
-                        if (webSocketMap.containsKey(this.recordId)) {
-                            webSocketMap.remove(this.recordId);
-                            webSocketMap.put(this.recordId, this);
-                            //加入set中
-                        } else {
-                            webSocketMap.put(this.recordId, this);
-                            //加入set中
-                            addOnlineCount();
-                            //在线数加1
-                        }
-                        log.info("用户连接:" + this.sessionId + ",当前在线人数为:" + getOnlineCount());
-                        InetSocketAddress addr = (InetSocketAddress) WebsocketUtil.getFieldInstance(this.session.getAsyncRemote(), "base#socketWrapper#socket#sc#remoteAddress");
-                        this.ip = addr.toString().replace("/", "").split(":")[0];
-//                    this.sendMessage("ip[" + this.ip + "]连接成功");
-                        log.info("ip[:{}]连接成功", this.ip);
-                        if (!Objects.equals(ExamRecordStatusEnum.PERSISTED, status) || !Objects.equals(ExamRecordStatusEnum.FINISHED, status)) {
-                            ExamRecordCacheUtil.setClientWebsocketStatus(recordId, WebsocketStatusEnum.ON_LINE, false);
-                            ExamRecordCacheUtil.setClientCurrentIp(recordId, this.ip, false);
-                            ExamRecordCacheUtil.setClientWebsocketId(recordId, this.session.getId(), false);
-                            Date clientLastSyncTime = new Date();
-                            ExamRecordCacheUtil.setClientLastSyncTime(recordId, clientLastSyncTime, false);
-                            String[] columns = new String[]{ExamRecordFieldEnum.client_websocket_status.name(), ExamRecordFieldEnum.client_current_ip.name(), ExamRecordFieldEnum.client_websocket_id.name(), ExamRecordFieldEnum.client_last_sync_time.name()};
-                            Object[] values = new Object[]{WebsocketStatusEnum.ON_LINE, this.ip, this.session.getId(), clientLastSyncTime};
-                            TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
-                            tOeExamRecordService.dataUpdatesMq(recordId, columns, values);
-                        }
-                        tranMap = new HashMap<>();
-                        tranMap.put("recordId", this.recordId);
-                        tranMap.put("deviceId", this.deviceId);
-                        tranMap.put("ip", this.ip);
-                        this.updateTime = System.currentTimeMillis();
-                        tranMap.put("updateTime", this.updateTime);
+                        webSocketMap.put(this.recordId, this);
+                        //加入set中
+                        addOnlineCount();
+                        //在线数加1
                     }
+                    log.info("用户连接:" + this.sessionId + ",当前在线人数为:" + getOnlineCount());
+                    InetSocketAddress addr = (InetSocketAddress) WebsocketUtil.getFieldInstance(this.session.getAsyncRemote(), "base#socketWrapper#socket#sc#remoteAddress");
+                    this.ip = addr.toString().replace("/", "").split(":")[0];
+//                    this.sendMessage("ip[" + this.ip + "]连接成功");
+                    log.info("ip[:{}]连接成功", this.ip);
+//                    if (!Objects.equals(ExamRecordStatusEnum.FINISHED, status)) {
+                        ExamRecordCacheUtil.setClientWebsocketStatus(recordId, WebsocketStatusEnum.ON_LINE, false);
+                        ExamRecordCacheUtil.setClientCurrentIp(recordId, this.ip, false);
+                        ExamRecordCacheUtil.setClientWebsocketId(recordId, this.session.getId(), false);
+                        Date clientLastSyncTime = new Date();
+                        ExamRecordCacheUtil.setClientLastSyncTime(recordId, clientLastSyncTime, false);
+                        String[] columns = new String[]{ExamRecordFieldEnum.client_websocket_status.name(), ExamRecordFieldEnum.client_current_ip.name(), ExamRecordFieldEnum.client_websocket_id.name(), ExamRecordFieldEnum.client_last_sync_time.name()};
+                        Object[] values = new Object[]{WebsocketStatusEnum.ON_LINE, this.ip, this.session.getId(), clientLastSyncTime};
+                        TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
+                        tOeExamRecordService.dataUpdatesMq(recordId, columns, values);
+//                    }
+                    tranMap = new HashMap<>();
+                    tranMap.put("recordId", this.recordId);
+                    tranMap.put("deviceId", this.deviceId);
+                    tranMap.put("ip", this.ip);
+                    this.updateTime = System.currentTimeMillis();
+                    tranMap.put("updateTime", this.updateTime);
+//                    }
                 } else {
                     throw new BusinessException(ExceptionResultEnum.AUTHORIZATION_ERROR);
                 }
@@ -165,56 +165,59 @@ public class WebSocketOeServer implements Concurrently {
             //判断是否是正常退出
             Date now = new Date();
             ExamRecordCacheUtil.setClientWebsocketStatus(recordId, WebsocketStatusEnum.OFF_LINE, true);
-            //大于等于超时时间,说明规定时间内都没有通信,非正常退出,因为期间会有心跳更新updateTime
-            if ((now.getTime() - this.updateTime) / 1000 >= SystemConstant.WEBSOCKET_MAX_TIME_OUT / 1000) {
-                log.info("超时退出");
-                //发送延时mq消息start
-                MqDtoService mqDtoService = SpringContextHolder.getBean(MqDtoService.class);
-                String level = "2m";
-//                String level = "30s";
-                Integer time = SystemConstant.mqDelayLevel.get(level);
-                LocalDateTime dt = LocalDateTime.now();
-                dt = dt.plusMinutes(Long.parseLong(level.replace("m", "")));
-//                dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
-                tranMap.put("timeOut", time);
-                tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
-                MqDto mqDto = new MqDto(MqTopicEnum.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);
-                //发送延时mq消息end
-            } else {
-                log.info("正常退出");
-                Long ecExamId = ExamRecordCacheUtil.getExamId(recordId);
-                Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
-                TEExamStudentService teExamStudentService = SpringContextHolder.getBean(TEExamStudentService.class);
-                ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
-                TEExamService teExamService = SpringContextHolder.getBean(TEExamService.class);
-                ExamCacheBean ec = teExamService.getExamCacheBean(ecExamId);//考试缓存
-
-                Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
-                Integer alreadyBreakCount = Objects.isNull(ExamRecordCacheUtil.getAlreadyBreakCount(recordId)) ? 0 : ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
-                Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
-                if (leftBreakResumeCount < 0) {
-                    teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
-                } else {
-                    alreadyBreakCount++;
-                    Long breakId = Constants.idGen.next();
-                    ExamRecordCacheUtil.setLastBreakId(this.recordId, breakId, false);
-                    ExamRecordCacheUtil.setStatus(this.recordId, ExamRecordStatusEnum.BREAK_OFF, false);
-                    Date lastBreakTimeNow = new Date();
-                    ExamRecordCacheUtil.setLastBreakTime(this.recordId, lastBreakTimeNow, false);
-                    ExamRecordCacheUtil.setAlreadyBreakCount(this.recordId, alreadyBreakCount, false);
-                    Date lastStartTime = new Date();
-                    ExamRecordCacheUtil.setLastStartTime(this.recordId, lastStartTime, false);
-                    String[] columns = new String[]{ExamRecordFieldEnum.last_break_id.name(), ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_break_time.name(), ExamRecordFieldEnum.already_break_count.name(), ExamRecordFieldEnum.last_start_time.name()};
-                    Object[] values = new Object[]{breakId, ExamRecordStatusEnum.RESUME_PREPARE, lastBreakTimeNow, alreadyBreakCount, lastStartTime};
-                    TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
-                    tOeExamRecordService.dataUpdatesMq(this.recordId, columns, values);
-                    ExamConstant.sendExamStopMsg(this.recordId);
-                    //考试断点异常原因 发送mq start
-                    MqDto mqDtoBreak = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), ExceptionEnum.EXIT, MqTagEnum.EXAM_BREAK, String.valueOf(this.recordId), String.valueOf(this.recordId));
+            ExamRecordStatusEnum status = ExamRecordCacheUtil.getStatus(this.recordId);
+            if (!Objects.equals(status, ExamRecordStatusEnum.FIRST_PREPARE) || !Objects.equals(status, ExamRecordStatusEnum.FINISHED) || !Objects.equals(status, ExamRecordStatusEnum.PERSISTED)) {
+                //大于等于超时时间,说明规定时间内都没有通信,非正常退出,因为期间会有心跳更新updateTime
+                if ((now.getTime() - this.updateTime) / 1000 >= SystemConstant.WEBSOCKET_MAX_TIME_OUT / 1000) {
+                    log.info("超时退出");
+                    //发送延时mq消息start
                     MqDtoService mqDtoService = SpringContextHolder.getBean(MqDtoService.class);
-                    mqDtoService.assembleSendOneWayMsg(mqDtoBreak);
-                    //考试断点异常原因 发送mq end
+                    String level = "2m";
+//                    String level = "30s";
+                    Integer time = SystemConstant.mqDelayLevel.get(level);
+                    LocalDateTime dt = LocalDateTime.now();
+                    dt = dt.plusMinutes(Long.parseLong(level.replace("m", "")));
+//                    dt = dt.plusSeconds(Long.parseLong(level.replace("s", "")));
+                    tranMap.put("timeOut", time);
+                    tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
+                    MqDto mqDto = new MqDto(MqTopicEnum.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);
+                    //发送延时mq消息end
+                } else {
+                    log.info("正常退出");
+                    Long ecExamId = ExamRecordCacheUtil.getExamId(recordId);
+                    Long examStudentId = ExamRecordCacheUtil.getExamStudentId(recordId);
+                    TEExamStudentService teExamStudentService = SpringContextHolder.getBean(TEExamStudentService.class);
+                    ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
+                    TEExamService teExamService = SpringContextHolder.getBean(TEExamService.class);
+                    ExamCacheBean ec = teExamService.getExamCacheBean(ecExamId);//考试缓存
+
+                    Integer durationSeconds = Objects.isNull(ExamRecordCacheUtil.getDurationSeconds(recordId)) ? 0 : ExamRecordCacheUtil.getDurationSeconds(recordId);
+                    Integer alreadyBreakCount = Objects.isNull(ExamRecordCacheUtil.getAlreadyBreakCount(recordId)) ? 0 : ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
+                    Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
+                    if (leftBreakResumeCount < 0) {
+                        teExamService.finish(examStudentCacheBean.getStudentId(), recordId, FinishTypeEnum.AUTO.name(), durationSeconds);
+                    } else {
+                        alreadyBreakCount++;
+                        Long breakId = Constants.idGen.next();
+                        ExamRecordCacheUtil.setLastBreakId(this.recordId, breakId, false);
+                        ExamRecordCacheUtil.setStatus(this.recordId, ExamRecordStatusEnum.BREAK_OFF, false);
+                        Date lastBreakTimeNow = new Date();
+                        ExamRecordCacheUtil.setLastBreakTime(this.recordId, lastBreakTimeNow, false);
+                        ExamRecordCacheUtil.setAlreadyBreakCount(this.recordId, alreadyBreakCount, false);
+                        Date lastStartTime = new Date();
+                        ExamRecordCacheUtil.setLastStartTime(this.recordId, lastStartTime, false);
+                        String[] columns = new String[]{ExamRecordFieldEnum.last_break_id.name(), ExamRecordFieldEnum.status.name(), ExamRecordFieldEnum.last_break_time.name(), ExamRecordFieldEnum.already_break_count.name(), ExamRecordFieldEnum.last_start_time.name()};
+                        Object[] values = new Object[]{breakId, ExamRecordStatusEnum.RESUME_PREPARE, lastBreakTimeNow, alreadyBreakCount, lastStartTime};
+                        TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
+                        tOeExamRecordService.dataUpdatesMq(this.recordId, columns, values);
+                        ExamConstant.sendExamStopMsg(this.recordId);
+                        //考试断点异常原因 发送mq start
+                        MqDto mqDtoBreak = new MqDto(MqTopicEnum.THEMIS_TOPIC.getCode(), MqTagEnum.EXAM_BREAK.name(), ExceptionEnum.EXIT, MqTagEnum.EXAM_BREAK, String.valueOf(this.recordId), String.valueOf(this.recordId));
+                        MqDtoService mqDtoService = SpringContextHolder.getBean(MqDtoService.class);
+                        mqDtoService.assembleSendOneWayMsg(mqDtoBreak);
+                        //考试断点异常原因 发送mq end
+                    }
                 }
             }
         }

+ 6 - 5
themis-mq/src/main/java/com/qmth/themis/mq/service/impl/MqLogicServiceImpl.java

@@ -250,7 +250,7 @@ public class MqLogicServiceImpl implements MqLogicService {
                 ExamStudentCacheBean examStudentCacheBean = teExamStudentService.getExamStudentCacheBean(examStudentId);
                 ExamCacheBean ec = teExamService.getExamCacheBean(examId);//考试缓存
                 Long breakId = null;
-                if (!Objects.equals(status, ExamRecordStatusEnum.FIRST_PREPARE)) {
+                if (!Objects.equals(status, ExamRecordStatusEnum.FIRST_PREPARE)|| !Objects.equals(status, ExamRecordStatusEnum.FINISHED) || !Objects.equals(status, ExamRecordStatusEnum.PERSISTED)) {
                     //增加断点记录,获取剩余断点次数
                     Integer alreadyBreakCount = Objects.isNull(ExamRecordCacheUtil.getAlreadyBreakCount(recordId)) ? 0 : ExamRecordCacheUtil.getAlreadyBreakCount(recordId);
                     Integer leftBreakResumeCount = ec.getBreakResumeCount() - alreadyBreakCount;
@@ -280,11 +280,12 @@ public class MqLogicServiceImpl implements MqLogicService {
                     tIeInvigilateExceptionInfoService.saveOrUpdate(tIeInvigilateExceptionInfo);
                     TEExamStudentLog teExamStudentLog = new TEExamStudentLog(SystemOperationEnum.BREAK_OFF.name(), SystemOperationEnum.BREAK_OFF.getCode(), SystemOperationEnum.BREAK_OFF.getCode(), examStudentCacheBean.getStudentId(), examStudentId, recordId, breakId);
                     teExamStudentLogService.save(teExamStudentLog);
+
+                    //发送移动端监考退出考试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
                 }
-                //发送移动端监考退出考试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
             }
         }
         TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);