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

View File

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

View File

@@ -106,19 +106,6 @@ class ReactiveRedisOperationsSessionRepositoryTests {
assertThat(ReflectionTestUtils.getField(this.repository, "defaultMaxInactiveInterval")).isEqualTo(600); 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 @Test
void createSessionDefaultMaxInactiveInterval() { void createSessionDefaultMaxInactiveInterval() {
StepVerifier.create(this.repository.createSession()) 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.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.ReactiveRedisOperationsSessionRepository; 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.SpringSessionRedisConnectionFactory;
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations; import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
@@ -108,16 +107,6 @@ class RedisWebSessionConfigurationTests {
.isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS); .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 @Test
void qualifiedConnectionFactoryRedisConfig() { void qualifiedConnectionFactoryRedisConfig() {
registerAndRefresh(RedisConfig.class, QualifiedConnectionFactoryRedisConfig.class); registerAndRefresh(RedisConfig.class, QualifiedConnectionFactoryRedisConfig.class);
@@ -260,11 +249,6 @@ class RedisWebSessionConfigurationTests {
} }
@EnableRedisWebSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
static class CustomFlushModeConfig {
}
@EnableRedisWebSession @EnableRedisWebSession
static class QualifiedConnectionFactoryRedisConfig { static class QualifiedConnectionFactoryRedisConfig {