Ver código fonte

websocket加入考试状态校验

wangliang 4 anos atrás
pai
commit
ced31d1dab

+ 77 - 0
themis-business/src/main/java/com/qmth/themis/business/util/WebsocketUtil.java

@@ -1,6 +1,18 @@
 package com.qmth.themis.business.util;
 
+import com.qmth.themis.business.cache.ExamRecordCacheUtil;
+import com.qmth.themis.business.constant.SpringContextHolder;
+import com.qmth.themis.business.enums.ExamRecordFieldEnum;
+import com.qmth.themis.business.enums.ExamRecordStatusEnum;
+import com.qmth.themis.business.enums.WebsocketStatusEnum;
+import com.qmth.themis.business.service.TOeExamRecordService;
+import com.qmth.themis.common.enums.ExceptionResultEnum;
+import com.qmth.themis.common.exception.BusinessException;
+
 import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @Description: websocket util
@@ -35,4 +47,69 @@ public class WebsocketUtil {
         }
         return null;
     }
+
+    /**
+     * 检查考试状态
+     *
+     * @param recordId
+     * @return
+     */
+    public static Boolean checkExamStatus(Long recordId) {
+        if (Objects.isNull(recordId)) {
+            throw new BusinessException(ExceptionResultEnum.RECORD_ID_IS_NULL);
+        }
+        ExamRecordStatusEnum examRecordStatusEnum = ExamRecordCacheUtil.getStatus(recordId);
+        if (Objects.isNull(examRecordStatusEnum)) {
+            throw new BusinessException(ExceptionResultEnum.EXAM_STATUS_NOT_NULL);
+        }
+        if (ExamRecordStatusEnum.FIRST_PREPARE == examRecordStatusEnum || ExamRecordStatusEnum.RESUME_PREPARE == examRecordStatusEnum
+                || ExamRecordStatusEnum.ANSWERING == examRecordStatusEnum) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 更新websocket状态
+     *
+     * @param recordId
+     * @param ip
+     * @param sessionId
+     * @param websocketStatusEnum
+     */
+    public static void updateExamRecordWebsocketStatus(Long recordId, String ip, String sessionId, WebsocketStatusEnum websocketStatusEnum) {
+        ExamRecordCacheUtil.setClientWebsocketStatus(recordId, websocketStatusEnum, false);
+        ExamRecordCacheUtil.setClientCurrentIp(recordId, ip, false);
+        ExamRecordCacheUtil.setClientWebsocketId(recordId, sessionId, false);
+        Long clientLastSyncTime = System.currentTimeMillis();
+        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, ip, sessionId, clientLastSyncTime};
+        TOeExamRecordService tOeExamRecordService = SpringContextHolder.getBean(TOeExamRecordService.class);
+        tOeExamRecordService.dataUpdatesMq(recordId, columns, values);
+    }
+
+    /**
+     * 初始化websocket
+     *
+     * @param recordId
+     * @param userId
+     * @param deviceId
+     * @param ip
+     * @param updateTime
+     * @return
+     */
+    public static Map<String, Object> initWebsocket(Long recordId, Long userId, String deviceId, String ip, Long updateTime) {
+        Map<String, Object> tranMap = new HashMap<>();
+        if (Objects.nonNull(recordId)) {
+            tranMap.put("recordId", recordId);
+        } else if (Objects.nonNull(userId)) {
+            tranMap.put("userId", userId);
+        }
+        tranMap.put("deviceId", deviceId);
+        tranMap.put("ip", ip);
+        tranMap.put("updateTime", updateTime);
+        return tranMap;
+    }
 }

+ 1 - 1
themis-common/src/main/java/com/qmth/themis/common/enums/ExceptionResultEnum.java

@@ -194,7 +194,7 @@ public enum ExceptionResultEnum {
 
     SOURCE_INVALID(401, 401009, "source无效"),
 
-    RECORD_ID_INVALID(401, 401009, "recordId无效"),
+    RECORD_ID_INVALID(401, 401010, "recordId无效"),
 
     /**
      * 404

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

@@ -168,29 +168,27 @@ public class WebSocketMobileServer implements Concurrently {
             log.warn("Authorization faile: deviceId invalid, session deviceId is " + tbSession.getDeviceId());
             throw new BusinessException(ExceptionResultEnum.AUTHORIZATION_ERROR);
         }
-        this.session = session;
-        session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
-        this.sessionId = tbSession.getId();
-        if (webSocketMap.containsKey(this.recordId + "-" + this.source.name())) {
-            webSocketMap.remove(this.recordId + "-" + this.source.name());
-            webSocketMap.put(this.recordId + "-" + this.source.name(), this);
-        } else {
-            webSocketMap.put(this.recordId + "-" + this.source.name(), this);
-            //                        addOnlineCount();
+        Boolean check = WebsocketUtil.checkExamStatus(this.recordId);
+        if (check) {
+            this.session = session;
+            session.setMaxIdleTimeout(SystemConstant.WEBSOCKET_MAX_TIME_OUT);
+            this.sessionId = tbSession.getId();
+            if (webSocketMap.containsKey(this.recordId + "-" + this.source.name())) {
+                webSocketMap.remove(this.recordId + "-" + this.source.name());
+                webSocketMap.put(this.recordId + "-" + this.source.name(), this);
+            } else {
+                webSocketMap.put(this.recordId + "-" + this.source.name(), this);
+                //                        addOnlineCount();
+            }
+            //                    log.info("用户连接:{},当前在线人数为:{}", this.sessionId, getOnlineCount());
+            log.info("用户连接:{}", this.sessionId);
+            InetSocketAddress addr = (InetSocketAddress) WebsocketUtil
+                    .getFieldInstance(this.session.getAsyncRemote(), "base#socketWrapper#socket#sc#remoteAddress");
+            this.ip = addr.toString().replace("/", "").split(":")[0];
+            log.info("ip[:{}]连接成功", this.ip);
+            this.updateTime = System.currentTimeMillis();
+            tranMap = WebsocketUtil.initWebsocket(recordId, null, deviceId, ip, updateTime);
         }
-        //                    log.info("用户连接:{},当前在线人数为:{}", this.sessionId, getOnlineCount());
-        log.info("用户连接:{}", this.sessionId);
-        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);
-        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);
     }
 
     /**
@@ -328,7 +326,7 @@ public class WebSocketMobileServer implements Concurrently {
 
     @Override
     public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
-            ConsumeConcurrentlyContext consumeConcurrentlyContext) {
+                                                    ConsumeConcurrentlyContext consumeConcurrentlyContext) {
         RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
         MqOeLogicService mqOeLogicService = SpringContextHolder.getBean(MqOeLogicService.class);
         MqDto mqDto = null;

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

@@ -162,40 +162,27 @@ public class WebSocketOeServer implements Concurrently {
             log.warn("Authorization faile: deviceId invalid, session deviceId is " + tbSession.getDeviceId());
             throw new BusinessException(ExceptionResultEnum.AUTHORIZATION_ERROR);
         }
-        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);
-        } else {
-            webSocketMap.put(this.recordId, this);
-            addOnlineCount();
+        Boolean check = WebsocketUtil.checkExamStatus(this.recordId);
+        if (check) {
+            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);
+            } else {
+                webSocketMap.put(this.recordId, this);
+                addOnlineCount();
+            }
+            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];
+            log.info("ip[:{}]连接成功", this.ip);
+            WebsocketUtil.updateExamRecordWebsocketStatus(recordId, ip, this.session.getId(), WebsocketStatusEnum.ON_LINE);
+            this.updateTime = System.currentTimeMillis();
+            tranMap = WebsocketUtil.initWebsocket(recordId, null, deviceId, ip, updateTime);
         }
-        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);
-        ExamRecordCacheUtil.setClientWebsocketStatus(recordId, WebsocketStatusEnum.ON_LINE, false);
-        ExamRecordCacheUtil.setClientCurrentIp(recordId, this.ip, false);
-        ExamRecordCacheUtil.setClientWebsocketId(recordId, this.session.getId(), false);
-        Long clientLastSyncTime = System.currentTimeMillis();
-        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);
     }
 
     /**