Skip to content

Commit 65c7b2c

Browse files
christophstroblmp911de
authored andcommitted
DATAREDIS-505 - Allow configuration of Redis Keyspace events config value.
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`. Original pull request: #202.
1 parent 64456ea commit 65c7b2c

File tree

5 files changed

+78
-12
lines changed

5 files changed

+78
-12
lines changed

src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import org.slf4j.Logger;
2929
import org.slf4j.LoggerFactory;
3030
import org.springframework.beans.BeansException;
31-
import org.springframework.beans.factory.DisposableBean;
3231
import org.springframework.beans.factory.InitializingBean;
3332
import org.springframework.context.ApplicationContext;
3433
import org.springframework.context.ApplicationContextAware;
@@ -108,6 +107,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
108107
private ApplicationEventPublisher eventPublisher;
109108

110109
private EnableKeyspaceEvents enableKeyspaceEvents = EnableKeyspaceEvents.OFF;
110+
private String keyspaceNotificationsConfigParameter = null;
111111

112112
/**
113113
* Creates new {@link RedisKeyValueAdapter} with default {@link RedisMappingContext} and default
@@ -589,6 +589,17 @@ public void setEnableKeyspaceEvents(EnableKeyspaceEvents enableKeyspaceEvents) {
589589
this.enableKeyspaceEvents = enableKeyspaceEvents;
590590
}
591591

592+
/**
593+
* Configure the {@literal notify-keyspace-events} property if not already set. Use an empty {@link String} or
594+
* {@literal null} to retain existing server settings.
595+
*
596+
* @param keyspaceNotificationsConfigParameter can be {@literal null}.
597+
* @since 1.8
598+
*/
599+
public void setKeyspaceNotificationsConfigParameter(String keyspaceNotificationsConfigParameter) {
600+
this.keyspaceNotificationsConfigParameter = keyspaceNotificationsConfigParameter;
601+
}
602+
592603
/**
593604
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
594605
* @since 1.8
@@ -611,7 +622,7 @@ public void destroy() throws Exception {
611622
this.expirationListener.get().destroy();
612623
}
613624

614-
if(this.messageListenerContainer != null){
625+
if (this.messageListenerContainer != null) {
615626
this.messageListenerContainer.destroy();
616627
}
617628
}
@@ -669,6 +680,7 @@ private void initKeyExpirationListener() {
669680

670681
MappingExpirationListener listener = new MappingExpirationListener(this.messageListenerContainer, this.redisOps,
671682
this.converter);
683+
listener.setKeyspaceNotificationsConfigParameter(keyspaceNotificationsConfigParameter);
672684

673685
if (this.eventPublisher != null) {
674686
listener.setApplicationEventPublisher(this.eventPublisher);

src/main/java/org/springframework/data/redis/listener/KeyspaceEventMessageListener.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public abstract class KeyspaceEventMessageListener implements MessageListener, I
3535

3636
private final RedisMessageListenerContainer listenerContainer;
3737
private static final Topic TOPIC_ALL_KEYEVENTS = new PatternTopic("__keyevent@*");
38+
private String keyspaceNotificationsConfigParameter = "EA";
3839

3940
/**
4041
* Creates new {@link KeyspaceEventMessageListener}.
@@ -77,12 +78,11 @@ public void init() {
7778
RedisConnection connection = listenerContainer.getConnectionFactory().getConnection();
7879
List<String> config = connection.getConfig("notify-keyspace-events");
7980

80-
if (config.size() == 2) {
81-
82-
if (!StringUtils.hasText(config.get(1))) {
83-
84-
// TODO more fine grained reaction on event configuration
85-
connection.setConfig("notify-keyspace-events", "KEA");
81+
if (StringUtils.hasText(keyspaceNotificationsConfigParameter)) {
82+
if (config.size() == 2) {
83+
if (!StringUtils.hasText(config.get(1))) {
84+
connection.setConfig("notify-keyspace-events", keyspaceNotificationsConfigParameter);
85+
}
8686
}
8787
}
8888
connection.close();
@@ -108,6 +108,16 @@ public void destroy() throws Exception {
108108
listenerContainer.removeMessageListener(this);
109109
}
110110

111+
/**
112+
* Set the configuration string to use for {@literal notify-keyspace-events}.
113+
*
114+
* @param keyspaceNotificationsConfigParameter can be {@literal null}.
115+
* @since 1.8
116+
*/
117+
public void setKeyspaceNotificationsConfigParameter(String keyspaceNotificationsConfigParameter) {
118+
this.keyspaceNotificationsConfigParameter = keyspaceNotificationsConfigParameter;
119+
}
120+
111121
/*
112122
* (non-Javadoc)
113123
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()

src/main/java/org/springframework/data/redis/repository/configuration/EnableRedisRepositories.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,4 +166,13 @@
166166
*/
167167
EnableKeyspaceEvents enableKeyspaceEvents() default EnableKeyspaceEvents.OFF;
168168

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

src/main/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtension.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConf
128128

129129
MutablePropertyValues redisKeyValueAdapterProps = new MutablePropertyValues();
130130
redisKeyValueAdapterProps.add("enableKeyspaceEvents", attributes.getEnum("enableKeyspaceEvents"));
131+
redisKeyValueAdapterProps.add("keyspaceNotificationsConfigParameter",
132+
attributes.getString("keyspaceNotificationsConfigParameter"));
131133
redisKeyValueAdapterDefinition.setPropertyValues(redisKeyValueAdapterProps);
132134

133135
registerIfNotAlreadyRegistered(redisKeyValueAdapterDefinition, registry, REDIS_ADAPTER_BEAN_NAME,

src/test/java/org/springframework/data/redis/repository/configuration/RedisRepositoryConfigurationExtensionUnitTests.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@ public void picksUpEnableKeyspaceEventsOnStartupCorrectly() {
9393
metadata = new StandardAnnotationMetadata(Config.class, true);
9494
BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry();
9595

96-
assertThat(getEnableKeyspaceEvents(beanDefintionRegistry),
97-
equalTo((Object) EnableKeyspaceEvents.ON_STARTUP));
96+
assertThat(getEnableKeyspaceEvents(beanDefintionRegistry), equalTo((Object) EnableKeyspaceEvents.ON_STARTUP));
9897
}
9998

10099
/**
@@ -106,8 +105,31 @@ public void picksUpEnableKeyspaceEventsDefaultCorrectly() {
106105
metadata = new StandardAnnotationMetadata(ConfigWithKeyspaceEventsDisabled.class, true);
107106
BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry();
108107

109-
assertThat(getEnableKeyspaceEvents(beanDefintionRegistry),
110-
equalTo((Object) EnableKeyspaceEvents.OFF));
108+
assertThat(getEnableKeyspaceEvents(beanDefintionRegistry), equalTo((Object) EnableKeyspaceEvents.OFF));
109+
}
110+
111+
/**
112+
* @see DATAREDIS-505
113+
*/
114+
@Test
115+
public void picksUpDefaultKeyspaceNotificationsConfigParameterCorrectly() {
116+
117+
metadata = new StandardAnnotationMetadata(Config.class, true);
118+
BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry();
119+
120+
assertThat(getKeyspaceNotificationsConfigParameter(beanDefintionRegistry), equalTo((Object) "Ex"));
121+
}
122+
123+
/**
124+
* @see DATAREDIS-505
125+
*/
126+
@Test
127+
public void picksUpCustomKeyspaceNotificationsConfigParameterCorrectly() {
128+
129+
metadata = new StandardAnnotationMetadata(ConfigWithKeyspaceEventsEnabledAndCustomEventConfig.class, true);
130+
BeanDefinitionRegistry beanDefintionRegistry = getBeanDefinitionRegistry();
131+
132+
assertThat(getKeyspaceNotificationsConfigParameter(beanDefintionRegistry), equalTo((Object) "KEA"));
111133
}
112134

113135
private static void assertDoesNotHaveRepo(Class<?> repositoryInterface,
@@ -153,6 +175,11 @@ private Object getEnableKeyspaceEvents(BeanDefinitionRegistry beanDefintionRegis
153175
.getPropertyValue("enableKeyspaceEvents").getValue();
154176
}
155177

178+
private Object getKeyspaceNotificationsConfigParameter(BeanDefinitionRegistry beanDefintionRegistry) {
179+
return beanDefintionRegistry.getBeanDefinition("redisKeyValueAdapter").getPropertyValues()
180+
.getPropertyValue("keyspaceNotificationsConfigParameter").getValue();
181+
}
182+
156183
@EnableRedisRepositories(considerNestedRepositories = true, enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP)
157184
static class Config {
158185

@@ -163,6 +190,12 @@ static class ConfigWithKeyspaceEventsDisabled {
163190

164191
}
165192

193+
@EnableRedisRepositories(considerNestedRepositories = true, enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP,
194+
keyspaceNotificationsConfigParameter = "KEA")
195+
static class ConfigWithKeyspaceEventsEnabledAndCustomEventConfig {
196+
197+
}
198+
166199
@RedisHash
167200
static class Sample {
168201
@Id String id;

0 commit comments

Comments
 (0)