diff --git a/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageGroup.java b/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageGroup.java index e00baac1bc..5d69139ea4 100644 --- a/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageGroup.java +++ b/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisMessageGroup.java @@ -32,6 +32,9 @@ class RedisMessageGroup implements MessageGroup { private final String MARKED_PREFIX = "MARKED_"; private final String UNMARKED_PREFIX = "UNMARKED_"; + private final String unmarkedId; + private final String markedId; + private final List> unmarked = new LinkedList>(); private final List> marked = new LinkedList>(); @@ -45,8 +48,10 @@ class RedisMessageGroup implements MessageGroup { this.groupId = groupId; this.redisTemplate = redisTemplate; this.messageStore = messageStore; - BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); - BoundListOperations markedOps = this.redisTemplate.boundListOps(MARKED_PREFIX + this.groupId.toString()); + this.unmarkedId = UNMARKED_PREFIX + groupId; + this.markedId = MARKED_PREFIX + groupId; + BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(unmarkedId); + BoundListOperations markedOps = this.redisTemplate.boundListOps(markedId); this.rebuildLocalCache(unmarkedOps, markedOps); } @@ -85,19 +90,19 @@ class RedisMessageGroup implements MessageGroup { } public int size() { - BoundListOperations mGroupOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); - long usize = mGroupOps.size(); - mGroupOps = this.redisTemplate.boundListOps(MARKED_PREFIX + this.groupId.toString()); - long msize = mGroupOps.size(); - return (int)(usize + msize); + synchronized (lock) { + return marked.size() + unmarked.size(); + } } public Message getOne() { - Message one = unmarked.get(0); - if (one == null) { - one = marked.get(0); + synchronized (lock) { + Message one = unmarked.get(0); + if (one == null) { + one = marked.get(0); + } + return one; } - return one; } public long getTimestamp() { @@ -105,13 +110,12 @@ class RedisMessageGroup implements MessageGroup { } protected void markAll() { - BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); - BoundListOperations markedOps = this.redisTemplate.boundListOps(MARKED_PREFIX + this.groupId.toString()); + BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(unmarkedId); + BoundListOperations markedOps = this.redisTemplate.boundListOps(markedId); long uSize = unmarkedOps.size(); - String destiinationKey = MARKED_PREFIX + this.groupId.toString(); synchronized (lock) { - unmarkedOps.rename(destiinationKey); + unmarkedOps.rename(markedId); this.unmarked.clear(); this.rebuildLocalCache(null, markedOps); } @@ -121,17 +125,15 @@ class RedisMessageGroup implements MessageGroup { } protected void markMessage(String messageId) { - BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); + BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(unmarkedId); List messageIds = unmarkedOps.range(0, unmarkedOps.size()-1); synchronized (lock) { for (Object id : messageIds) { if (messageId.equals(id)){ - BoundListOperations markedOps = this.redisTemplate.boundListOps(MARKED_PREFIX + this.groupId.toString()); + BoundListOperations markedOps = this.redisTemplate.boundListOps(markedId); markedOps.rightPush(id); - System.out.println(unmarkedOps.size()); unmarkedOps.remove(0, id); - System.out.println(unmarkedOps.size()); this.rebuildLocalCache(unmarkedOps, markedOps); return; } @@ -145,7 +147,7 @@ class RedisMessageGroup implements MessageGroup { */ protected void add(Message message) { String messageId = message.getHeaders().getId().toString(); - BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); + BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(unmarkedId); synchronized (lock) { unmarkedOps.rightPush(messageId); this.messageStore.addMessage(message); @@ -155,8 +157,8 @@ class RedisMessageGroup implements MessageGroup { protected void remove(Message message) { UUID messageId = message.getHeaders().getId(); - BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); - BoundListOperations markedOps = this.redisTemplate.boundListOps(MARKED_PREFIX + this.groupId.toString()); + BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(unmarkedId); + BoundListOperations markedOps = this.redisTemplate.boundListOps(markedId); synchronized (lock) { unmarkedOps.remove(0, messageId.toString()); @@ -170,19 +172,20 @@ class RedisMessageGroup implements MessageGroup { * */ protected void destroy(){ - BoundListOperations mGroupListOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); - List messageIds = mGroupListOps.range(0, mGroupListOps.size()-1); + BoundListOperations unmarkedOps = this.redisTemplate.boundListOps(unmarkedId); + List messageIds = unmarkedOps.range(0, unmarkedOps.size()-1); for (Object messageId : messageIds) { this.messageStore.removeMessage(UUID.fromString(messageId.toString())); } - this.redisTemplate.delete(UNMARKED_PREFIX + this.groupId.toString()); + this.redisTemplate.delete(unmarkedId); - mGroupListOps = this.redisTemplate.boundListOps(MARKED_PREFIX + this.groupId.toString()); - messageIds = mGroupListOps.range(0, mGroupListOps.size()-1); + BoundListOperations markedOps = this.redisTemplate.boundListOps(markedId); + messageIds = markedOps.range(0, markedOps.size()-1); for (Object messageId : messageIds) { this.messageStore.removeMessage(UUID.fromString(messageId.toString())); } - this.redisTemplate.delete(MARKED_PREFIX + this.groupId.toString()); + this.redisTemplate.delete(markedId); + this.rebuildLocalCache(unmarkedOps, markedOps); } private Collection> buildMessageList(BoundListOperations mGroupOps){ @@ -208,9 +211,9 @@ class RedisMessageGroup implements MessageGroup { else { synchronized (lock) { - BoundListOperations mGroupOps = this.redisTemplate.boundListOps(UNMARKED_PREFIX + this.groupId.toString()); + BoundListOperations mGroupOps = this.redisTemplate.boundListOps(unmarkedId); Collection> unmarked = this.buildMessageList(mGroupOps); - mGroupOps = this.redisTemplate.boundListOps(MARKED_PREFIX + this.groupId.toString()); + mGroupOps = this.redisTemplate.boundListOps(markedId); Collection> marked = this.buildMessageList(mGroupOps); if (containsSequenceNumber(unmarked, messageSequenceNumber) || containsSequenceNumber(marked, messageSequenceNumber)) { diff --git a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageGroupStoreTests.java b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageGroupStoreTests.java index 480ad2e2ce..cd13613228 100644 --- a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageGroupStoreTests.java +++ b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisMessageGroupStoreTests.java @@ -88,6 +88,8 @@ public class RedisMessageGroupStoreTests extends RedisAvailableTests { store.removeMessageGroup(1); messageGroup = store.getMessageGroup(1); + assertEquals(0, messageGroup.getMarked().size()); + assertEquals(0, messageGroup.getUnmarked().size()); assertEquals(0, messageGroup.size()); } @@ -222,6 +224,7 @@ public class RedisMessageGroupStoreTests extends RedisAvailableTests { assertNotSame(mg1, mg2); } + @Test @RedisAvailable public void testWithAggregatorWithShutdown(){