Bläddra i källkod

fix:处理member重复创建

zhangwei 1 månad sedan
förälder
incheckning
72a88b7eb8

+ 68 - 46
application-webadmin/src/main/java/com/tourism/webadmin/app/website/service/impl/TourGroupServiceImpl.java

@@ -30,6 +30,9 @@ import com.tourism.webadmin.back.service.TourUserService;
 import com.tourism.webadmin.back.vo.TourImGroupVo;
 import com.tourism.webadmin.back.vo.TourImMemberVo;
 import com.tourism.webadmin.enums.GroupRole;
+import com.tourism.webadmin.enums.RedisLock;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -53,7 +56,8 @@ public class TourGroupServiceImpl extends ServiceImpl<TourImGroupMapper, TourImG
     private TourImMemberService tourImMemberService;
     @Autowired
     private TourImGroupInvitationService tourImGroupInvitationService;
-
+    @Autowired
+    private RedissonClient redissonClient;
     /**
      *  创建群聊
      * @param params
@@ -260,53 +264,71 @@ public class TourGroupServiceImpl extends ServiceImpl<TourImGroupMapper, TourImG
         //发送人
         TourUser fromUser = tourUserService.getById(userId);
 
-        List<TourImMember> list = tourImMemberService.lambdaQuery().eq(TourImMember::getUserId, userId)
-                .eq(TourImMember::getPartnerId, params.getGetUserId())
-                .eq(TourImMember::getDataState, 1).list();
-        if(!ObjectUtil.isEmpty(list)){
-            //之前已经有会话了
-            TourImGroup byId = getById(list.get(0).getGroupId());
-            //修改会话为显示
-            List<TourImMember> collect = list.stream().filter(item -> item.getGroupId().equals(byId.getId())&&item.getIsShow().equals(0)).collect(Collectors.toList());
-            collect.forEach(o->o.setIsShow(1));
-            tourMemberService.updateBatchById(collect);
-            //是否单聊
-            if(byId.getNoticeType()==1){
-                return list.get(0).getGroupId().toString();
-            }else {
-                return null;
-            }
+        ArrayList<String> lockString = new ArrayList<>();
+        lockString.add(toUser.getUserId().toString());
+        lockString.add(fromUser.getUserId().toString());
+        Collections.sort(lockString);//排序
+        RLock[] locks=new RLock[lockString.size()];
+        for (int i = 0; i < locks.length; i++) {
+            String s = lockString.get(i);
+            locks[i] = redissonClient.getFairLock(RedisLock.MEMBER_KEY+s);
         }
-        TourImGroup byId = getById(groupId);
-        if(ObjectUtil.isEmpty(byId)){
-            //创建group
-            TourImGroup group = new TourImGroup();
-            group.setId(Long.valueOf(groupId));
-            group.setLeaderId(userId);
-            group.setIsPublic(IsTrue.FALSE);
-            group.setGroupName(fromUser.getShowName() + "和" + toUser.getShowName()+"的单聊");
-            group.setCreateUserId(userId);
-            group.setCreateTime(new Date());
-            group.setUpdateUserId(userId);
-            group.setUpdateTime(new Date());
-            group.setNoticeType(params.getNoticeType());
-            save(group);
-            //之前没有创建会话 创建群聊和发送人的member
-            TourImMember tourImMember = new TourImMember();
-            tourImMember.setGroupId(group.getId());
-            tourImMember.setUserId(fromUser.getUserId());
-            tourImMember.setPartnerId(toUser.getUserId());
-
-            tourImMember.setCreateUserId(userId);
-            tourImMember.setCreateTime(new Date());
-            tourImMember.setUpdateUserId(userId);
-            tourImMember.setUpdateTime(new Date());
-            tourImMember.setGroupRole(GroupRole.GROUP_LEADER.getCode());
-            //保存Member
-            tourImMemberService.save(tourImMember);
-            return group.getId().toString();
+        RLock multiLock = redissonClient.getMultiLock(locks);
+        try {
+            if(multiLock.tryLock()){
+                List<TourImMember> list = tourImMemberService.lambdaQuery().eq(TourImMember::getUserId, userId)
+                        .eq(TourImMember::getPartnerId, params.getGetUserId())
+                        .eq(TourImMember::getDataState, 1).list();
+
+                if(!ObjectUtil.isEmpty(list)){
+                    //之前已经有会话了
+                    TourImGroup byId = getById(list.get(0).getGroupId());
+                    //修改会话为显示
+                    List<TourImMember> collect = list.stream().filter(item -> item.getGroupId().equals(byId.getId())&&item.getIsShow().equals(0)).collect(Collectors.toList());
+                    collect.forEach(o->o.setIsShow(1));
+                    tourMemberService.updateBatchById(collect);
+                    //是否单聊
+                    if(byId.getNoticeType()==1){
+                        return list.get(0).getGroupId().toString();
+                    }else {
+                        return null;
+                    }
+                }
+                TourImGroup byId = getById(groupId);
+                if(ObjectUtil.isEmpty(byId)){
+                    //创建group
+                    TourImGroup group = new TourImGroup();
+                    group.setId(Long.valueOf(groupId));
+                    group.setLeaderId(userId);
+                    group.setIsPublic(IsTrue.FALSE);
+                    group.setGroupName(fromUser.getShowName() + "和" + toUser.getShowName()+"的单聊");
+                    group.setCreateUserId(userId);
+                    group.setCreateTime(new Date());
+                    group.setUpdateUserId(userId);
+                    group.setUpdateTime(new Date());
+                    group.setNoticeType(params.getNoticeType());
+                    save(group);
+                    //之前没有创建会话 创建群聊和发送人的member
+                    TourImMember tourImMember = new TourImMember();
+                    tourImMember.setGroupId(group.getId());
+                    tourImMember.setUserId(fromUser.getUserId());
+                    tourImMember.setPartnerId(toUser.getUserId());
+
+                    tourImMember.setCreateUserId(userId);
+                    tourImMember.setCreateTime(new Date());
+                    tourImMember.setUpdateUserId(userId);
+                    tourImMember.setUpdateTime(new Date());
+                    tourImMember.setGroupRole(GroupRole.GROUP_LEADER.getCode());
+                    //保存Member
+                    tourImMemberService.save(tourImMember);
+                    groupId=group.getId().toString();
+                    return groupId;
+                }
+            }
+        }finally {
+            multiLock.unlock();
         }
-        return params.getGroupId();
+        return groupId;
     }
 
     /**

+ 6 - 0
application-webadmin/src/main/java/com/tourism/webadmin/enums/RedisLock.java

@@ -0,0 +1,6 @@
+package com.tourism.webadmin.enums;
+
+public interface RedisLock {
+    //创建成员锁
+     String MEMBER_KEY = "LOCK_CREATE_MEMBER:";
+}