Ver código fonte

考生端websocket

wangliang 4 anos atrás
pai
commit
53ac144018

+ 1 - 28
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -4,8 +4,6 @@ import com.qmth.themis.common.contanst.Constants;
 import com.qmth.themis.common.enums.Platform;
 import com.qmth.themis.common.enums.Source;
 
-import java.time.LocalDateTime;
-import java.time.ZoneOffset;
 import java.util.*;
 
 /**
@@ -129,7 +127,7 @@ public class SystemConstant {
     public static final String WEBSOCKET_UN_NORMAL_LIST = "websocket:oe:unnormal:list";
     public static final String GET = "get";
     public static final long WEBSOCKET_MAX_TIME_OUT = 3 * 60 * 1000;
-    //    public static final long WEBSOCKET_MAX_TIME_OUT = 10 * 1000;
+//        public static final long WEBSOCKET_MAX_TIME_OUT = 10 * 1000;
     public static final String ACK_MESSAGE = "ackMessage";
     /**
      * 缓存配置
@@ -211,29 +209,4 @@ public class SystemConstant {
         }
         return map;
     }
-
-    /**
-     * mq延时消息操作
-     *
-     * @param time
-     * @return
-     */
-    public static Long mqDelayTimeOper(String time) {
-        LocalDateTime dt = null;
-        if (Objects.nonNull(time)) {
-            dt = LocalDateTime.now();
-            if (time.contains("s")) {//秒
-                dt = dt.plusSeconds(Integer.parseInt(time.replace("s", "")));
-            } else if (time.contains("m")) {//分
-                dt = dt.plusMinutes(Integer.parseInt(time.replace("m", "")));
-            } else if (time.contains("h")) {//时
-                dt = dt.plusHours(Integer.parseInt(time.replace("h", "")));
-            }
-        }
-        if (Objects.nonNull(dt)) {
-            return dt.toInstant(ZoneOffset.of("+8")).toEpochMilli();
-        } else {
-            return null;
-        }
-    }
 }

+ 10 - 2
themis-exam/src/main/java/com/qmth/themis/exam/websocket/WebSocketServer.java

@@ -27,6 +27,8 @@ import javax.websocket.server.PathParam;
 import javax.websocket.server.ServerEndpoint;
 import java.io.IOException;
 import java.lang.reflect.Method;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -64,10 +66,11 @@ public class WebSocketServer
     @OnOpen
     public void onOpen(Session session) {
         Map<String, List<String>> mapParameter = session.getRequestParameterMap();
-        log.info("mapParameter:{}", JacksonUtil.parseJson(mapParameter));
         if (Objects.isNull(mapParameter)) {
             throw new BusinessException(ExceptionResultEnum.PARAMS_ILLEGALITY);
         }
+        log.info("mapParameter:{}", JacksonUtil.parseJson(mapParameter));
+        log.info("uri:{}", session.getRequestURI());
         if (Objects.isNull(mapParameter.get("platform")) || mapParameter.get("platform").size() == 0) {
             throw new BusinessException(ExceptionResultEnum.PLATFORM_INVALID);
         }
@@ -146,7 +149,12 @@ public class WebSocketServer
                 //发送延时mq消息start
                 MqDtoService mqDtoService = SpringContextHolder.getBean(MqDtoService.class);
                 DictionaryConfig dictionaryConfig = SpringContextHolder.getBean(DictionaryConfig.class);
-                tranMap.put("timeOut", SystemConstant.mqDelayLevel.get("2m"));
+                String level = "2m";
+                Integer time = SystemConstant.mqDelayLevel.get(level);
+                LocalDateTime dt = LocalDateTime.now();
+                dt = dt.plusMinutes(Long.parseLong(level.replace("m", "")));
+                tranMap.put("timeOut", time);
+                tranMap.put("mqExecTime", dt.toInstant(ZoneOffset.of("+8")).toEpochMilli());
                 MqDto mqDto = new MqDto(dictionaryConfig.mqConfigDomain().getWebsocketUnNormalTopic(), dictionaryConfig.mqConfigDomain().getWebsocketUnNormalTopicOeTag(), SystemOperationEnum.OE_NET_UN_NORMAL, MqEnum.WEBSOCKET_UN_NORMAL_LOG, String.valueOf(this.recordId), this.tranMap, this.sessionId);
                 mqDtoService.assembleSendAsyncDelayMsg(mqDto);
                 //发送延时mq消息end

+ 1 - 1
themis-mq/src/main/java/com/qmth/themis/mq/listener/RocketWebsocketUnNormalLogConsumer.java

@@ -104,7 +104,7 @@ public class RocketWebsocketUnNormalLogConsumer implements MessageListenerConcur
                         tOeExamRecordUpdate = new TOeExamRecord();
                         BeanUtils.copyProperties(tOeExamRecord, tOeExamRecordUpdate);
                         Integer breakCount = tOeExamRecord.getLeftBreakResumeCount();
-                        if (Objects.isNull(breakCount) || breakCount == 0) {
+                        if (Objects.isNull(breakCount) || breakCount <= 0) {
                             //todo 没有断点次数,则强制交卷
                             tOeExamRecord.setStatus(ExamRecordStatusEnum.finished.ordinal());
                             tOeExamRecordService.updateById(tOeExamRecord);

+ 4 - 5
themis-task/src/main/java/com/qmth/themis/task/quartz/MqJob.java

@@ -1,5 +1,6 @@
 package com.qmth.themis.task.quartz;
 
+import cn.hutool.core.date.DateUtil;
 import com.qmth.themis.business.constant.SystemConstant;
 import com.qmth.themis.business.threadPool.MyThreadPool;
 import com.qmth.themis.business.util.RedisUtil;
@@ -12,6 +13,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.quartz.QuartzJobBean;
 
 import javax.annotation.Resource;
+import java.util.Date;
 import java.util.Map;
 import java.util.Objects;
 
@@ -82,12 +84,9 @@ public class MqJob extends QuartzJobBean {
             map.forEach((k, v) -> {
                 MqDto mqDto = (MqDto) v;
                 Map<String, Object> prop = mqDto.getProperties();
-                int timeOut = Integer.parseInt(String.valueOf(prop.get("timeOut")));
-                String time = SystemConstant.mqDelayLevelList.get(timeOut - 1);
-                Long mqTime = SystemConstant.mqDelayTimeOper(time);
-                log.info("timeOut:{},time:{},mqTime:{}", timeOut, time, mqTime);
+                Long mqExecTime = Long.parseLong(String.valueOf(prop.get("mqExecTime")));
                 //mq为延时消息,所以每分钟扫描时有可能mq消息还未执行,所以加上mq消息等级和当前时间对比,如超过mq的延时时间一分钟则执行
-                if (Objects.nonNull(mqTime) && (mqTime - System.currentTimeMillis()) / 1000 / 60 <= -1) {
+                if (Objects.nonNull(mqExecTime) && (mqExecTime - System.currentTimeMillis()) / 1000 / 60 <= -1) {
                     producerServer.asyncDelayMsg(mqDto);
                 }
             });