Skip to content

DATAREDIS-505 - Allow configuration of Redis Keyspace events config value. #202

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.0.BUILD-SNAPSHOT</version>
<version>1.8.0.DATAREDIS-505-SNAPSHOT</version>

<name>Spring Data Redis</name>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -611,7 +622,7 @@ public void destroy() throws Exception {
this.expirationListener.get().destroy();
}

if(this.messageListenerContainer != null){
if (this.messageListenerContainer != null) {
this.messageListenerContainer.destroy();
}
}
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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}.
Expand Down Expand Up @@ -77,12 +78,11 @@ public void init() {
RedisConnection connection = listenerContainer.getConnectionFactory().getConnection();
List<String> 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();
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,13 @@
*/
EnableKeyspaceEvents enableKeyspaceEvents() default EnableKeyspaceEvents.OFF;

/**
* Configure the {@literal notify-keyspace-events} property if not already set. <br />
* Use an empty {@link String} to keep <b>not</b> alter existing server configuration.
*
* @return {@literal Ex} by default.
* @since 1.8
*/
String keyspaceNotificationsConfigParameter() default "Ex";

}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

/**
Expand All @@ -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,
Expand Down Expand Up @@ -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 {

Expand All @@ -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;
Expand Down