Browse Source

群离线消息拉取优化

master
xsx 2 months ago
parent
commit
0d042b11c8
  1. 5
      im-platform/src/main/java/com/bx/implatform/contant/Constant.java
  2. 10
      im-platform/src/main/java/com/bx/implatform/service/GroupMemberService.java
  3. 15
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupMemberServiceImpl.java
  4. 17
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java
  5. 4
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java
  6. 7
      im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java
  7. 1
      im-platform/src/main/java/com/bx/implatform/thirdparty/MinioService.java

5
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;
}

10
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查询群聊成员包括已退出

15
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)) {

17
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);

4
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<>();
}

7
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()

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.*;

Loading…
Cancel
Save