Remove immediate flush mode support for reactive Redis sessions

Resolves: #1441
This commit is contained in:
Vedran Pavic
2019-06-20 10:44:22 +02:00
parent 090d882f98
commit aab9b39a6b
5 changed files with 9 additions and 53 deletions

View File

@@ -59,8 +59,6 @@ public class ReactiveRedisOperationsSessionRepository
*/
private Integer defaultMaxInactiveInterval;
private RedisFlushMode redisFlushMode = RedisFlushMode.ON_SAVE;
public ReactiveRedisOperationsSessionRepository(ReactiveRedisOperations<String, Object> sessionRedisOperations) {
Assert.notNull(sessionRedisOperations, "sessionRedisOperations cannot be null");
this.sessionRedisOperations = sessionRedisOperations;
@@ -85,10 +83,11 @@ public class ReactiveRedisOperationsSessionRepository
/**
* Sets the redis flush mode. Default flush mode is {@link RedisFlushMode#ON_SAVE}.
* @param redisFlushMode the new redis flush mode
* @deprecated since 2.2.0 as support {@code IMMEDIATE} is removed
*/
@Deprecated
public void setRedisFlushMode(RedisFlushMode redisFlushMode) {
Assert.notNull(redisFlushMode, "redisFlushMode cannot be null");
this.redisFlushMode = redisFlushMode;
}
/**
@@ -179,7 +178,6 @@ public class ReactiveRedisOperationsSessionRepository
this.delta.put(RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, (int) getMaxInactiveInterval().getSeconds());
this.delta.put(RedisSessionMapper.LAST_ACCESSED_TIME_KEY, getLastAccessedTime().toEpochMilli());
this.isNew = true;
this.flushImmediateIfNecessary();
}
/**
@@ -216,13 +214,13 @@ public class ReactiveRedisOperationsSessionRepository
@Override
public void setAttribute(String attributeName, Object attributeValue) {
this.cached.setAttribute(attributeName, attributeValue);
putAndFlush(getAttributeKey(attributeName), attributeValue);
this.delta.put(getAttributeKey(attributeName), attributeValue);
}
@Override
public void removeAttribute(String attributeName) {
this.cached.removeAttribute(attributeName);
putAndFlush(getAttributeKey(attributeName), null);
this.delta.put(getAttributeKey(attributeName), null);
}
@Override
@@ -233,7 +231,7 @@ public class ReactiveRedisOperationsSessionRepository
@Override
public void setLastAccessedTime(Instant lastAccessedTime) {
this.cached.setLastAccessedTime(lastAccessedTime);
putAndFlush(RedisSessionMapper.LAST_ACCESSED_TIME_KEY, getLastAccessedTime().toEpochMilli());
this.delta.put(RedisSessionMapper.LAST_ACCESSED_TIME_KEY, getLastAccessedTime().toEpochMilli());
}
@Override
@@ -244,7 +242,7 @@ public class ReactiveRedisOperationsSessionRepository
@Override
public void setMaxInactiveInterval(Duration interval) {
this.cached.setMaxInactiveInterval(interval);
putAndFlush(RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, (int) getMaxInactiveInterval().getSeconds());
this.delta.put(RedisSessionMapper.MAX_INACTIVE_INTERVAL_KEY, (int) getMaxInactiveInterval().getSeconds());
}
@Override
@@ -261,17 +259,6 @@ public class ReactiveRedisOperationsSessionRepository
return !getId().equals(this.originalSessionId);
}
private void flushImmediateIfNecessary() {
if (ReactiveRedisOperationsSessionRepository.this.redisFlushMode == RedisFlushMode.IMMEDIATE) {
save();
}
}
private void putAndFlush(String a, Object v) {
this.delta.put(a, v);
flushImmediateIfNecessary();
}
private Mono<Void> save() {
return Mono.defer(() -> saveChangeSessionId().then(saveDelta()).doOnSuccess((aVoid) -> this.isNew = false));
}

View File

@@ -93,7 +93,9 @@ public @interface EnableRedisWebSession {
* Setting the value to {@code IMMEDIATE} will ensure that the any updates to the
* Session are immediately written to the Redis instance.
* @return the {@link RedisFlushMode} to use
* @deprecated since 2.2.0 as support {@code IMMEDIATE} is removed
*/
@Deprecated
RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE;
}

View File

@@ -61,8 +61,6 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration
private String redisNamespace = ReactiveRedisOperationsSessionRepository.DEFAULT_NAMESPACE;
private RedisFlushMode redisFlushMode = RedisFlushMode.ON_SAVE;
private ReactiveRedisConnectionFactory redisConnectionFactory;
private RedisSerializer<Object> defaultRedisSerializer;
@@ -80,7 +78,6 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration
if (StringUtils.hasText(this.redisNamespace)) {
sessionRepository.setRedisKeyNamespace(this.redisNamespace);
}
sessionRepository.setRedisFlushMode(this.redisFlushMode);
return sessionRepository;
}
@@ -92,9 +89,9 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration
this.redisNamespace = namespace;
}
@Deprecated
public void setRedisFlushMode(RedisFlushMode redisFlushMode) {
Assert.notNull(redisFlushMode, "redisFlushMode cannot be null");
this.redisFlushMode = redisFlushMode;
}
@Autowired
@@ -135,7 +132,6 @@ public class RedisWebSessionConfiguration extends SpringWebSessionConfiguration
if (StringUtils.hasText(redisNamespaceValue)) {
this.redisNamespace = this.embeddedValueResolver.resolveStringValue(redisNamespaceValue);
}
this.redisFlushMode = attributes.getEnum("redisFlushMode");
}
private ReactiveRedisTemplate<String, Object> createReactiveRedisTemplate() {

View File

@@ -106,19 +106,6 @@ class ReactiveRedisOperationsSessionRepositoryTests {
assertThat(ReflectionTestUtils.getField(this.repository, "defaultMaxInactiveInterval")).isEqualTo(600);
}
@Test
void customRedisFlushMode() {
this.repository.setRedisFlushMode(RedisFlushMode.IMMEDIATE);
assertThat(ReflectionTestUtils.getField(this.repository, "redisFlushMode")).isEqualTo(RedisFlushMode.IMMEDIATE);
}
@Test
void nullRedisFlushMode() {
assertThatIllegalArgumentException().isThrownBy(() -> this.repository.setRedisFlushMode(null))
.withMessage("redisFlushMode cannot be null");
}
@Test
void createSessionDefaultMaxInactiveInterval() {
StepVerifier.create(this.repository.createSession())

View File

@@ -30,7 +30,6 @@ import org.springframework.data.redis.core.ReactiveRedisOperations;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository;
import org.springframework.session.data.redis.RedisFlushMode;
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations;
import org.springframework.test.util.ReflectionTestUtils;
@@ -108,16 +107,6 @@ class RedisWebSessionConfigurationTests {
.isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS);
}
@Test
void customFlushMode() {
registerAndRefresh(RedisConfig.class, CustomFlushModeConfig.class);
ReactiveRedisOperationsSessionRepository repository = this.context
.getBean(ReactiveRedisOperationsSessionRepository.class);
assertThat(repository).isNotNull();
assertThat(ReflectionTestUtils.getField(repository, "redisFlushMode")).isEqualTo(RedisFlushMode.IMMEDIATE);
}
@Test
void qualifiedConnectionFactoryRedisConfig() {
registerAndRefresh(RedisConfig.class, QualifiedConnectionFactoryRedisConfig.class);
@@ -260,11 +249,6 @@ class RedisWebSessionConfigurationTests {
}
@EnableRedisWebSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
static class CustomFlushModeConfig {
}
@EnableRedisWebSession
static class QualifiedConnectionFactoryRedisConfig {