Bläddra i källkod

群离线消息拉取优化

xsx 1 månad sedan
förälder
incheckning
0d042b11c8

+ 5 - 0
im-platform/src/main/java/com/bx/implatform/contant/Constant.java

@@ -30,4 +30,9 @@ public final class Constant {
      */
     public static final Long MAX_NORMAL_GROUP_MEMBER = 500L;
 
+    /**
+     * 离线消息最大拉取时间(天)
+     */
+    public static final Long MAX_OFFLINE_MESSAGE_DAYS = 30L;
+
 }

+ 6 - 4
im-platform/src/main/java/com/bx/implatform/service/GroupMemberService.java

@@ -1,9 +1,9 @@
 package com.bx.implatform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.bx.implatform.dto.GroupDndDTO;
 import com.bx.implatform.entity.GroupMember;
 
+import java.util.Date;
 import java.util.List;
 
 public interface GroupMemberService extends IService<GroupMember> {
@@ -26,13 +26,15 @@ public interface GroupMemberService extends IService<GroupMember> {
      */
     List<GroupMember> findByUserId(Long userId);
 
+
     /**
-     * 根据用户id查询一个月内退的群
+     * 根据用户id查询某段时间内退的群
      *
-     * @param userId 用户id
+     * @param userId      用户id
+     * @param minQuitTime 退群时间
      * @return 成员列表
      */
-    List<GroupMember> findQuitInMonth(Long userId);
+    public List<GroupMember> findQuitMembers(Long userId, Date minQuitTime);
 
     /**
      * 根据群聊id查询群聊成员(包括已退出)

+ 6 - 9
im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java

@@ -9,7 +9,6 @@ import com.bx.implatform.contant.RedisKey;
 import com.bx.implatform.entity.GroupMember;
 import com.bx.implatform.mapper.GroupMemberMapper;
 import com.bx.implatform.service.GroupMemberService;
-import com.bx.implatform.util.DateTimeUtils;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
@@ -42,7 +41,6 @@ public class GroupMemberServiceImpl extends ServiceImpl<GroupMemberMapper, Group
         return this.getOne(wrapper);
     }
 
-
     @Override
     public List<GroupMember> findByUserId(Long userId) {
         LambdaQueryWrapper<GroupMember> memberWrapper = Wrappers.lambdaQuery();
@@ -51,12 +49,12 @@ public class GroupMemberServiceImpl extends ServiceImpl<GroupMemberMapper, Group
     }
 
     @Override
-    public List<GroupMember> findQuitInMonth(Long userId) {
-        Date monthTime = DateTimeUtils.addMonths(new Date(), -1);
-        LambdaQueryWrapper<GroupMember> memberWrapper = Wrappers.lambdaQuery();
-        memberWrapper.eq(GroupMember::getUserId, userId).eq(GroupMember::getQuit, true)
-            .ge(GroupMember::getQuitTime, monthTime);
-        return this.list(memberWrapper);
+    public List<GroupMember> findQuitMembers(Long userId, Date minQuitTime) {
+        LambdaQueryWrapper<GroupMember> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(GroupMember::getUserId, userId);
+        wrapper.eq(GroupMember::getQuit, true);
+        wrapper.ge(GroupMember::getQuitTime, minQuitTime);
+        return this.list(wrapper);
     }
 
     @Override
@@ -107,7 +105,6 @@ public class GroupMemberServiceImpl extends ServiceImpl<GroupMemberMapper, Group
         this.update(wrapper);
     }
 
-
     @Override
     public Boolean isInGroup(Long groupId, List<Long> userIds) {
         if (CollectionUtils.isEmpty(userIds)) {

+ 12 - 5
im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java

@@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.bx.imclient.IMClient;
 import com.bx.imcommon.contant.IMConstant;
-import com.bx.imcommon.enums.IMTerminalType;
 import com.bx.imcommon.model.IMGroupMessage;
 import com.bx.imcommon.model.IMUserInfo;
 import com.bx.imcommon.util.CommaTextUtils;
@@ -153,8 +152,8 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
         if (groupIds.isEmpty()) {
             return Collections.EMPTY_LIST;
         }
-        // 只能拉取最近1个月的消息
-        Date minDate = DateUtils.addMonths(new Date(), -1);
+        // 只能拉取最近30天的消息
+        Date minDate = DateUtils.addDays(new Date(), Math.toIntExact(-Constant.MAX_OFFLINE_MESSAGE_DAYS));
         LambdaQueryWrapper<GroupMessage> wrapper = Wrappers.lambdaQuery();
         wrapper.gt(GroupMessage::getId, minId);
         wrapper.gt(GroupMessage::getSendTime, minDate);
@@ -162,8 +161,16 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
         wrapper.orderByDesc(GroupMessage::getId);
         wrapper.last("limit 50000");
         List<GroupMessage> messages = this.list(wrapper);
-        // 退群前的消息
-        List<GroupMember> quitMembers = groupMemberService.findQuitInMonth(session.getUserId());
+        // 查询退群前的消息
+        Date minQuitTime = minDate;
+        if (minId > 0) {
+            // 如果某个群的退群时间大于起始消息的发送时间,那消息是不用推送的,过滤掉
+            GroupMessage message = this.getById(minId);
+            if (!Objects.isNull(message) && message.getSendTime().compareTo(minDate) > 0) {
+                minQuitTime = message.getSendTime();
+            }
+        }
+        List<GroupMember> quitMembers = groupMemberService.findQuitMembers(session.getUserId(), minQuitTime);
         for (GroupMember quitMember : quitMembers) {
             wrapper = Wrappers.lambdaQuery();
             wrapper.gt(GroupMessage::getId, minId);

+ 3 - 1
im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java

@@ -35,6 +35,7 @@ import com.bx.implatform.vo.GroupVO;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.compress.utils.Lists;
+import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.cache.annotation.CacheConfig;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
@@ -235,7 +236,8 @@ public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements
         // 查询当前用户的群id列表
         List<GroupMember> groupMembers = groupMemberService.findByUserId(session.getUserId());
         // 一个月内退的群可能存在退群前的离线消息,一并返回作为前端缓存
-        groupMembers.addAll(groupMemberService.findQuitInMonth(session.getUserId()));
+        Date minDate = DateUtils.addDays(new Date(), Math.toIntExact(-Constant.MAX_OFFLINE_MESSAGE_DAYS));
+        groupMembers.addAll(groupMemberService.findQuitMembers(session.getUserId(),minDate));
         if (groupMembers.isEmpty()) {
             return new LinkedList<>();
         }

+ 3 - 4
im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java

@@ -7,10 +7,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.bx.imclient.IMClient;
 import com.bx.imcommon.contant.IMConstant;
-import com.bx.imcommon.enums.IMTerminalType;
 import com.bx.imcommon.model.IMPrivateMessage;
 import com.bx.imcommon.model.IMUserInfo;
 import com.bx.imcommon.util.ThreadPoolExecutorFactory;
+import com.bx.implatform.contant.Constant;
 import com.bx.implatform.dto.PrivateMessageDTO;
 import com.bx.implatform.entity.PrivateMessage;
 import com.bx.implatform.enums.MessageStatus;
@@ -32,7 +32,6 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.stream.Collectors;
@@ -141,8 +140,8 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
         UserSession session = SessionContext.getSession();
         // 获取当前用户的消息
         LambdaQueryWrapper<PrivateMessage> wrapper = Wrappers.lambdaQuery();
-        // 只能拉取最近1个月的消息
-        Date minDate = DateUtils.addMonths(new Date(), -1);
+        // 只能拉取最近30天的消息
+        Date minDate = DateUtils.addDays(new Date(), Math.toIntExact(-Constant.MAX_OFFLINE_MESSAGE_DAYS));
         wrapper.gt(PrivateMessage::getId, minId);
         wrapper.ge(PrivateMessage::getSendTime, minDate);
         wrapper.and(wp -> wp.eq(PrivateMessage::getSendId, session.getUserId()).or()

+ 0 - 1
im-platform/src/main/java/com/bx/implatform/thirdparty/MinioService.java

@@ -1,7 +1,6 @@
 package com.bx.implatform.thirdparty;
 
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.RandomUtil;
 import com.bx.implatform.util.DateTimeUtils;
 import com.bx.implatform.util.FileUtil;
 import io.minio.*;