diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultMessage.java b/src/main/java/org/springframework/data/redis/connection/DefaultMessage.java index e32d8ad89..171ae6985 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultMessage.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultMessage.java @@ -23,9 +23,11 @@ import org.springframework.util.Assert; * * @author Costin Leau * @author Christoph Strobl + * @author Mark Paluch */ public class DefaultMessage implements Message { + private static final byte[] EMPTY = new byte[0]; private final byte[] channel; private final byte[] body; private @Nullable String toString; @@ -39,15 +41,14 @@ public class DefaultMessage implements Message { this.channel = channel; } - /** - * @return - */ + @Override public byte[] getChannel() { - return channel.clone(); + return channel.length == 0 ? EMPTY : channel.clone(); } + @Override public byte[] getBody() { - return body.clone(); + return body.length == 0 ? EMPTY : body.clone(); } @Override diff --git a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java b/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java index 2c4fa43de..428e703b9 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java +++ b/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java @@ -808,8 +808,9 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter Object value = CollectionUtils.isEmpty(hash) ? null : converter.read(Object.class, new RedisData(hash)); - String channel = !ObjectUtils.isEmpty(message.getChannel()) - ? converter.getConversionService().convert(message.getChannel(), String.class) + byte[] channelAsBytes = message.getChannel(); + String channel = !ObjectUtils.isEmpty(channelAsBytes) + ? converter.getConversionService().convert(channelAsBytes, String.class) : null; RedisKeyExpiredEvent event = new RedisKeyExpiredEvent(channel, key, value); @@ -825,11 +826,6 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter } private boolean isKeyExpirationMessage(Message message) { - - if (message == null) { - return false; - } - return BinaryKeyspaceIdentifier.isValid(message.getBody()); } } diff --git a/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java b/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java index fc8a8a764..990a72d19 100644 --- a/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java +++ b/src/main/java/org/springframework/data/redis/core/convert/MappingRedisConverter.java @@ -1303,7 +1303,7 @@ public class MappingRedisConverter implements RedisConverter, InitializingBean { */ public static boolean isValid(byte[] key) { - if (key == null) { + if (key.length == 0) { return false; } diff --git a/src/main/java/org/springframework/data/redis/listener/KeyspaceEventMessageListener.java b/src/main/java/org/springframework/data/redis/listener/KeyspaceEventMessageListener.java index f4911aa95..7f90c201c 100644 --- a/src/main/java/org/springframework/data/redis/listener/KeyspaceEventMessageListener.java +++ b/src/main/java/org/springframework/data/redis/listener/KeyspaceEventMessageListener.java @@ -60,7 +60,7 @@ public abstract class KeyspaceEventMessageListener implements MessageListener, I @Override public void onMessage(Message message, @Nullable byte[] pattern) { - if (message == null || ObjectUtils.isEmpty(message.getChannel()) || ObjectUtils.isEmpty(message.getBody())) { + if (ObjectUtils.isEmpty(message.getChannel()) || ObjectUtils.isEmpty(message.getBody())) { return; } diff --git a/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java b/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java index 2f53a0c76..c7138a536 100644 --- a/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java +++ b/src/main/java/org/springframework/data/redis/listener/RedisMessageListenerContainer.java @@ -979,10 +979,11 @@ public class RedisMessageListenerContainer implements InitializingBean, Disposab } } - private void dispatchMessage(Collection listeners, final Message message, final byte[] pattern) { - final byte[] source = (pattern != null ? pattern.clone() : message.getChannel()); + private void dispatchMessage(Collection listeners, Message message, @Nullable byte[] pattern) { - for (final MessageListener messageListener : listeners) { + byte[] source = (pattern != null ? pattern.clone() : message.getChannel()); + + for (MessageListener messageListener : listeners) { taskExecutor.execute(() -> processMessage(messageListener, message, source)); } } diff --git a/src/test/java/org/springframework/data/redis/core/convert/BinaryKeyspaceIdentifierUnitTests.java b/src/test/java/org/springframework/data/redis/core/convert/BinaryKeyspaceIdentifierUnitTests.java index 098d52453..4e9d158b3 100644 --- a/src/test/java/org/springframework/data/redis/core/convert/BinaryKeyspaceIdentifierUnitTests.java +++ b/src/test/java/org/springframework/data/redis/core/convert/BinaryKeyspaceIdentifierUnitTests.java @@ -31,7 +31,6 @@ public class BinaryKeyspaceIdentifierUnitTests { @Test // DATAREDIS-744 public void shouldReturnIfKeyIsValid() { - assertThat(BinaryKeyspaceIdentifier.isValid(null)).isFalse(); assertThat(BinaryKeyspaceIdentifier.isValid("foo".getBytes())).isFalse(); assertThat(BinaryKeyspaceIdentifier.isValid("".getBytes())).isFalse(); assertThat(BinaryKeyspaceIdentifier.isValid("foo:bar".getBytes())).isTrue(); diff --git a/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java b/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java index 4be14d9a6..4ac48a884 100644 --- a/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/listener/KeyExpirationEventMessageListenerUnitTests.java @@ -64,14 +64,6 @@ public class KeyExpirationEventMessageListenerUnitTests { assertThat((byte[]) captor.getValue().getSource()).isEqualTo(MESSAGE_BODY.getBytes()); } - @Test // DATAREDIS-425 - public void handleMessageShouldNotRespondToNullMessage() { - - listener.onMessage(null, "*".getBytes()); - - verifyZeroInteractions(publisherMock); - } - @Test // DATAREDIS-425, DATAREDIS-692 public void handleMessageShouldNotRespondToEmptyMessage() {