im问题部分处理
This commit is contained in:
parent
1728be9c36
commit
bdb62de868
@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
|
||||||
|
@ -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 = "获取用户信息")
|
||||||
|
@ -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);
|
sessionPools.put(sessionId, session);
|
||||||
sendMessage(authUser.getId(), messageVO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -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 消息对象
|
||||||
|
*/
|
||||||
|
private void sendMessage(String sessionId, MessageVO message) {
|
||||||
|
Session session = sessionPools.get(sessionId);
|
||||||
|
sendMessage(session, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送消息
|
||||||
|
*
|
||||||
|
* @param session 会话
|
||||||
* @param message 消息对象
|
* @param message 消息对象
|
||||||
*/
|
*/
|
||||||
private void sendMessage(String key, MessageVO message) {
|
private void sendMessage(Session session, MessageVO message) {
|
||||||
Session session = sessionPools.get(key);
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user