Reinstate RedisCacheConfiguration.getTtl().

Reintroduce and deprecate RedisCacheConfiguration.getTtl for backwards compatibility.

Closes #2628
Original Pull Request: #2597
This commit is contained in:
John Blum
2023-07-06 10:48:38 -07:00
committed by Christoph Strobl
parent 65f628ab76
commit fe88d31d09
2 changed files with 68 additions and 2 deletions

View File

@@ -326,6 +326,26 @@ public class RedisCacheConfiguration {
return this.valueSerializationPair;
}
/**
* Returns a computed {@link Duration TTL expiration timeout} based on cache entry key/value
* if a {@link TtlFunction} was confiugred using {@link #entryTtl(TtlFunction)}.
* <p>
* Otherwise, returns the user-provided, fixed {@link Duration} if {@link #entryTtl(Duration)}
* was called during cache configuration.
*
* @return the configured {@link Duration TTL expiration}.
* @deprecated use {@link #getTtlFunction()} instead.
*/
@Deprecated
@SuppressWarnings("all")
public Duration getTtl() {
TtlFunction ttlFunction = getTtlFunction();
return ttlFunction instanceof FixedDurationTtlFunction it ? it.duration()
: ttlFunction.getTimeToLive(null, null);
}
/**
* Gets the {@link TtlFunction} used to compute a cache key {@literal time-to-live (TTL) expiration}.
*

View File

@@ -15,9 +15,18 @@
*/
package org.springframework.data.redis.cache;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.assertj.core.api.Assertions.*;
import java.time.Duration;
import org.junit.jupiter.api.Test;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.core.convert.converter.Converter;
@@ -28,6 +37,7 @@ import org.springframework.lang.Nullable;
* Unit tests for {@link RedisCacheConfiguration}.
*
* @author Mark Paluch
* @author John Blum
*/
class RedisCacheConfigurationUnitTests {
@@ -56,6 +66,42 @@ class RedisCacheConfigurationUnitTests {
assertThat(config.getConversionService().canConvert(DomainType.class, String.class)).isTrue();
}
@Test // GH-2628
@SuppressWarnings("deprecation")
void getTtlReturnsFixedDuration() {
Duration sixtySeconds = Duration.ofSeconds(60);
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(sixtySeconds);
assertThat(cacheConfiguration).isNotNull();
assertThat(cacheConfiguration.getTtl()).isEqualByComparingTo(sixtySeconds);
assertThat(cacheConfiguration.getTtl()).isEqualByComparingTo(sixtySeconds); // does not change!
}
@Test // GH-2628
@SuppressWarnings("deprecation")
public void getTtlCanReturnDynamicDuration() {
Duration thirtyMinutes = Duration.ofMinutes(30);
Duration twoHours = Duration.ofHours(2);
RedisCacheWriter.TtlFunction mockTtlFunction = mock(RedisCacheWriter.TtlFunction.class);
doReturn(thirtyMinutes).doReturn(twoHours).when(mockTtlFunction).getTimeToLive(any(), any());
RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(mockTtlFunction);
assertThat(cacheConfiguration.getTtl()).isEqualTo(thirtyMinutes);
assertThat(cacheConfiguration.getTtl()).isEqualTo(twoHours);
verify(mockTtlFunction, times(2)).getTimeToLive(isNull(), isNull());
verifyNoMoreInteractions(mockTtlFunction);
}
private static class DomainType {
}