diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 22f158a5..c74d9d7a 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -137,6 +137,13 @@ public class MemoryMessagesStore implements IMessagesStore { private ConcurrentHashMap userPushHiddenDetail = new ConcurrentHashMap<>(); private ConcurrentHashMap userConvSlientMap = new ConcurrentHashMap<>(); + private LinkedHashMap repeatFriendRequest = new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return System.currentTimeMillis() - eldest.getValue() > 5 * 60 * 1000; + } + }; + private boolean mDisableSearch = false; private boolean mDisableNicknameSearch = false; private boolean mDisableFriendRequest = false; @@ -3120,6 +3127,18 @@ public class MemoryMessagesStore implements IMessagesStore { if (!(mFriendRequestDuration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration)) { if(System.currentTimeMillis() - existRequest.getUpdateDt() > 5 * 60 * 1000) { return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST; + } else { + mWriteLock.lock(); + try { + String repeatKey = userId + "-" + existRequest.getToUid(); + Long lastTime = repeatFriendRequest.get(repeatKey); + if(lastTime != null && System.currentTimeMillis() - lastTime < 5 * 60 * 1000) { + return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST; + } + repeatFriendRequest.put(repeatKey, System.currentTimeMillis()); + } finally { + mWriteLock.unlock(); + } } } }