wangliang 4 lat temu
rodzic
commit
f3c2ae8318

+ 7 - 1
themis-business/src/main/java/com/qmth/themis/business/bean/mobile/MobileAuthorizationParamBean.java

@@ -28,6 +28,12 @@ public class MobileAuthorizationParamBean {
 	public void setCode(String code) {
 		this.code = code;
 	}
-	
 
+	@Override
+	public String toString() {
+		return "MobileAuthorizationParamBean{" +
+				"mode='" + mode + '\'' +
+				", code='" + code + '\'' +
+				'}';
+	}
 }

+ 3 - 0
themis-business/src/main/java/com/qmth/themis/business/constant/SystemConstant.java

@@ -227,6 +227,9 @@ public class SystemConstant {
     //交卷锁
     public static final String REDIS_LOCK_FINISH_EXAM_PREFIX = "lock:finish_exam:record_id_";
 
+    //手机锁
+    public static final String REDIS_LOCK_MOBILE_AUTHORIZATION_PREFIX = "lock:mobile:authorization_";
+
     /**
      * redis过期时间
      */

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

@@ -17,6 +17,7 @@ import com.qmth.themis.business.service.TEExamService;
 import com.qmth.themis.business.service.TEExamStudentService;
 import com.qmth.themis.business.service.TEMobileService;
 import com.qmth.themis.business.util.MqUtil;
+import com.qmth.themis.business.util.RedisUtil;
 import com.qmth.themis.business.util.ServletUtil;
 import com.qmth.themis.common.enums.ExceptionResultEnum;
 import com.qmth.themis.common.exception.BusinessException;
@@ -52,6 +53,9 @@ public class TEMobileController {
     @Resource
     MqDtoService mqDtoService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     @ApiOperation(value = "获取登录详细信息")
     @RequestMapping(value = "/authorization", method = RequestMethod.POST)
     public Result authorization(@RequestBody MobileAuthorizationParamBean param) throws NoSuchAlgorithmException {
@@ -61,7 +65,16 @@ public class TEMobileController {
         if (param.getCode() == null) {
             throw new BusinessException("code不能为空");
         }
-        return ResultUtil.ok(mobileService.authorization(param));
+        String lockKey = SystemConstant.REDIS_LOCK_MOBILE_AUTHORIZATION_PREFIX + param.toString();
+        Boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_CACHE_TIME_OUT);
+        if (!lock) {
+            throw new BusinessException(ExceptionResultEnum.REQUEST_AWAIT);
+        }
+        try {
+            return ResultUtil.ok(mobileService.authorization(param));
+        } finally {
+            redisUtil.releaseLock(lockKey);
+        }
     }
 
     @ApiOperation(value = "拍照/录音答题就绪")

+ 9 - 3
themis-exam/src/main/java/com/qmth/themis/exam/listener/service/impl/MqOeLogicServiceImpl.java

@@ -204,7 +204,9 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                             websocketDto = new WebsocketDto(WebsocketTypeEnum.MOBILE_ANSWER_UPLOAD.name(), prop);
                             break;
                         case "OE_WEBSOCKET_EXAM_STOP":
-                            websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), prop);
+                            if (!Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
+                                websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), prop);
+                            }
                             break;
                         case "MONITOR_START":
                             MonitorVideoSourceEnum source = MonitorVideoSourceEnum.valueOf((String) prop.get("source"));
@@ -270,7 +272,9 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     WebsocketDto websocketDto = null;
                     switch (tag.toUpperCase()) {
                         case "EXAM_STOP":
-                            websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), mqDto.getProperties());
+                            if (!Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
+                                websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), mqDto.getProperties());
+                            }
                             break;
                         case "EXAM_START":
                             if (!Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)
@@ -295,7 +299,9 @@ public class MqOeLogicServiceImpl implements MqOeLogicService {
                     WebsocketDto websocketDto = null;
                     switch (tag.toUpperCase()) {
                         case "EXAM_STOP":
-                            websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), mqDto.getProperties());
+                            if (!Objects.equals(ExamRecordStatusEnum.ANSWERING, examRecordStatusEnum)) {
+                                websocketDto = new WebsocketDto(WebsocketTypeEnum.EXAM_STOP.name(), mqDto.getProperties());
+                            }
                             break;
                         case "EXAM_START":
                             if (!Objects.equals(ExamRecordStatusEnum.PERSISTED, examRecordStatusEnum)

+ 2 - 6
themis-exam/src/main/java/com/qmth/themis/exam/start/StartRunning.java

@@ -43,12 +43,8 @@ public class StartRunning implements CommandLineRunner {
         /**
          * websocket mq start
          */
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.WEBSOCKET_OE_GROUP.name())
-//                + String.valueOf(UUID.randomUUID()).replaceAll("-", "")
-                , dictionaryConfig.mqConfigDomain().getTopic(), 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.OE_WEBSOCKET_MOBILE_ANSWER_READY.name() + "||" + MqTagEnum.OE_WEBSOCKET_MOBILE_ANSWER_UPLOAD.name() + "||" + MqTagEnum.OE_WEBSOCKET_EXAM_STOP.name() + "||" + MqTagEnum.MONITOR_START.name() + "||" + MqTagEnum.MONITOR_STOP.name() + "||" + MqTagEnum.OE_WEBSOCKET_MOBILE_MONITOR_STATUS.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketOeServer.class));
-        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.WEBSOCKET_OE_MOBILE_GROUP.name())
-//                + String.valueOf(UUID.randomUUID()).replaceAll("-", "")
-                , dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_STOP.name() + "||" + MqTagEnum.EXAM_START.name(), MessageModel.CLUSTERING, SpringContextHolder.getBean(WebSocketMobileServer.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.WEBSOCKET_OE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), 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.OE_WEBSOCKET_MOBILE_ANSWER_READY.name() + "||" + MqTagEnum.OE_WEBSOCKET_MOBILE_ANSWER_UPLOAD.name() + "||" + MqTagEnum.OE_WEBSOCKET_EXAM_STOP.name() + "||" + MqTagEnum.MONITOR_START.name() + "||" + MqTagEnum.MONITOR_STOP.name() + "||" + MqTagEnum.OE_WEBSOCKET_MOBILE_MONITOR_STATUS.name(), MessageModel.BROADCASTING, SpringContextHolder.getBean(WebSocketOeServer.class));
+        rocketMessageConsumer.setRocketMQConsumer(nameServer, dictionaryConfig.mqConfigDomain().getMap().get(MqGroupEnum.WEBSOCKET_OE_MOBILE_GROUP.name()), dictionaryConfig.mqConfigDomain().getTopic(), MqTagEnum.EXAM_STOP.name() + "||" + MqTagEnum.EXAM_START.name(), MessageModel.BROADCASTING, SpringContextHolder.getBean(WebSocketMobileServer.class));
         SystemConstant.initTempFiles();
         log.info("服务器启动时执行 end");
     }

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

@@ -18,9 +18,9 @@ import com.qmth.themis.common.enums.Platform;
 import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.exam.listener.service.MqOeLogicService;
 import com.qmth.themis.exam.websocketTemplete.WebSocketMobileMessageTemplete;
-import com.qmth.themis.mq.templete.Orderly;
-import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
-import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
+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;
@@ -46,7 +46,7 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 @ServerEndpoint("/ws/mobile")
 @Component
-public class WebSocketMobileServer implements Orderly {
+public class WebSocketMobileServer implements Concurrently {
     private final static Logger log = LoggerFactory.getLogger(WebSocketMobileServer.class);
     private volatile static ConcurrentHashMap<String, WebSocketMobileServer> webSocketMap = new ConcurrentHashMap<>();
     /**
@@ -249,7 +249,7 @@ public class WebSocketMobileServer implements Orderly {
     }
 
     @Override
-    public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext consumeOrderlyContext) {
+    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
         MqOeLogicService mqOeLogicService = SpringContextHolder.getBean(MqOeLogicService.class);
         try {
             long threadId = Thread.currentThread().getId();
@@ -259,12 +259,12 @@ public class WebSocketMobileServer implements Orderly {
                 MqDto mqDto = JacksonUtil.readJson(new String(messageExt.getBody(), Constants.CHARSET), MqDto.class);
                 log.info(":{}-:{} websocket oe Consumer接收到的消息:{}", threadId, threadName, JacksonUtil.parseJson(mqDto));
                 mqOeLogicService.execMqOeMobileLogic(mqDto, SystemConstant.MQ_BROADCAST_TOPIC_BUFFER_LIST);
-                return ConsumeOrderlyStatus.SUCCESS;
+                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
             }
         } catch (Exception e) {
             log.error("mq websocket mobile,消息消费出错", e);
-            return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;//重试
+            return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
         }
-        return ConsumeOrderlyStatus.SUCCESS;//成功
+        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//成功
     }
 }

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

@@ -19,9 +19,9 @@ import com.qmth.themis.common.exception.BusinessException;
 import com.qmth.themis.exam.config.ExamConstant;
 import com.qmth.themis.exam.listener.service.MqOeLogicService;
 import com.qmth.themis.exam.websocketTemplete.WebSocketOeMessageTemplete;
-import com.qmth.themis.mq.templete.Orderly;
-import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;
-import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
+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;
@@ -47,7 +47,7 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 @ServerEndpoint("/ws/oe")
 @Component
-public class WebSocketOeServer implements Orderly {
+public class WebSocketOeServer implements Concurrently {
     private final static Logger log = LoggerFactory.getLogger(WebSocketOeServer.class);
     private volatile static ConcurrentHashMap<String, WebSocketOeServer> webSocketMap = new ConcurrentHashMap<>();
     /**
@@ -264,8 +264,8 @@ public class WebSocketOeServer implements Orderly {
     }
 
     @Override
-    public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext
-            consumeOrderlyContext) {
+    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext
+            consumeConcurrentlyContext) {
         MqOeLogicService mqOeLogicService = SpringContextHolder.getBean(MqOeLogicService.class);
         try {
             long threadId = Thread.currentThread().getId();
@@ -275,13 +275,13 @@ public class WebSocketOeServer implements Orderly {
                 MqDto mqDto = JacksonUtil.readJson(new String(messageExt.getBody(), Constants.CHARSET), MqDto.class);
                 log.info(":{}-:{} websocket oe Consumer接收到的消息:{}", threadId, threadName, JacksonUtil.parseJson(mqDto));
                 mqOeLogicService.execMqOeLogic(mqDto, SystemConstant.MQ_BROADCAST_TOPIC_BUFFER_LIST);
-                return ConsumeOrderlyStatus.SUCCESS;
+                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
             }
         } catch (Exception e) {
             log.error("mq websocket oe,消息消费出错", e);
-            return ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT;//重试
+            return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
         }
-        return ConsumeOrderlyStatus.SUCCESS;//成功
+        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//成功
     }
 
     public static ConcurrentHashMap<String, WebSocketOeServer> getWebSocketMap() {