From a500e9bb2e501566e93ccf032c35121179761717 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 16 Jun 2016 12:23:59 +0200 Subject: [PATCH 1/2] DATAREDIS-505 - Allow configuration of Redis Keyspace events config value. Prepare issue branch. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e6d868411f..bc94853969 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-redis - 1.8.0.BUILD-SNAPSHOT + 1.8.0.DATAREDIS-505-SNAPSHOT Spring Data Redis From 4812dfd4190093fc1410729d16c8fe61451d39c0 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 16 Jun 2016 13:33:11 +0200 Subject: [PATCH 2/2] DATAREDIS-505 - Allow configuration of Redis Keyspace events config value. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now allow setting the desired notify-keyspace-events server configuration via @EnableRedisRepsoitories. Use `null` or an empty String for not touching the server’s config. The default is `Ex`. --- .../data/redis/core/RedisKeyValueAdapter.java | 16 +++++++- .../KeyspaceEventMessageListener.java | 22 +++++++--- .../EnableRedisRepositories.java | 9 ++++ ...RedisRepositoryConfigurationExtension.java | 2 + ...sitoryConfigurationExtensionUnitTests.java | 41 +++++++++++++++++-- 5 files changed, 78 insertions(+), 12 deletions(-) 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 b50b8250eb..70f5e6384f 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java +++ b/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java @@ -28,7 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; -import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -108,6 +107,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter private ApplicationEventPublisher eventPublisher; private EnableKeyspaceEvents enableKeyspaceEvents = EnableKeyspaceEvents.OFF; + private String keyspaceNotificationsConfigParameter = null; /** * Creates new {@link RedisKeyValueAdapter} with default {@link RedisMappingContext} and default @@ -589,6 +589,17 @@ public void setEnableKeyspaceEvents(EnableKeyspaceEvents enableKeyspaceEvents) { this.enableKeyspaceEvents = enableKeyspaceEvents; } + /** + * Configure the {@literal notify-keyspace-events} property if not already set. Use an empty {@link String} or + * {@literal null} to retain existing server settings. + * + * @param keyspaceNotificationsConfigParameter can be {@literal null}. + * @since 1.8 + */ + public void setKeyspaceNotificationsConfigParameter(String keyspaceNotificationsConfigParameter) { + this.keyspaceNotificationsConfigParameter = keyspaceNotificationsConfigParameter; + } + /** * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() * @since 1.8 @@ -611,7 +622,7 @@ public void destroy() throws Exception { this.expirationListener.get().destroy(); } - if(this.messageListenerContainer != null){ + if (this.messageListenerContainer != null) { this.messageListenerContainer.destroy(); } } @@ -669,6 +680,7 @@ private void initKeyExpirationListener() { MappingExpirationListener listener = new MappingExpirationListener(this.messageListenerContainer, this.redisOps, this.converter); + listener.setKeyspaceNotificationsConfigParameter(keyspaceNotificationsConfigParameter); if (this.eventPublisher != null) { listener.setApplicationEventPublisher(this.eventPublisher); 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 ff73b0148f..e50d2caeca 100644 --- a/src/main/java/org/springframework/data/redis/listener/KeyspaceEventMessageListener.java +++ b/src/main/java/org/springframework/data/redis/listener/KeyspaceEventMessageListener.java @@ -35,6 +35,7 @@ public abstract class KeyspaceEventMessageListener implements MessageListener, I private final RedisMessageListenerContainer listenerContainer; private static final Topic TOPIC_ALL_KEYEVENTS = new PatternTopic("__keyevent@*"); + private String keyspaceNotificationsConfigParameter = "EA"; /** * Creates new {@link KeyspaceEventMessageListener}. @@ -77,12 +78,11 @@ public void init() { RedisConnection connection = listenerContainer.getConnectionFactory().getConnection(); List config = connection.getConfig("notify-keyspace-events"); - if (config.size() == 2) { - - if (!StringUtils.hasText(config.get(1))) { - - // TODO more fine grained reaction on event configuration - connection.setConfig("notify-keyspace-events", "KEA"); + if (StringUtils.hasText(keyspaceNotificationsConfigParameter)) { + if (config.size() == 2) { + if (!StringUtils.hasText(config.get(1))) { + connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter); + } } } connection.close(); @@ -108,6 +108,16 @@ public void destroy() throws Exception { listenerContainer.removeMessageListener(this); } + /** + * Set the configuration string to use for {@literal notify-keyspace-events}. + * + * @param keyspaceNotificationsConfigParameter can be {@literal null}. + * @since 1.8 + */ + public void setKeyspaceNotificationsConfigParameter(String keyspaceNotificationsConfigParameter) { + this.keyspaceNotificationsConfigParameter = keyspaceNotificationsConfigParameter; + } + /* * (non-Javadoc) * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() diff --git a/src/main/java/org/springframework/data/redis/repository/configuration/EnableRedisRepositories.java b/src/main/java/org/springframework/data/redis/repository/configuration/EnableRedisRepositories.java index 311361a90b..7c3ac3794c 100644 --- a/src/main/java/org/springframework/data/redis/repository/configuration/EnableRedisRepositories.java +++ b/src/main/java/org/springframework/data/redis/repository/configuration/EnableRedisRepositories.java @@ -166,4 +166,13 @@ */ EnableKeyspaceEvents enableKeyspaceEvents() default EnableKeyspaceEvents.OFF; + /** + * Configure the {@literal notify-keyspace-events} property if not already set.
+ * Use an empty {@link String} to keep not alter existing server configuration. + * + * @return {@literal Ex} by default. + * @since 1.8 + */ + String keyspaceNotificationsConfigParameter() default "Ex"; + } diff --git a/src/main/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension.java b/src/main/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension.java index fd6225f30f..5c6ffabe63 100644 --- a/src/main/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension.java +++ b/src/main/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension.java @@ -128,6 +128,8 @@ public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConf MutablePropertyValues redisKeyValueAdapterProps = new MutablePropertyValues(); redisKeyValueAdapterProps.add("enableKeyspaceEvents", attributes.getEnum("enableKeyspaceEvents")); + redisKeyValueAdapterProps.add("keyspaceNotificationsConfigParameter", + attributes.getString("keyspaceNotificationsConfigParameter")); redisKeyValueAdapterDefinition.setPropertyValues(redisKeyValueAdapterProps); registerIfNotAlreadyRegistered(redisKeyValueAdapterDefinition, registry, REDIS_ADAPTER_BEAN_NAME, diff --git a/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java b/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java index 640b94eb62..fb02434e56 100644 --- a/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java @@ -93,8 +93,7 @@ public void picksUpEnableKeyspaceEventsOnStartupCorrectly() { metadata = new StandardAnnotationMetadata(Config.class, true); BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); - assertThat(getEnableKeyspaceEvents(beanDefintionRegistry), - equalTo((Object) EnableKeyspaceEvents.ON_STARTUP)); + assertThat(getEnableKeyspaceEvents(beanDefintionRegistry), equalTo((Object) EnableKeyspaceEvents.ON_STARTUP)); } /** @@ -106,8 +105,31 @@ public void picksUpEnableKeyspaceEventsDefaultCorrectly() { metadata = new StandardAnnotationMetadata(ConfigWithKeyspaceEventsDisabled.class, true); BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); - assertThat(getEnableKeyspaceEvents(beanDefintionRegistry), - equalTo((Object) EnableKeyspaceEvents.OFF)); + assertThat(getEnableKeyspaceEvents(beanDefintionRegistry), equalTo((Object) EnableKeyspaceEvents.OFF)); + } + + /** + * @see DATAREDIS-505 + */ + @Test + public void picksUpDefaultKeyspaceNotificationsConfigParameterCorrectly() { + + metadata = new StandardAnnotationMetadata(Config.class, true); + BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); + + assertThat(getKeyspaceNotificationsConfigParameter(beanDefintionRegistry), equalTo((Object) "Ex")); + } + + /** + * @see DATAREDIS-505 + */ + @Test + public void picksUpCustomKeyspaceNotificationsConfigParameterCorrectly() { + + metadata = new StandardAnnotationMetadata(ConfigWithKeyspaceEventsEnabledAndCustomEventConfig.class, true); + BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry(); + + assertThat(getKeyspaceNotificationsConfigParameter(beanDefintionRegistry), equalTo((Object) "KEA")); } private static void assertDoesNotHaveRepo(Class repositoryInterface, @@ -153,6 +175,11 @@ private Object getEnableKeyspaceEvents(BeanDefinitionRegistry beanDefintionRegis .getPropertyValue("enableKeyspaceEvents").getValue(); } + private Object getKeyspaceNotificationsConfigParameter(BeanDefinitionRegistry beanDefintionRegistry) { + return beanDefintionRegistry.getBeanDefinition("redisKeyValueAdapter").getPropertyValues() + .getPropertyValue("keyspaceNotificationsConfigParameter").getValue(); + } + @EnableRedisRepositories(considerNestedRepositories = true, enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP) static class Config { @@ -163,6 +190,12 @@ static class ConfigWithKeyspaceEventsDisabled { } + @EnableRedisRepositories(considerNestedRepositories = true, enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP, + keyspaceNotificationsConfigParameter = "KEA") + static class ConfigWithKeyspaceEventsEnabledAndCustomEventConfig { + + } + @RedisHash static class Sample { @Id String id;