im问题部分处理

This commit is contained in:
Chopper711 2023-01-12 15:44:44 +08:00
parent 1728be9c36
commit bdb62de868
4 changed files with 51 additions and 55 deletions

View File

@ -16,6 +16,7 @@ public enum MessageResultType {
* 未读消息
* 历史消息
* 系统提示
* 下线提醒
*/
FRIENDS,
ADD_FRIENDS,
@ -23,6 +24,7 @@ public enum MessageResultType {
READ_MESSAGE,
UN_READ,
HISTORY,
SYSTEM_TIPS
SYSTEM_TIPS,
OFFLINE
}

View File

@ -2,6 +2,7 @@ package cn.lili.modules.im.entity.vo;
import cn.lili.modules.im.entity.enums.MessageResultType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
/**
@ -12,6 +13,7 @@ import lombok.Data;
* 2021-12-30 15:51
*/
@Data
@Builder
@AllArgsConstructor
public class MessageVO {

View File

@ -5,7 +5,6 @@ import cn.lili.common.enums.ResultUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.member.service.FootprintService;
@ -38,11 +37,9 @@ public class ImUserController {
private final MemberService memberService;
@Autowired
private StoreService storeService;
private final StoreService storeService;
@Autowired
private FootprintService footprintService;
private final FootprintService footprintService;
@GetMapping
@ApiOperation(value = "获取用户信息")

View File

@ -1,6 +1,6 @@
package cn.lili.controller.im;
import cn.lili.cache.Cache;
import cn.hutool.json.JSONUtil;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.enums.UserEnums;
@ -12,11 +12,10 @@ import cn.lili.modules.im.entity.vo.MessageOperation;
import cn.lili.modules.im.entity.vo.MessageVO;
import cn.lili.modules.im.service.ImMessageService;
import cn.lili.modules.im.service.ImTalkService;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.store.service.StoreService;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@ -35,53 +34,46 @@ import java.util.concurrent.ConcurrentHashMap;
@ServerEndpoint(value = "/lili/webSocket/{accessToken}", configurator = CustomSpringConfigurator.class)
@Scope("prototype")
@Slf4j
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class WebSocketServer {
/**
* 消息服务
*/
@Autowired
private ImMessageService imMessageService;
private final ImMessageService imMessageService;
/**
* im用户服务
*/
@Autowired
private MemberService memberService;
private final ImTalkService imTalkService;
@Autowired
private StoreService storeService;
@Autowired
private ImTalkService imTalkService;
@Autowired
private Cache cache;
/**
* 在线人数
* PS 注意只能单节点如果多节点部署需要自行寻找方案
*/
private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
/**
* 建立连接
*
* @param session
*/
@OnOpen
public void onOpen(@PathParam("accessToken") String accessToken, Session session) throws IOException {
AuthUser authUser = UserContext.getAuthUser(accessToken);
Object message = null;
if (UserEnums.STORE.equals(authUser.getRole())) {
message = storeService.getById(authUser.getStoreId());
sessionPools.put(authUser.getStoreId(), session);
public void onOpen(@PathParam("accessToken") String accessToken, Session session) {
} else if (UserEnums.MEMBER.equals(authUser.getRole())) {
message = memberService.getById(authUser.getId());
sessionPools.put(authUser.getId(), session);
AuthUser authUser = UserContext.getAuthUser(accessToken);
String sessionId = UserEnums.STORE.equals(authUser.getRole()) ? authUser.getStoreId() : authUser.getId();
//如果已有会话则进行下线提醒
if (sessionPools.containsKey(sessionId)) {
log.info("用户重复登陆,旧用户下线");
Session oldSession = sessionPools.get(sessionId);
sendMessage(oldSession, MessageVO.builder().messageResultType(MessageResultType.OFFLINE).result("用户异地登陆").build());
try {
oldSession.close();
} catch (Exception e) {
e.printStackTrace();
}
}
MessageVO messageVO = new MessageVO(MessageResultType.FRIENDS, message);
sendMessage(authUser.getId(), messageVO);
sessionPools.put(sessionId, session);
}
/**
@ -89,8 +81,9 @@ public class WebSocketServer {
*/
@OnClose
public void onClose(@PathParam("accessToken") String accessToken) {
log.info("断开连接:{}", accessToken);
sessionPools.remove(UserContext.getAuthUser(accessToken).getId());
AuthUser authUser = UserContext.getAuthUser(accessToken);
log.info("用户断开断开连接:{}", JSONUtil.toJsonStr(authUser));
sessionPools.remove(authUser);
}
/**
@ -101,7 +94,7 @@ public class WebSocketServer {
*/
@OnMessage
public void onMessage(@PathParam("accessToken") String accessToken, String msg) {
log.error(msg);
log.info("发送消息:{}", msg);
MessageOperation messageOperation = JSON.parseObject(msg, MessageOperation.class);
operation(accessToken, messageOperation);
}
@ -123,9 +116,9 @@ public class WebSocketServer {
ImMessage imMessage = new ImMessage(messageOperation);
imMessageService.save(imMessage);
//修改最后消息信息
imTalkService.update(new LambdaUpdateWrapper<ImTalk>().eq(ImTalk::getId,messageOperation.getTalkId()).set(ImTalk::getLastTalkMessage,messageOperation.getContext())
.set(ImTalk::getLastTalkTime,imMessage.getCreateTime())
.set(ImTalk::getLastMessageType,imMessage.getMessageType()));
imTalkService.update(new LambdaUpdateWrapper<ImTalk>().eq(ImTalk::getId, messageOperation.getTalkId()).set(ImTalk::getLastTalkMessage, messageOperation.getContext())
.set(ImTalk::getLastTalkTime, imMessage.getCreateTime())
.set(ImTalk::getLastMessageType, imMessage.getMessageType()));
//发送消息
sendMessage(messageOperation.getTo(), new MessageVO(MessageResultType.MESSAGE, imMessage));
break;
@ -148,15 +141,25 @@ public class WebSocketServer {
/**
* 发送消息
*
* @param key 密钥
* @param sessionId sessionId
* @param message 消息对象
*/
private void sendMessage(String sessionId, MessageVO message) {
Session session = sessionPools.get(sessionId);
sendMessage(session, message);
}
/**
* 发送消息
*
* @param session 会话
* @param message 消息对象
*/
private void sendMessage(String key, MessageVO message) {
Session session = sessionPools.get(key);
private void sendMessage(Session session, MessageVO message) {
if (session != null) {
try {
session.getBasicRemote().sendText(JSON.toJSONString(message, true));
} catch (IOException e) {
} catch (Exception e) {
e.printStackTrace();
}
}
@ -170,16 +173,8 @@ public class WebSocketServer {
*/
@OnError
public void onError(Session session, Throwable throwable) {
throwable.printStackTrace();
log.error("socket异常: {}", session.getId(), throwable);
}
/**
* 获取店铺id
*
* @return
*/
private String storeKey(String storeId) {
return "STORE_" + storeId;
}
}