From 882da62ba0b9ead07a7f1aa94db93c7ee6d2a28c Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Fri, 4 Apr 2014 16:47:55 -0400 Subject: [PATCH] INT-3354 Fix Priority Order in RedisPCMS JIRA: https://jira.spring.io/browse/INT-3354 Wrong sort order; was treating priority 0 as highest. --- .../store/RedisChannelPriorityMessageStore.java | 14 +++++++++----- .../redis/store/RedisChannelMessageStoreTests.java | 7 +++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisChannelPriorityMessageStore.java b/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisChannelPriorityMessageStore.java index 58f91927f1..d472cbfeb9 100644 --- a/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisChannelPriorityMessageStore.java +++ b/spring-integration-redis/src/main/java/org/springframework/integration/redis/store/RedisChannelPriorityMessageStore.java @@ -16,6 +16,7 @@ package org.springframework.integration.redis.store; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -33,7 +34,7 @@ import org.springframework.util.Assert; /** * Specialized Redis {@link PriorityCapableChannelMessageStore} that uses lists to back a QueueChannel. * Messages are removed in priority order ({@link IntegrationMessageHeaderAccessor#PRIORITY}). - * Priorities 0-9 are supported; higher values are treated with the same priority (none) + * Priorities 0-9 are supported (9 the highest); invalid priority values are treated with the same priority (none) * as messages with no priority header (retrieved after any messages that have a priority). *

* Requires that groupId is a String. @@ -86,9 +87,6 @@ public class RedisChannelPriorityMessageStore extends RedisChannelMessageStore i if (priority != null && priority < 10 && priority >= 0) { key = key + ":" + priority; } - else { - key = key + ":z"; - } return super.addMessageToGroup(key, message); } @@ -113,7 +111,13 @@ public class RedisChannelPriorityMessageStore extends RedisChannelMessageStore i Assert.isInstanceOf(String.class, key); list.add((String) key); } - Collections.sort(list); + Collections.sort(list, new Comparator() { + + @Override + public int compare(String s1, String s2) { + return s2.compareTo(s1); + } + }); return list; } diff --git a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java index 9dd2f29137..3aebfe9369 100644 --- a/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java +++ b/spring-integration-redis/src/test/java/org/springframework/integration/redis/store/RedisChannelMessageStoreTests.java @@ -116,7 +116,7 @@ public class RedisChannelMessageStoreTests extends RedisAvailableTests { @RedisAvailable public void testPriority() { for (int i = 0; i < 10; i++) { - Message message = MessageBuilder.withPayload(i).setPriority(9-i).build(); + Message message = MessageBuilder.withPayload(i).setPriority(i).build(); this.testChannel3.send(message); this.testChannel3.send(message); } @@ -135,11 +135,10 @@ public class RedisChannelMessageStoreTests extends RedisAvailableTests { for (int i = 0; i < 10; i++) { Message m = this.testChannel3.receive(0); assertNotNull(m); - assertEquals(Integer.valueOf(i), new IntegrationMessageHeaderAccessor(m).getPriority()); - assertEquals(Integer.valueOf(9-i), m.getPayload()); + assertEquals(Integer.valueOf(9-i), new IntegrationMessageHeaderAccessor(m).getPriority()); m = this.testChannel3.receive(0); assertNotNull(m); - assertEquals(Integer.valueOf(i), new IntegrationMessageHeaderAccessor(m).getPriority()); + assertEquals(Integer.valueOf(9-i), new IntegrationMessageHeaderAccessor(m).getPriority()); } Message m = this.testChannel3.receive(0); assertNotNull(m);