Skip to content

Commit b216567

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 a16f930 commit b216567

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
@@ -26,7 +26,6 @@
2626
import org.slf4j.Logger;
2727
import org.slf4j.LoggerFactory;
2828
import org.springframework.beans.BeansException;
29-
import org.springframework.beans.factory.DisposableBean;
3029
import org.springframework.beans.factory.InitializingBean;
3130
import org.springframework.context.ApplicationContext;
3231
import org.springframework.context.ApplicationContextAware;
@@ -103,6 +102,7 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter
103102
private ApplicationEventPublisher eventPublisher;
104103

105104
private EnableKeyspaceEvents enableKeyspaceEvents = EnableKeyspaceEvents.OFF;
105+
private String keyspaceNotificationsConfigParameter = null;
106106

107107
/**
108108
* Creates new {@link RedisKeyValueAdapter} with default {@link RedisMappingContext} and default
@@ -469,6 +469,17 @@ public void setEnableKeyspaceEvents(EnableKeyspaceEvents enableKeyspaceEvents) {
469469
this.enableKeyspaceEvents = enableKeyspaceEvents;
470470
}
471471

472+
/**
473+
* Configure the {@literal notify-keyspace-events} property if not already set. Use an empty {@link String} or
474+
* {@literal null} to retain existing server settings.
475+
*
476+
* @param keyspaceNotificationsConfigParameter can be {@literal null}.
477+
* @since 1.8
478+
*/
479+
public void setKeyspaceNotificationsConfigParameter(String keyspaceNotificationsConfigParameter) {
480+
this.keyspaceNotificationsConfigParameter = keyspaceNotificationsConfigParameter;
481+
}
482+
472483
/**
473484
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
474485
* @since 1.7.2
@@ -491,7 +502,7 @@ public void destroy() throws Exception {
491502
this.expirationListener.get().destroy();
492503
}
493504

494-
if(this.messageListenerContainer != null){
505+
if (this.messageListenerContainer != null) {
495506
this.messageListenerContainer.destroy();
496507
}
497508
}
@@ -549,6 +560,7 @@ private void initKeyExpirationListener() {
549560

550561
MappingExpirationListener listener = new MappingExpirationListener(this.messageListenerContainer, this.redisOps,
551562
this.converter);
563+
listener.setKeyspaceNotificationsConfigParameter(keyspaceNotificationsConfigParameter);
552564

553565
if (this.eventPublisher != null) {
554566
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)