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, FRIENDS,
ADD_FRIENDS, ADD_FRIENDS,
@ -23,6 +24,7 @@ public enum MessageResultType {
READ_MESSAGE, READ_MESSAGE,
UN_READ, UN_READ,
HISTORY, 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 cn.lili.modules.im.entity.enums.MessageResultType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
/** /**
@ -12,6 +13,7 @@ import lombok.Data;
* 2021-12-30 15:51 * 2021-12-30 15:51
*/ */
@Data @Data
@Builder
@AllArgsConstructor @AllArgsConstructor
public class MessageVO { 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.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.vo.ResultMessage; 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.dos.Member;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams; import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.member.service.FootprintService; import cn.lili.modules.member.service.FootprintService;
@ -38,11 +37,9 @@ public class ImUserController {
private final MemberService memberService; private final MemberService memberService;
@Autowired private final StoreService storeService;
private StoreService storeService;
@Autowired private final FootprintService footprintService;
private FootprintService footprintService;
@GetMapping @GetMapping
@ApiOperation(value = "获取用户信息") @ApiOperation(value = "获取用户信息")

View File

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