|
@@ -6,11 +6,9 @@ import com.qmth.themis.business.constant.SpringContextHolder;
|
|
|
import com.qmth.themis.business.constant.SystemConstant;
|
|
|
import com.qmth.themis.business.dto.WebsocketDto;
|
|
|
import com.qmth.themis.business.entity.TBSession;
|
|
|
-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.enums.WebsocketTypeEnum;
|
|
|
-import com.qmth.themis.business.service.TMRocketMessageService;
|
|
|
import com.qmth.themis.business.util.JacksonUtil;
|
|
|
import com.qmth.themis.business.util.RedisUtil;
|
|
|
import com.qmth.themis.business.util.WebsocketUtil;
|
|
@@ -19,32 +17,21 @@ import com.qmth.themis.common.enums.ExceptionResultEnum;
|
|
|
import com.qmth.themis.common.exception.BusinessException;
|
|
|
import com.qmth.themis.common.signature.SignatureInfo;
|
|
|
import com.qmth.themis.common.signature.SignatureType;
|
|
|
+import com.qmth.themis.exam.listener.service.MqOeLogicService;
|
|
|
import com.qmth.themis.exam.websocketTemplete.WebSocketOeMessageTemplete;
|
|
|
import com.qmth.themis.mq.dto.MqDto;
|
|
|
import com.qmth.themis.mq.enums.MqTagEnum;
|
|
|
import com.qmth.themis.mq.enums.MqTopicEnum;
|
|
|
import com.qmth.themis.mq.service.MqDtoService;
|
|
|
import com.qmth.themis.mq.templete.Concurrently;
|
|
|
-import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
|
|
|
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
|
|
|
-import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
|
|
|
-import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
|
|
|
-import org.apache.rocketmq.common.message.Message;
|
|
|
import org.apache.rocketmq.common.message.MessageExt;
|
|
|
-import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
|
|
|
-import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
|
|
-import org.apache.rocketmq.spring.annotation.SelectorType;
|
|
|
-import org.apache.rocketmq.spring.core.RocketMQListener;
|
|
|
-import org.apache.rocketmq.spring.core.RocketMQPushConsumerLifecycleListener;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.websocket.*;
|
|
|
-import javax.websocket.server.PathParam;
|
|
|
import javax.websocket.server.ServerEndpoint;
|
|
|
import java.io.IOException;
|
|
|
import java.lang.reflect.Method;
|
|
@@ -125,21 +112,15 @@ public class WebSocketOeServer implements Concurrently {
|
|
|
addOnlineCount();
|
|
|
//在线数加1
|
|
|
}
|
|
|
- //发送恢复网络mq消息
|
|
|
log.info("用户连接:" + this.sessionId + ",当前在线人数为:" + getOnlineCount());
|
|
|
- try {
|
|
|
- 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 + "]连接成功");
|
|
|
- tranMap = new HashMap<>();
|
|
|
- tranMap.put("recordId", this.recordId);
|
|
|
- tranMap.put("deviceId", this.deviceId);
|
|
|
- tranMap.put("ip", this.ip);
|
|
|
- tranMap.put("updateTime", this.updateTime);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.error("用户:" + 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 + "]连接成功");
|
|
|
+ tranMap = new HashMap<>();
|
|
|
+ tranMap.put("recordId", this.recordId);
|
|
|
+ tranMap.put("deviceId", this.deviceId);
|
|
|
+ tranMap.put("ip", this.ip);
|
|
|
+ tranMap.put("updateTime", this.updateTime);
|
|
|
} else {
|
|
|
throw new BusinessException(ExceptionResultEnum.AUTHORIZATION_ERROR);
|
|
|
}
|
|
@@ -233,24 +214,12 @@ public class WebSocketOeServer implements Concurrently {
|
|
|
* @param message
|
|
|
* @throws IOException
|
|
|
*/
|
|
|
- public void sendMessage(String message) throws IOException {
|
|
|
- log.info("message:{}", message);
|
|
|
- this.session.getAsyncRemote().sendText(message);
|
|
|
+ public void sendMessage(Object message) {
|
|
|
+ log.info("message:{}", JacksonUtil.parseJson(message));
|
|
|
+ this.session.getAsyncRemote().sendText(JacksonUtil.parseJson(message));
|
|
|
this.updateTime = System.currentTimeMillis();
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 发送自定义消息
|
|
|
- */
|
|
|
- public static void sendInfo(String message, @PathParam("sessionId") String sessionId) throws IOException {
|
|
|
- log.info("发送消息到:{},报文:{}", sessionId, message);
|
|
|
- if (Objects.nonNull(sessionId) && webSocketMap.containsKey(sessionId)) {
|
|
|
- webSocketMap.get(sessionId).sendMessage(message);
|
|
|
- } else {
|
|
|
- log.error("用户[:{}]不在线!", sessionId);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取在线人数
|
|
|
*
|
|
@@ -294,58 +263,27 @@ public class WebSocketOeServer implements Concurrently {
|
|
|
@Override
|
|
|
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
|
|
|
RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
|
|
|
- TMRocketMessageService tmRocketMessageService = SpringContextHolder.getBean(TMRocketMessageService.class);
|
|
|
+ MqOeLogicService mqOeLogicService = SpringContextHolder.getBean(MqOeLogicService.class);
|
|
|
MqDto mqDto = null;
|
|
|
try {
|
|
|
long threadId = Thread.currentThread().getId();
|
|
|
String threadName = Thread.currentThread().getName();
|
|
|
- Gson gson = new Gson();
|
|
|
for (MessageExt messageExt : msgs) {
|
|
|
log.info(":{}-:{} websocket oe Consumer重试次数:{}", threadId, threadName, messageExt.getReconsumeTimes());
|
|
|
mqDto = JacksonUtil.readJson(new String(messageExt.getBody(), Constants.CHARSET), MqDto.class);
|
|
|
log.info(":{}-:{} websocket oe Consumer接收到的消息:{}", threadId, threadName, JacksonUtil.parseJson(mqDto));
|
|
|
int reconsumeTime = messageExt.getReconsumeTimes();
|
|
|
if (reconsumeTime >= SystemConstant.MAXRECONSUMETIMES) {
|
|
|
- //超过最大重试次数,保存到数据库,后续可以发短信通知系统管理人员
|
|
|
- mqDto.setAck(SystemConstant.POSION_ACK_TYPE);
|
|
|
- TMRocketMessage tmRocketMessage = gson.fromJson(gson.toJson(mqDto), TMRocketMessage.class);
|
|
|
- tmRocketMessageService.saveOrUpdate(tmRocketMessage);
|
|
|
- redisUtil.delete(SystemConstant.MQ_TOPIC_BUFFER_LIST, mqDto.getId());
|
|
|
+ mqOeLogicService.execMqMaxReconsumeTime(mqDto, SystemConstant.MQ_TOPIC_BUFFER_LIST);
|
|
|
} else {
|
|
|
if (Objects.nonNull(mqDto.getAck()) && mqDto.getAck().intValue() != SystemConstant.STANDARD_ACK_TYPE && Objects.nonNull(redisUtil.get(SystemConstant.MQ_TOPIC_BUFFER_LIST, mqDto.getId())) && redisUtil.lock(SystemConstant.REDIS_LOCK_MQ_PREFIX + mqDto.getId(), SystemConstant.REDIS_LOCK_MQ_TIME_OUT)) {
|
|
|
- MqEnum mqEnum = mqDto.getType();
|
|
|
- if (MqEnum.WEBSOCKET_OFFLINE_LOG.ordinal() == mqEnum.ordinal()) {//下线
|
|
|
-
|
|
|
- } else if (MqEnum.WEBSOCKET_IM_CLUSTERING_LOG.ordinal() == mqEnum.ordinal()) {//点对点消息
|
|
|
-
|
|
|
- } else if (MqEnum.WEBSOCKET_IM_BROADCASTING_LOG.ordinal() == mqEnum.ordinal()) {//广播消息
|
|
|
-
|
|
|
- }
|
|
|
- }else {
|
|
|
+ mqOeLogicService.execMqOqLogic(mqDto, SystemConstant.MQ_TOPIC_BUFFER_LIST);
|
|
|
+ return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
|
|
|
+ } else {
|
|
|
log.info(":{}-:{} 消息ack未确认,重发", threadId, threadName);
|
|
|
return ConsumeConcurrentlyStatus.RECONSUME_LATER;//重试
|
|
|
}
|
|
|
}
|
|
|
-// log.info(":{}-:{} websocketConsumer 重试次数:{}", threadId, threadName, messageExt.getReconsumeTimes());
|
|
|
-// MqDto mqDto = JacksonUtil.readJson(new String(messageExt.getBody(), Constants.CHARSET), MqDto.class);
|
|
|
-// log.info(":{}-:{} websocketConsumer 接收到的消息:{}", threadId, threadName, JacksonUtil.parseJson(mqDto));
|
|
|
-// log.info(":{}-:{} websocketConsumer mqDto sequence:{},tag:{}", threadId, threadName, mqDto.getSequence(), mqDto.getTag());
|
|
|
-// Map map = mqDto.getProperties();
|
|
|
-// String body = JacksonUtil.parseJson(mqDto.getBody());
|
|
|
-// log.info("map:{},body:{}", JacksonUtil.parseJson(map), body);
|
|
|
-// String model = String.valueOf(map.get("model"));
|
|
|
-// MessageModel messageModel = MessageModel.valueOf(model);
|
|
|
-// if (messageModel.ordinal() == MessageModel.CLUSTERING.ordinal()) {
|
|
|
-// webSocketMap.get(map.get("toUserId")).sendMessage(body);
|
|
|
-// } else {
|
|
|
-// webSocketMap.forEach((k, v) -> {
|
|
|
-// try {
|
|
|
-// v.sendMessage(body);
|
|
|
-// } catch (IOException e) {
|
|
|
-// e.printStackTrace();
|
|
|
-// }
|
|
|
-// });
|
|
|
-// }
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
@@ -358,5 +296,13 @@ public class WebSocketOeServer implements Concurrently {
|
|
|
}
|
|
|
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//成功
|
|
|
}
|
|
|
+
|
|
|
+ public static ConcurrentHashMap<String, WebSocketOeServer> getWebSocketMap() {
|
|
|
+ return webSocketMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void setWebSocketMap(ConcurrentHashMap<String, WebSocketOeServer> webSocketMap) {
|
|
|
+ WebSocketOeServer.webSocketMap = webSocketMap;
|
|
|
+ }
|
|
|
}
|
|
|
|