Skip to content

Commit 90ba85a

Browse files
committed
Add to RedisSessionProperties configuration-strategy property to configure ConfigureRedisAction.
see gh-16943
1 parent ae5b5be commit 90ba85a

File tree

3 files changed

+114
-1
lines changed

3 files changed

+114
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/RedisSessionConfiguration.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@
2222
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
25+
import org.springframework.boot.autoconfigure.session.RedisSessionProperties.ConfigurationStrategy;
2526
import org.springframework.boot.context.properties.EnableConfigurationProperties;
27+
import org.springframework.context.annotation.Bean;
2628
import org.springframework.context.annotation.Conditional;
2729
import org.springframework.context.annotation.Configuration;
2830
import org.springframework.data.redis.connection.RedisConnectionFactory;
2931
import org.springframework.data.redis.core.RedisTemplate;
3032
import org.springframework.session.SessionRepository;
3133
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
34+
import org.springframework.session.data.redis.config.ConfigureNotifyKeyspaceEventsAction;
35+
import org.springframework.session.data.redis.config.ConfigureRedisAction;
3236
import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;
3337

3438
/**
@@ -64,6 +68,22 @@ public void customize(SessionProperties sessionProperties,
6468
setCleanupCron(redisSessionProperties.getCleanupCron());
6569
}
6670

71+
@Bean
72+
@ConditionalOnMissingBean
73+
public ConfigureRedisAction configureRedisAction(
74+
RedisSessionProperties redisSessionProperties) {
75+
ConfigurationStrategy strategy = redisSessionProperties
76+
.getConfigurationStrategy();
77+
if (strategy == ConfigurationStrategy.NOTIFY_KEYSPACE_EVENTS) {
78+
return new ConfigureNotifyKeyspaceEventsAction();
79+
}
80+
if (strategy == ConfigurationStrategy.NO_OP) {
81+
return ConfigureRedisAction.NO_OP;
82+
}
83+
throw new IllegalStateException(
84+
"Strategy '" + strategy + "' is not supported.");
85+
}
86+
6787
}
6888

6989
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/session/RedisSessionProperties.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2017 the original author or authors.
2+
* Copyright 2012-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -40,6 +40,11 @@ public class RedisSessionProperties {
4040
*/
4141
private RedisFlushMode flushMode = RedisFlushMode.ON_SAVE;
4242

43+
/**
44+
* Allows specifying a strategy for configuring and validating Redis.
45+
*/
46+
private ConfigurationStrategy configurationStrategy = ConfigurationStrategy.NOTIFY_KEYSPACE_EVENTS;
47+
4348
/**
4449
* Cron expression for expired session cleanup job.
4550
*/
@@ -69,4 +74,29 @@ public void setCleanupCron(String cleanupCron) {
6974
this.cleanupCron = cleanupCron;
7075
}
7176

77+
public ConfigurationStrategy getConfigurationStrategy() {
78+
return this.configurationStrategy;
79+
}
80+
81+
public void setConfigurationStrategy(ConfigurationStrategy configurationStrategy) {
82+
this.configurationStrategy = configurationStrategy;
83+
}
84+
85+
/**
86+
* Allows specifying a strategy for configuring and validating Redis.
87+
*/
88+
public enum ConfigurationStrategy {
89+
90+
/**
91+
* Do nothing.
92+
*/
93+
NO_OP,
94+
/**
95+
* Ensures that Redis Keyspace events for Generic commands and Expired events are
96+
* enabled.
97+
*/
98+
NOTIFY_KEYSPACE_EVENTS
99+
100+
}
101+
72102
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/session/SessionAutoConfigurationRedisTests.java

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.autoconfigure.session;
1818

19+
import java.util.Map;
20+
1921
import org.junit.jupiter.api.Test;
2022
import org.testcontainers.junit.jupiter.Container;
2123
import org.testcontainers.junit.jupiter.Testcontainers;
@@ -28,13 +30,18 @@
2830
import org.springframework.boot.test.context.runner.ContextConsumer;
2931
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
3032
import org.springframework.boot.testsupport.testcontainers.RedisContainer;
33+
import org.springframework.data.redis.connection.RedisConnection;
34+
import org.springframework.data.redis.connection.RedisConnectionFactory;
3135
import org.springframework.session.data.mongo.MongoOperationsSessionRepository;
3236
import org.springframework.session.data.redis.RedisFlushMode;
3337
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
38+
import org.springframework.session.data.redis.config.ConfigureNotifyKeyspaceEventsAction;
39+
import org.springframework.session.data.redis.config.ConfigureRedisAction;
3440
import org.springframework.session.hazelcast.HazelcastSessionRepository;
3541
import org.springframework.session.jdbc.JdbcOperationsSessionRepository;
3642

3743
import static org.assertj.core.api.Assertions.assertThat;
44+
import static org.assertj.core.api.Assertions.entry;
3845

3946
/**
4047
* Redis specific tests for {@link SessionAutoConfiguration}.
@@ -87,6 +94,38 @@ public void redisSessionStoreWithCustomizations() {
8794
RedisFlushMode.IMMEDIATE, "0 0 12 * * *"));
8895
}
8996

97+
@Test
98+
void redisSessionConfigureNoStrategy() {
99+
this.contextRunner
100+
.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
101+
.withPropertyValues("spring.session.store-type=redis",
102+
"spring.session.redis.configuration-strategy=no_op",
103+
"spring.redis.port=" + redis.getMappedPort())
104+
.run(validateStrategy(ConfigureRedisAction.NO_OP.getClass()));
105+
}
106+
107+
@Test
108+
void redisSessionConfigureDefaultStrategy() {
109+
this.contextRunner
110+
.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
111+
.withPropertyValues("spring.session.store-type=redis",
112+
"spring.redis.port=" + redis.getMappedPort())
113+
.run(validateStrategy(ConfigureNotifyKeyspaceEventsAction.class,
114+
entry("notify-keyspace-events", "gxE")));
115+
}
116+
117+
@Test
118+
void redisSessionConfigureCustomStrategy() {
119+
this.contextRunner
120+
.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
121+
.withUserConfiguration(MaxEntriesRedisAction.class)
122+
.withPropertyValues("spring.session.store-type=redis",
123+
"spring.redis.port=" + redis.getMappedPort())
124+
.run(validateStrategy(MaxEntriesRedisAction.class,
125+
entry("set-max-intset-entries", "1024")));
126+
127+
}
128+
90129
private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUsesRedis(
91130
String sessionCreatedChannelPrefix, RedisFlushMode flushMode,
92131
String cleanupCron) {
@@ -104,4 +143,28 @@ private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUs
104143
};
105144
}
106145

146+
private ContextConsumer<AssertableWebApplicationContext> validateStrategy(
147+
Class<? extends ConfigureRedisAction> actionClass, Map.Entry... values) {
148+
return (context) -> {
149+
assertThat(context).hasSingleBean(ConfigureRedisAction.class)
150+
.hasSingleBean(RedisConnectionFactory.class);
151+
assertThat(context.getBean(ConfigureRedisAction.class))
152+
.isInstanceOf(actionClass);
153+
RedisConnection connection = context.getBean(RedisConnectionFactory.class)
154+
.getConnection();
155+
if (values.length > 0) {
156+
assertThat(connection.getConfig("*")).contains(values);
157+
}
158+
};
159+
}
160+
161+
static class MaxEntriesRedisAction implements ConfigureRedisAction {
162+
163+
@Override
164+
public void configure(RedisConnection connection) {
165+
connection.setConfig("set-max-intset-entries", "1024");
166+
}
167+
168+
}
169+
107170
}

0 commit comments

Comments
 (0)