From 1a72de0e85ba58a603db8ddd237749d089e7fe8d Mon Sep 17 00:00:00 2001 From: "heavyrain.lee" Date: Tue, 6 Aug 2019 22:54:57 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BE=A4=E7=BB=84=E5=8F=8D?= =?UTF-8?q?=E5=A4=8D=E6=B7=BB=E5=8A=A0=E5=88=A0=E9=99=A4=E7=BE=A4=E6=88=90?= =?UTF-8?q?=E5=91=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../imhandler/KickoffGroupMember.java | 6 ++ .../moquette/persistence/DatabaseStore.java | 71 ++++++++++++++- .../persistence/MemoryMessagesStore.java | 88 +++---------------- .../src/main/java/win/liyufan/im/IDUtils.java | 2 +- 4 files changed, 87 insertions(+), 80 deletions(-) diff --git a/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java b/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java index 77a2b940..9582ece9 100644 --- a/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java +++ b/broker/src/main/java/io/moquette/imhandler/KickoffGroupMember.java @@ -27,6 +27,12 @@ public class KickoffGroupMember extends GroupHandler groupMembers) { + Connection connection = null; + PreparedStatement statement = null; + PreparedStatement statement2 = null; + try { + connection = DBUtil.getConnection(); + connection.setAutoCommit(false); + + StringBuilder sqlBuilder = new StringBuilder("update t_group_member set `_type` = ?, `_dt` = ? where `_mid` in ("); + for (int i = 0; i < groupMembers.size(); i++) { + sqlBuilder.append("?"); + if (i != groupMembers.size()-1) { + sqlBuilder.append(","); + } + } + sqlBuilder.append(")"); + + sqlBuilder.append(" and _gid = ?"); + + statement = connection.prepareStatement(sqlBuilder.toString()); + + int index = 1; + long current = System.currentTimeMillis(); + statement.setInt(index++, ProtoConstants.GroupMemberType.GroupMemberType_Removed); + statement.setLong(index++, current); + + for (String memberId:groupMembers) { + statement.setString(index++, memberId); + } + statement.setString(index++, groupId); + + int count = statement.executeUpdate(); + LOG.info("Update rows {}", count); + + String sql = "update t_group set `_member_count` = `_member_count` - ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?"; + + statement2 = connection.prepareStatement(sql); + index = 1; + statement2.setInt(index++, count); + statement2.setLong(index++, current); + statement2.setLong(index++, current); + statement2.setString(index++, groupId); + statement2.executeUpdate(); + connection.commit(); + connection.setAutoCommit(true); + } catch (SQLException e) { + // TODO Auto-generated catch block + if (connection != null) { + try { + connection.commit(); + connection.setAutoCommit(true); + } catch (SQLException e1) { + e1.printStackTrace(); + } + } + e.printStackTrace(); + Utility.printExecption(LOG, e); + } finally { + DBUtil.closeDB(connection, statement); + DBUtil.closeDB(connection, statement2); + } + return 0; + } + WFCMessage.GroupInfo getPersistGroupInfo(String groupId) { Connection connection = null; PreparedStatement statement = null; diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 5156f768..811b5568 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -713,53 +713,21 @@ public class MemoryMessagesStore implements IMessagesStore { @Override public ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List memberList) { - HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); - IMap mIMap = hzInstance.getMap(GROUPS_MAP); + removeGroupMember(groupId, memberList); + removeFavGroup(groupId, memberList); + removeGroupUserSettings(groupId, memberList); + return ErrorCode.ERROR_CODE_SUCCESS; + } - WFCMessage.GroupInfo groupInfo = mIMap.get(groupId); - if (groupInfo == null) { - return ErrorCode.ERROR_CODE_NOT_EXIST; - } - if (!isAdmin && ((groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) - && (groupInfo.getOwner() == null || !groupInfo.getOwner().equals(operator)))) { - return ErrorCode.ERROR_CODE_NOT_RIGHT; - } + void removeGroupMember(String groupId, List memberIds) { + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + databaseStore.removeGroupMember(groupId, memberIds); MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); + groupMembers.remove(groupId); + IMap mIMap = hzInstance.getMap(GROUPS_MAP); + mIMap.evict(groupId); - int removeCount = 0; - long updateDt = System.currentTimeMillis(); - ArrayList list = new ArrayList<>(); - Collection members = groupMembers.get(groupId); - if (members == null || members.size() == 0) { - members = loadGroupMemberFromDB(hzInstance, groupId); - } - - List allMembers = new ArrayList<>(members); - - List removedIds = new ArrayList<>(); - for (WFCMessage.GroupMember member : allMembers) { - if (memberList.contains(member.getMemberId())) { - boolean removed = groupMembers.remove(groupId, member); - if (removed) { - removeCount++; - member = member.toBuilder().setType(GroupMemberType_Removed).setUpdateDt(updateDt).build(); - groupMembers.put(groupId, member); - list.add(member); - removedIds.add(member.getMemberId()); - } - } - } - - if (removeCount > 0) { - databaseStore.persistGroupMember(groupId, list); - databaseStore.updateGroupMemberCountDt(groupId, groupInfo.getMemberCount()-removeCount, updateDt); - mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(groupInfo.getMemberCount() - removeCount).build()); - } - - removeFavGroup(groupId, removedIds); - removeGroupUserSettings(groupId, removedIds); - return ErrorCode.ERROR_CODE_SUCCESS; } void removeFavGroup(String groupId, List memberIds) { @@ -798,34 +766,8 @@ public class MemoryMessagesStore implements IMessagesStore { if (groupInfo.getType() != ProtoConstants.GroupType.GroupType_Free && groupInfo.getOwner() != null && groupInfo.getOwner().equals(operator)) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } - MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); - - long updateDt = System.currentTimeMillis(); - boolean removed = false; - Collection members = groupMembers.get(groupId); - if (members == null || members.size() == 0) { - members = loadGroupMemberFromDB(hzInstance, groupId); - } - for (WFCMessage.GroupMember member : members) { - if (member.getMemberId().equals(operator)) { - removed = groupMembers.remove(groupId, member); - if (removed) { - ArrayList list = new ArrayList<>(); - list.add(member); - databaseStore.persistGroupMember(groupId, list); - - databaseStore.updateGroupMemberCountDt(groupId, groupInfo.getMemberCount()-1, updateDt); - member = member.toBuilder().setType(GroupMemberType_Removed).setUpdateDt(updateDt).build(); - groupMembers.put(groupId, member); - } - break; - } - } - - if (removed) { - mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(groupInfo.getMemberCount() - 1).build()); - } + removeGroupMember(groupId, Arrays.asList(operator)); removeFavGroup(groupId, Arrays.asList(operator)); removeGroupUserSettings(groupId, Arrays.asList(operator)); return ErrorCode.ERROR_CODE_SUCCESS; @@ -1018,12 +960,6 @@ public class MemoryMessagesStore implements IMessagesStore { IMap mIMap = hzInstance.getMap(GROUPS_MAP); WFCMessage.GroupInfo groupInfo = mIMap.get(groupId); - if (groupInfo == null) { - groupInfo = databaseStore.getPersistGroupInfo(groupId); - if (groupInfo != null) { - mIMap.put(groupId, groupInfo); - } - } return groupInfo; } diff --git a/broker/src/main/java/win/liyufan/im/IDUtils.java b/broker/src/main/java/win/liyufan/im/IDUtils.java index 874912ab..3c8b3a3a 100644 --- a/broker/src/main/java/win/liyufan/im/IDUtils.java +++ b/broker/src/main/java/win/liyufan/im/IDUtils.java @@ -33,7 +33,7 @@ public class IDUtils { return ch - 'a' + 26; } else if(ch >= '0' && ch <= '9') { return ch - '0' + 52; - } else if(ch == '_') { + } else if(ch == '+') { return 62; } return 63;