|
@@ -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
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|