From 19ed9d2b79da889e78a428eb4a205794e7c6064d Mon Sep 17 00:00:00 2001 From: xsx <825657193@qq.com> Date: Wed, 9 Jul 2025 23:14:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8B=89=E5=8F=96=E7=A6=BB?= =?UTF-8?q?=E7=BA=BF=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/bx/imclient/IMClient.java | 11 +++++++ .../java/com/bx/imclient/sender/IMSender.java | 5 +++ .../service/impl/GroupMessageServiceImpl.java | 31 ++++++++++++------- .../impl/PrivateMessageServiceImpl.java | 5 +++ 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/im-client/src/main/java/com/bx/imclient/IMClient.java b/im-client/src/main/java/com/bx/imclient/IMClient.java index e13518e..1630d64 100644 --- a/im-client/src/main/java/com/bx/imclient/IMClient.java +++ b/im-client/src/main/java/com/bx/imclient/IMClient.java @@ -26,6 +26,17 @@ public class IMClient { return imSender.isOnline(userId); } + /** + * 判断用户是否在线 + * + * @param userId 用户id + * @param terminal 终端可惜 + */ + public Boolean isOnline(Long userId,IMTerminalType terminal){ + return imSender.isOnline(userId,terminal); + } + + /** * 判断多个用户是否在线 * diff --git a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java index 61d0a4d..1ced811 100644 --- a/im-client/src/main/java/com/bx/imclient/sender/IMSender.java +++ b/im-client/src/main/java/com/bx/imclient/sender/IMSender.java @@ -246,6 +246,11 @@ public class IMSender { return onlineMap; } + public Boolean isOnline(Long userId, IMTerminalType terminal) { + String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), terminal.code().toString()); + return redisMQTemplate.hasKey(key); + } + public Boolean isOnline(Long userId) { String key = String.join(":", IMRedisKey.IM_USER_SERVER_ID, userId.toString(), "*"); return !Objects.requireNonNull(redisMQTemplate.keys(key)).isEmpty(); diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java index f62e80f..1c9ed5e 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java @@ -158,13 +158,13 @@ public class GroupMessageServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery(); - wrapper.gt(GroupMessage::getId, minId).gt(GroupMessage::getSendTime, minDate) - .in(GroupMessage::getGroupId, groupIds).orderByAsc(GroupMessage::getId); + wrapper.gt(GroupMessage::getId, minId); + wrapper.gt(GroupMessage::getSendTime, minDate); + wrapper.in(GroupMessage::getGroupId, groupIds); + wrapper.orderByAsc(GroupMessage::getId); List messages = this.list(wrapper); // 通过群聊对消息进行分组 Map> messageGroupMap = @@ -173,9 +173,11 @@ public class GroupMessageServiceImpl extends ServiceImpl quitMembers = groupMemberService.findQuitInMonth(session.getUserId()); for (GroupMember quitMember : quitMembers) { wrapper = Wrappers.lambdaQuery(); - wrapper.gt(GroupMessage::getId, minId).between(GroupMessage::getSendTime, minDate, quitMember.getQuitTime()) - .eq(GroupMessage::getGroupId, quitMember.getGroupId()) - .ne(GroupMessage::getStatus, MessageStatus.RECALL.code()).orderByAsc(GroupMessage::getId); + wrapper.gt(GroupMessage::getId, minId); + wrapper.between(GroupMessage::getSendTime, minDate, quitMember.getQuitTime()); + wrapper.eq(GroupMessage::getGroupId, quitMember.getGroupId()); + wrapper.ne(GroupMessage::getStatus, MessageStatus.RECALL.code()); + wrapper.orderByAsc(GroupMessage::getId); List groupMessages = this.list(wrapper); messageGroupMap.put(quitMember.getGroupId(), groupMessages); groupMemberMap.put(quitMember.getGroupId(), quitMember); @@ -186,10 +188,10 @@ public class GroupMessageServiceImpl extends ServiceImpl { - // 第一次拉取时,一个群最多推送1w条消息,防止前端接收能力溢出导致卡顿 + // 第一次拉取时,一个群最多推送3000条消息,防止前端接收能力溢出导致卡顿 List sendMessages = groupMessages; - if (minId <= 0 && groupMessages.size() > 10000) { - sendMessages = groupMessages.subList(groupMessages.size() - 10000, groupMessages.size()); + if (minId <= 0 && groupMessages.size() > 3000) { + sendMessages = groupMessages.subList(groupMessages.size() - 3000, groupMessages.size()); } // 填充消息状态 String key = StrUtil.join(":", RedisKey.IM_GROUP_READED_POSITION, groupId); @@ -197,6 +199,11 @@ public class GroupMessageServiceImpl extends ServiceImpl maxIdMap = null; for (GroupMessage m : sendMessages) { + // 推送过程如果用户下线了,则不再推送 + if (!imClient.isOnline(session.getUserId(), IMTerminalType.fromCode(session.getTerminal()))) { + log.info("用户已下线,停止推送离线群聊消息,用户id:{}", session.getUserId()); + return; + } // 排除加群之前的消息 GroupMember member = groupMemberMap.get(m.getGroupId()); if (DateUtil.compare(member.getCreatedTime(), m.getSendTime()) > 0) { diff --git a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java index fb2160c..fa88b16 100644 --- a/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java +++ b/im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java @@ -154,6 +154,11 @@ public class PrivateMessageServiceImpl extends ServiceImpl sendMessage = new IMPrivateMessage<>(); sendMessage.setSender(new IMUserInfo(m.getSendId(), IMTerminalType.WEB.code()));