Skip to content

Commit 1213654

Browse files
committed
Merge pull request #17022 from nosan
* pr/17022: Polish "Add session property for ConfigureRedisAction" Add session property for ConfigureRedisAction Closes gh-17022
2 parents 2888dde + 919913a commit 1213654

File tree

3 files changed

+105
-1
lines changed

3 files changed

+105
-1
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2525
import org.springframework.boot.context.properties.EnableConfigurationProperties;
26+
import org.springframework.context.annotation.Bean;
2627
import org.springframework.context.annotation.Conditional;
2728
import org.springframework.context.annotation.Configuration;
2829
import org.springframework.data.redis.connection.RedisConnectionFactory;
2930
import org.springframework.data.redis.core.RedisTemplate;
3031
import org.springframework.session.SessionRepository;
3132
import org.springframework.session.data.redis.RedisOperationsSessionRepository;
33+
import org.springframework.session.data.redis.config.ConfigureNotifyKeyspaceEventsAction;
34+
import org.springframework.session.data.redis.config.ConfigureRedisAction;
3235
import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration;
3336

3437
/**
@@ -48,6 +51,19 @@
4851
@EnableConfigurationProperties(RedisSessionProperties.class)
4952
class RedisSessionConfiguration {
5053

54+
@Bean
55+
@ConditionalOnMissingBean
56+
public ConfigureRedisAction configureRedisAction(RedisSessionProperties redisSessionProperties) {
57+
switch (redisSessionProperties.getConfigurationStrategy()) {
58+
case NOTIFY_KEYSPACE_EVENTS:
59+
return new ConfigureNotifyKeyspaceEventsAction();
60+
case NONE:
61+
return ConfigureRedisAction.NO_OP;
62+
}
63+
throw new IllegalStateException("Unsupported redis configuration strategy '"
64+
+ redisSessionProperties.getConfigurationStrategy() + "'.");
65+
}
66+
5167
@Configuration
5268
public static class SpringBootRedisHttpSessionConfiguration extends RedisHttpSessionConfiguration {
5369

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

Lines changed: 33 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,12 @@ public class RedisSessionProperties {
4040
*/
4141
private RedisFlushMode flushMode = RedisFlushMode.ON_SAVE;
4242

43+
/**
44+
* The configure action to apply when no user defined ConfigureRedisAction bean is
45+
* present.
46+
*/
47+
private ConfigureAction configureAction = ConfigureAction.NOTIFY_KEYSPACE_EVENTS;
48+
4349
/**
4450
* Cron expression for expired session cleanup job.
4551
*/
@@ -69,4 +75,30 @@ public void setCleanupCron(String cleanupCron) {
6975
this.cleanupCron = cleanupCron;
7076
}
7177

78+
public ConfigureAction getConfigurationStrategy() {
79+
return this.configureAction;
80+
}
81+
82+
public void setConfigurationStrategy(ConfigureAction configurationStrategy) {
83+
this.configureAction = configurationStrategy;
84+
}
85+
86+
/**
87+
* Strategies for configuring and validating Redis.
88+
*/
89+
public enum ConfigureAction {
90+
91+
/**
92+
* Ensure that Redis Keyspace events for Generic commands and Expired events are
93+
* enabled.
94+
*/
95+
NOTIFY_KEYSPACE_EVENTS,
96+
97+
/**
98+
* No not attempt to apply any custom Redis configuration.
99+
*/
100+
NONE
101+
102+
}
103+
72104
}

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

Lines changed: 56 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

@@ -28,13 +30,18 @@
2830
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
2931
import org.springframework.boot.testsupport.testcontainers.DisabledWithoutDockerTestcontainers;
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}.
@@ -81,6 +88,33 @@ void redisSessionStoreWithCustomizations() {
8188
.run(validateSpringSessionUsesRedis("foo:event:0:created:", RedisFlushMode.IMMEDIATE, "0 0 12 * * *"));
8289
}
8390

91+
@Test
92+
void redisSessionConfigureNoStrategy() {
93+
this.contextRunner.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
94+
.withPropertyValues("spring.session.store-type=redis", "spring.session.redis.configure-action=none",
95+
"spring.redis.port=" + redis.getFirstMappedPort())
96+
.run(validateStrategy(ConfigureRedisAction.NO_OP.getClass()));
97+
}
98+
99+
@Test
100+
void redisSessionConfigureDefaultStrategy() {
101+
this.contextRunner.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
102+
.withPropertyValues("spring.session.store-type=redis",
103+
"spring.redis.port=" + redis.getFirstMappedPort())
104+
.run(validateStrategy(ConfigureNotifyKeyspaceEventsAction.class,
105+
entry("notify-keyspace-events", "gxE")));
106+
}
107+
108+
@Test
109+
void redisSessionConfigureCustomStrategy() {
110+
this.contextRunner.withConfiguration(AutoConfigurations.of(RedisAutoConfiguration.class))
111+
.withUserConfiguration(MaxEntriesRedisAction.class)
112+
.withPropertyValues("spring.session.store-type=redis",
113+
"spring.redis.port=" + redis.getFirstMappedPort())
114+
.run(validateStrategy(MaxEntriesRedisAction.class, entry("set-max-intset-entries", "1024")));
115+
116+
}
117+
84118
private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUsesRedis(
85119
String sessionCreatedChannelPrefix, RedisFlushMode flushMode, String cleanupCron) {
86120
return (context) -> {
@@ -94,4 +128,26 @@ private ContextConsumer<AssertableWebApplicationContext> validateSpringSessionUs
94128
};
95129
}
96130

131+
private ContextConsumer<AssertableWebApplicationContext> validateStrategy(
132+
Class<? extends ConfigureRedisAction> expectedConfigureRedisActionType, Map.Entry<?, ?>... expectedConfig) {
133+
return (context) -> {
134+
assertThat(context).hasSingleBean(ConfigureRedisAction.class);
135+
assertThat(context).hasSingleBean(RedisConnectionFactory.class);
136+
assertThat(context.getBean(ConfigureRedisAction.class)).isInstanceOf(expectedConfigureRedisActionType);
137+
RedisConnection connection = context.getBean(RedisConnectionFactory.class).getConnection();
138+
if (expectedConfig.length > 0) {
139+
assertThat(connection.getConfig("*")).contains(expectedConfig);
140+
}
141+
};
142+
}
143+
144+
static class MaxEntriesRedisAction implements ConfigureRedisAction {
145+
146+
@Override
147+
public void configure(RedisConnection connection) {
148+
connection.setConfig("set-max-intset-entries", "1024");
149+
}
150+
151+
}
152+
97153
}

0 commit comments

Comments
 (0)