|
@@ -4,10 +4,13 @@ import com.alibaba.fastjson.JSONObject;
|
|
|
import com.google.gson.Gson;
|
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
|
import com.qmth.themis.business.entity.TMRocketMessage;
|
|
|
-import com.qmth.themis.business.enums.MqEnum;
|
|
|
-import com.qmth.themis.business.enums.SystemOperationEnum;
|
|
|
+import com.qmth.themis.business.entity.TOeExamBreakHistory;
|
|
|
+import com.qmth.themis.business.entity.TOeExamRecord;
|
|
|
+import com.qmth.themis.business.enums.*;
|
|
|
import com.qmth.themis.business.service.TEExamStudentLogService;
|
|
|
import com.qmth.themis.business.service.TMRocketMessageService;
|
|
|
+import com.qmth.themis.business.service.TOeExamBreakHistoryService;
|
|
|
+import com.qmth.themis.business.service.TOeExamRecordService;
|
|
|
import com.qmth.themis.business.util.JacksonUtil;
|
|
|
import com.qmth.themis.business.util.RedisUtil;
|
|
|
import com.qmth.themis.common.contanst.Constants;
|
|
@@ -29,6 +32,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
@@ -53,6 +57,12 @@ public class RocketWebsocketUnNormalLogConsumer implements MessageListenerConcur
|
|
|
@Resource
|
|
|
TMRocketMessageService tmRocketMessageService;
|
|
|
|
|
|
+ @Resource
|
|
|
+ TOeExamRecordService tOeExamRecordService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ TOeExamBreakHistoryService tOeExamBreakHistoryService;
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
|
|
@@ -75,21 +85,48 @@ public class RocketWebsocketUnNormalLogConsumer implements MessageListenerConcur
|
|
|
TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
|
|
|
tmRocketMessage.setProp(JacksonUtil.parseJson(tmRocketMessage.getProperties()));
|
|
|
tmRocketMessageService.saveOrUpdate(tmRocketMessage);
|
|
|
- redisUtil.delete(SystemConstant.TASKLOG_TOPIC_BUFFER_LIST, mqDto.getId());
|
|
|
+ redisUtil.delete(SystemConstant.WEBSOCKET_UN_NORMAL_LOG_TOPIC_BUFFER_LIST, mqDto.getId());
|
|
|
} else {
|
|
|
if (Objects.nonNull(mqDto.getAck()) && mqDto.getAck().intValue() != SystemConstant.STANDARD_ACK_TYPE && Objects.nonNull(SystemConstant.WEBSOCKET_UN_NORMAL_LOG_TOPIC_BUFFER_LIST) && redisUtil.lock(SystemConstant.REDIS_LOCK_MQ_PREFIX + mqDto.getId(), SystemConstant.REDIS_LOCK_MQ_TIME_OUT)) {
|
|
|
- log.info(":{}-:{} 插入用户轨迹日志", threadId, threadName);
|
|
|
- teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto));
|
|
|
- mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);
|
|
|
- TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
|
|
|
- tmRocketMessage.setProp(JacksonUtil.parseJson(tmRocketMessage.getProperties()));
|
|
|
- tmRocketMessageService.saveOrUpdate(tmRocketMessage);
|
|
|
- redisUtil.delete(SystemConstant.WEBSOCKET_UN_NORMAL_LOG_TOPIC_BUFFER_LIST, mqDto.getId());
|
|
|
- return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
|
|
|
+ mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);//表示成功处理
|
|
|
+ Map<String, Object> tranMap = mqDto.getProperties();
|
|
|
+ Long recordId = Long.parseLong(String.valueOf(tranMap.get("recordId")));
|
|
|
+ String deviceId = String.valueOf(tranMap.get("deviceId"));
|
|
|
+ String ip = String.valueOf(tranMap.get("ip"));
|
|
|
+ Long updateTime = Long.parseLong(String.valueOf(tranMap.get("updateTime")));
|
|
|
+ Date date = new Date();
|
|
|
+ date.setTime(updateTime);
|
|
|
+ TOeExamRecord tOeExamRecord = tOeExamRecordService.getById(recordId);
|
|
|
+ Integer breakCount = tOeExamRecord.getLeftBreakResumeCount();
|
|
|
+ if (Objects.isNull(breakCount) || breakCount == 0) {
|
|
|
+ //todo 没有断点次数,则强制交卷
|
|
|
+ tOeExamRecord.setStatus(ExamRecordStatusEnum.finished.ordinal());
|
|
|
+ tOeExamRecordService.updateById(tOeExamRecord);
|
|
|
+ } else {
|
|
|
+ breakCount--;
|
|
|
+ //增加断点记录
|
|
|
+ TOeExamBreakHistory tOeExamBreakHistory = new TOeExamBreakHistory(recordId, new Date(), WebsocketExceptionEnum.NET_TIME_OUT.ordinal(), WebsocketExceptionEnum.NET_TIME_OUT.name());
|
|
|
+ tOeExamBreakHistoryService.save(tOeExamBreakHistory);
|
|
|
+ //更新考试记录状态
|
|
|
+ tOeExamRecord.setClientCurrentIp(ip);
|
|
|
+ tOeExamRecord.setClientWebsocketId(deviceId);
|
|
|
+ tOeExamRecord.setClientWebsocketStatus(WebsocketStatusEnum.UN_ONLINE.ordinal());
|
|
|
+ tOeExamRecord.setClientLastSyncTime(date);
|
|
|
+ tOeExamRecord.setLastBreakId(tOeExamBreakHistory.getId());
|
|
|
+ tOeExamRecord.setLastBreakTime(tOeExamBreakHistory.getBreakTime());
|
|
|
+ tOeExamRecord.setLeftBreakResumeCount(breakCount);
|
|
|
+ tOeExamRecord.setStatus(ExamRecordStatusEnum.break_off.ordinal());
|
|
|
+ tOeExamRecordService.updateById(tOeExamRecord);
|
|
|
+ }
|
|
|
} else {
|
|
|
- log.info(":{}-:{} 消息ack未确认,重发", threadId, threadName);
|
|
|
- return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
|
|
|
+ mqDto.setAck(SystemConstant.INDIVIDUAL_ACK_TYPE);//表示考生已重新登录
|
|
|
}
|
|
|
+ log.info(":{}-:{} 插入用户轨迹日志", threadId, threadName);
|
|
|
+ teExamStudentLogService.saveStudentLogInfo(mqDto.getTimestamp(), MqEnum.valueOf(String.valueOf(mqDto.getType())).getId(), SystemOperationEnum.valueOf(String.valueOf(mqDto.getBody())).getCode(), JacksonUtil.parseJson(mqDto));
|
|
|
+ TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
|
|
|
+ tmRocketMessage.setProp(JacksonUtil.parseJson(tmRocketMessage.getProperties()));
|
|
|
+ tmRocketMessageService.saveOrUpdate(tmRocketMessage);
|
|
|
+ redisUtil.delete(SystemConstant.WEBSOCKET_UN_NORMAL_LOG_TOPIC_BUFFER_LIST, mqDto.getId());
|
|
|
}
|
|
|
}
|
|
|
} catch (Exception e) {
|