Commit 919913ae authored by Phillip Webb's avatar Phillip Webb

Polish "Add session property for ConfigureRedisAction"

See gh-17022
parent a0fabc98
...@@ -22,7 +22,6 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -22,7 +22,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.session.RedisSessionProperties.ConfigurationStrategy;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Conditional;
...@@ -52,6 +51,19 @@ import org.springframework.session.data.redis.config.annotation.web.http.RedisHt ...@@ -52,6 +51,19 @@ import org.springframework.session.data.redis.config.annotation.web.http.RedisHt
@EnableConfigurationProperties(RedisSessionProperties.class) @EnableConfigurationProperties(RedisSessionProperties.class)
class RedisSessionConfiguration { class RedisSessionConfiguration {
@Bean
@ConditionalOnMissingBean
public ConfigureRedisAction configureRedisAction(RedisSessionProperties redisSessionProperties) {
switch (redisSessionProperties.getConfigurationStrategy()) {
case NOTIFY_KEYSPACE_EVENTS:
return new ConfigureNotifyKeyspaceEventsAction();
case NONE:
return ConfigureRedisAction.NO_OP;
}
throw new IllegalStateException("Unsupported redis configuration strategy '"
+ redisSessionProperties.getConfigurationStrategy() + "'.");
}
@Configuration @Configuration
public static class SpringBootRedisHttpSessionConfiguration extends RedisHttpSessionConfiguration { public static class SpringBootRedisHttpSessionConfiguration extends RedisHttpSessionConfiguration {
...@@ -66,19 +78,6 @@ class RedisSessionConfiguration { ...@@ -66,19 +78,6 @@ class RedisSessionConfiguration {
setCleanupCron(redisSessionProperties.getCleanupCron()); setCleanupCron(redisSessionProperties.getCleanupCron());
} }
@Bean
@ConditionalOnMissingBean
public ConfigureRedisAction configureRedisAction(RedisSessionProperties redisSessionProperties) {
ConfigurationStrategy strategy = redisSessionProperties.getConfigurationStrategy();
if (strategy == ConfigurationStrategy.NOTIFY_KEYSPACE_EVENTS) {
return new ConfigureNotifyKeyspaceEventsAction();
}
if (strategy == ConfigurationStrategy.NO_OP) {
return ConfigureRedisAction.NO_OP;
}
throw new IllegalStateException("Strategy '" + strategy + "' is not supported.");
}
} }
} }
...@@ -41,9 +41,10 @@ public class RedisSessionProperties { ...@@ -41,9 +41,10 @@ public class RedisSessionProperties {
private RedisFlushMode flushMode = RedisFlushMode.ON_SAVE; private RedisFlushMode flushMode = RedisFlushMode.ON_SAVE;
/** /**
* Allows specifying a strategy for configuring and validating Redis. * The configure action to apply when no user defined ConfigureRedisAction bean is
* present.
*/ */
private ConfigurationStrategy configurationStrategy = ConfigurationStrategy.NOTIFY_KEYSPACE_EVENTS; private ConfigureAction configureAction = ConfigureAction.NOTIFY_KEYSPACE_EVENTS;
/** /**
* Cron expression for expired session cleanup job. * Cron expression for expired session cleanup job.
...@@ -74,28 +75,29 @@ public class RedisSessionProperties { ...@@ -74,28 +75,29 @@ public class RedisSessionProperties {
this.cleanupCron = cleanupCron; this.cleanupCron = cleanupCron;
} }
public ConfigurationStrategy getConfigurationStrategy() { public ConfigureAction getConfigurationStrategy() {
return this.configurationStrategy; return this.configureAction;
} }
public void setConfigurationStrategy(ConfigurationStrategy configurationStrategy) { public void setConfigurationStrategy(ConfigureAction configurationStrategy) {
this.configurationStrategy = configurationStrategy; this.configureAction = configurationStrategy;
} }
/** /**
* Allows specifying a strategy for configuring and validating Redis. * Strategies for configuring and validating Redis.
*/ */
public enum ConfigurationStrategy { public enum ConfigureAction {
/** /**
* Do nothing. * Ensure that Redis Keyspace events for Generic commands and Expired events are
* enabled.
*/ */
NO_OP, NOTIFY_KEYSPACE_EVENTS,
/** /**
* Ensures that Redis Keyspace events for Generic commands and Expired events are * No not attempt to apply any custom Redis configuration.
* enabled.
*/ */
NOTIFY_KEYSPACE_EVENTS NONE
} }
......
...@@ -91,8 +91,7 @@ class SessionAutoConfigurationRedisTests extends AbstractSessionAutoConfiguratio ...@@ -91,8 +91,7 @@ class SessionAutoConfigurationRedisTests extends AbstractSessionAutoConfiguratio
@Test @Test
void redisSessionConfigureNoStrategy() { void redisSessionConfigureNoStrategy() {
this.contextRunner.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class)) this.contextRunner.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
.withPropertyValues("spring.session.store-type=redis", .withPropertyValues("spring.session.store-type=redis", "spring.session.redis.configure-action=none",
"spring.session.redis.configuration-strategy=no_op",
"spring.redis.port=" + redis.getFirstMappedPort()) "spring.redis.port=" + redis.getFirstMappedPort())
.run(validateStrategy(ConfigureRedisAction.NO_OP.getClass())); .run(validateStrategy(ConfigureRedisAction.NO_OP.getClass()));
} }
...@@ -130,13 +129,14 @@ class SessionAutoConfigurationRedisTests extends AbstractSessionAutoConfiguratio ...@@ -130,13 +129,14 @@ class SessionAutoConfigurationRedisTests extends AbstractSessionAutoConfiguratio
} }
private ContextConsumer<AssertableWebApplicationContext> validateStrategy( private ContextConsumer<AssertableWebApplicationContext> validateStrategy(
Class<? extends ConfigureRedisAction> actionClass, Map.Entry... values) { Class<? extends ConfigureRedisAction> expectedConfigureRedisActionType, Map.Entry<?, ?>... expectedConfig) {
return (context) -> { return (context) -> {
assertThat(context).hasSingleBean(ConfigureRedisAction.class).hasSingleBean(RedisConnectionFactory.class); assertThat(context).hasSingleBean(ConfigureRedisAction.class);
assertThat(context.getBean(ConfigureRedisAction.class)).isInstanceOf(actionClass); assertThat(context).hasSingleBean(RedisConnectionFactory.class);
assertThat(context.getBean(ConfigureRedisAction.class)).isInstanceOf(expectedConfigureRedisActionType);
RedisConnection connection = context.getBean(RedisConnectionFactory.class).getConnection(); RedisConnection connection = context.getBean(RedisConnectionFactory.class).getConnection();
if (values.length > 0) { if (expectedConfig.length > 0) {
assertThat(connection.getConfig("*")).contains(values); assertThat(connection.getConfig("*")).contains(expectedConfig);
} }
}; };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment