Commit 0d8525e6 by Future

rizhi

parent 14ae576c
......@@ -98,23 +98,31 @@ public class NormalChatAction {
// if (log.isDebugEnabled()) {
// log.debug("接收到参数,reqId: {},\n data: {}, ", reqId, data);
// }
Long conTime = System.currentTimeMillis();
ImConversationQueryVo conversation = ehcacheService.getEhCacheConversation(data.getToConversation());
log.info("获取会话缓存耗时 {}", System.currentTimeMillis() - conTime);
if (conversation == null) {
log.warn("会reqId: {} ,会话id: {}db中不存在", reqId, data.getToConversation());
return;
}
// 查询发送者client
Long clientTime = System.currentTimeMillis();
ImClient imClientSender = ehcacheService.getEhCacheClient(request.getSenderClientId());
log.info("获取用户缓存耗时 {}", System.currentTimeMillis() - clientTime);
if (imClientSender == null) {
log.warn("根据senderClientId: {} 查找不到 imClientSender!", request.getSenderClientId());
return;
}
// 查询imApplication
Long appTime = System.currentTimeMillis();
ImApplication imApplication = imApplicationService.getCacheById(imClientSender.getFkAppid());
log.info("获取app缓存耗时 {}", System.currentTimeMillis() - appTime);
// 给所有人(在线+离线)遍历发送
// 先查询该会话所有成员
Long memberTime = System.currentTimeMillis();
List<ImConversationMembers> membersList = ehcacheService.getEhCacheMember("member"+conversation.getId(), conversation.getId());
log.info("获取成员缓存耗时 {}", System.currentTimeMillis() - memberTime);
if (membersList.isEmpty()) {
log.info("查询会话所有成员返回空,会话ID: {}", data.getToConversation());
WsResponse<HashMap<String, Long>> responseModel = new WsResponse<>();
......@@ -126,8 +134,11 @@ public class NormalChatAction {
channelSender.sendMsgLocal((NioSocketChannel) request.getSenderChannel(), responseModel);
return;
}
Long memberMapTime = System.currentTimeMillis();
Map<Long, ImConversationMembers> memberMap = membersList.stream().collect(Collectors.toMap(ImConversationMembers::getFkClientId, member -> member));
log.info("获取成员map耗时 {}", System.currentTimeMillis() - memberMapTime);
Long checkTime = System.currentTimeMillis();
// 判断为单聊
if (ChatTypeEnum.SINGLE.getCode().equals(conversation.getChatType())) {
// 判断是否被拉黑逻辑
......@@ -150,14 +161,22 @@ public class NormalChatAction {
return;
}
}
log.info("消息校验耗时 {}", System.currentTimeMillis() - checkTime);
Long neirongTime = System.currentTimeMillis();
// 消息内容校验
if (!checkMsg(imClientSender, conversation, reqId, data, request.getSenderChannel(), memberMap)) {
return;
}
log.info("消息校验耗时 {}", System.currentTimeMillis() - neirongTime);
Long messageTime = System.currentTimeMillis();
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(data, imClientSender, imApplication.getId());
log.info("消息校验耗时 {}", System.currentTimeMillis() - messageTime);
// 入库 保存收件箱
Long inboxTime = System.currentTimeMillis();
batchSaveInbox(imApplication, imClientSender, conversation, imMessageOnlineSend.getMsgId(), membersList);
log.info("收件箱耗时 {}", System.currentTimeMillis() - inboxTime);
// 入库成功后 判断是否是临时会话 如果是,双方会话display状态是否是1(显示),如果不是,需要修改为是
if (ChatTypeEnum.TEMP.getCode().equals(conversation.getChatType())) {
// 木有只有私聊一种临时会话类型
......@@ -172,6 +191,7 @@ public class NormalChatAction {
imConversationMembersService.updateBatchById(tempMemberToUpdate);
}
}
Long pushTime = System.currentTimeMillis();
final Boolean isPush = ehcacheService.getIsPush("push" + conversation.getId());
// 多线程处理消息下发
for (ImConversationMembers member : membersList) {
......@@ -183,14 +203,19 @@ public class NormalChatAction {
this.sendMsgToMember(imApplication, member, imMessageOnlineSend, data.getPush(), isPush);
});
}
log.info("push耗时 {}", System.currentTimeMillis() - pushTime);
// 响应发送方消息id等信息
Long resTime = System.currentTimeMillis();
response(reqId, imMessageOnlineSend.getMsgId(), request.getSenderChannel());
log.info("响应耗时 {}", System.currentTimeMillis() - resTime);
}
private void sendMsgToMember(ImApplication imApplication, ImConversationMembers member, ImMessageOnlineSend imMessageOnlineSend, PushVO push, Boolean isPush) {
// 在线用户直接发消息
Long onlienTime = System.currentTimeMillis();
Boolean sendSuccess = sendMsgForOnline(member.getFkClientId(), imMessageOnlineSend);
log.info("单用户在线下发耗时 {}", System.currentTimeMillis() - onlienTime);
if (isPush && !sendSuccess && !member.getDoNotDisturb()) {
// 异步推送系统通知消息 5分钟内推一次消息
PushDTO pushDTO = mqSender.buildPushDto(push, member.getFkClientId(), member.getClientId(), imApplication);
......@@ -229,11 +254,8 @@ public class NormalChatAction {
private ImMessageOnlineSend assembleImMessageOnlineSend(ChatContentVo data, ImClient imClientSender, Long appId) {
// 入库 保存消息至消息表
ImClientSimpleDto client = new ImClientSimpleDto().setId(imClientSender.getId()).setFkAppid(appId);
Long time = System.currentTimeMillis();
ImMessage imMessage = imMessageService.saveImMessage(client, data);
log.info("外层插入落库耗时 {}", System.currentTimeMillis() - time);
Long resTime =System.currentTimeMillis();
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
......@@ -250,7 +272,6 @@ public class NormalChatAction {
imMessageOnlineSend.setSystemFlag(imMessage.getSystemFlag());
imMessageOnlineSend.setType(data.getType());
imMessageOnlineSend.setAt(imMessage.getAt());
log.info("构造响应时间 {}", System.currentTimeMillis() - resTime);
return imMessageOnlineSend;
}
......
......@@ -224,7 +224,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
// 数据库字段类型为JSON格式
// 因mysql关系型数据库非MongoDB文档类型数据库,第三方应用拓展的自定义参数名和值需使用json格式落库
Long jsonTime = System.currentTimeMillis();
String contentJsonString = JsonUtils.encodeJson(data);
log.info("encode json time {}", System.currentTimeMillis()-jsonTime);
imMessage.setContent(contentJsonString);
imMessage.setId(SnowflakeUtil.getId());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment