Remove immediate flush mode support for reactive Redis sessions
Resolves: #1441
This commit is contained in:
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user