From 690fbc8d3ffd524318c4d875b91c7ca66261e1e6 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Mon, 10 Aug 2015 14:48:10 -0500 Subject: [PATCH] RedisOperations -> RedisOperations The RedisOperations manages more than just ExpiringSessions, so we need to make this more generice. Fixes gh-259 --- .../RedisOperationsSessionRepository.java | 12 ++++---- .../redis/RedisSessionExpirationPolicy.java | 28 ++++++++----------- .../http/RedisHttpSessionConfiguration.java | 6 ++-- .../annotation/web/http/gh109/Gh109Tests.java | 5 ++-- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java b/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java index 23c5b2da..a16f7e7e 100644 --- a/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java +++ b/spring-session/src/main/java/org/springframework/session/data/redis/RedisOperationsSessionRepository.java @@ -167,7 +167,7 @@ public class RedisOperationsSessionRepository implements SessionRepository sessionRedisOperations; + private final RedisOperations sessionRedisOperations; private final RedisSessionExpirationPolicy expirationPolicy; @@ -181,7 +181,6 @@ public class RedisOperationsSessionRepository implements SessionRepository sessionRedisOperations) { + public RedisOperationsSessionRepository(RedisOperations sessionRedisOperations) { Assert.notNull(sessionRedisOperations, "sessionRedisOperations cannot be null"); this.sessionRedisOperations = sessionRedisOperations; this.expirationPolicy = new RedisSessionExpirationPolicy(sessionRedisOperations); @@ -304,15 +303,14 @@ public class RedisOperationsSessionRepository implements SessionRepository getSessionBoundHashOperations(String sessionId) { + private BoundHashOperations getSessionBoundHashOperations(String sessionId) { String key = getKey(sessionId); return this.sessionRedisOperations.boundHashOps(key); } - @SuppressWarnings("rawtypes") - private static RedisTemplate createDefaultTemplate(RedisConnectionFactory connectionFactory) { + private static RedisTemplate createDefaultTemplate(RedisConnectionFactory connectionFactory) { Assert.notNull(connectionFactory,"connectionFactory cannot be null"); - RedisTemplate template = new RedisTemplate(); + RedisTemplate template = new RedisTemplate(); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setConnectionFactory(connectionFactory); diff --git a/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java b/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java index 90c9094c..1d961811 100644 --- a/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java +++ b/spring-session/src/main/java/org/springframework/session/data/redis/RedisSessionExpirationPolicy.java @@ -53,42 +53,38 @@ final class RedisSessionExpirationPolicy { */ static final String EXPIRATION_BOUNDED_HASH_KEY_PREFIX = "spring:session:expirations:"; - private final RedisOperations sessionRedisOperations; + private final RedisOperations redis; - private final RedisOperations expirationRedisOperations; - - @SuppressWarnings({ "rawtypes", "unchecked" }) public RedisSessionExpirationPolicy( - RedisOperations sessionRedisOperations) { + RedisOperations sessionRedisOperations) { super(); - this.sessionRedisOperations = sessionRedisOperations; - this.expirationRedisOperations = sessionRedisOperations; + this.redis = sessionRedisOperations; } public void onDelete(ExpiringSession session) { long toExpire = roundUpToNextMinute(expiresInMillis(session)); String expireKey = getExpirationKey(toExpire); - expirationRedisOperations.boundSetOps(expireKey).remove(session.getId()); + redis.boundSetOps(expireKey).remove(session.getId()); } public void onExpirationUpdated(Long originalExpirationTimeInMilli, ExpiringSession session) { if(originalExpirationTimeInMilli != null) { long originalRoundedUp = roundUpToNextMinute(originalExpirationTimeInMilli); String expireKey = getExpirationKey(originalRoundedUp); - expirationRedisOperations.boundSetOps(expireKey).remove(session.getId()); + redis.boundSetOps(expireKey).remove(expireKey); } long toExpire = roundUpToNextMinute(expiresInMillis(session)); String expireKey = getExpirationKey(toExpire); - BoundSetOperations expireOperations = expirationRedisOperations.boundSetOps(expireKey); + BoundSetOperations expireOperations = redis.boundSetOps(expireKey); expireOperations.add(session.getId()); long sessionExpireInSeconds = session.getMaxInactiveIntervalInSeconds(); String sessionKey = getSessionKey(session.getId()); expireOperations.expire(sessionExpireInSeconds + 60, TimeUnit.SECONDS); - sessionRedisOperations.boundHashOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS); + redis.boundHashOps(sessionKey).expire(sessionExpireInSeconds, TimeUnit.SECONDS); } String getExpirationKey(long expires) { @@ -108,10 +104,10 @@ final class RedisSessionExpirationPolicy { } String expirationKey = getExpirationKey(prevMin); - Set sessionsToExpire = expirationRedisOperations.boundSetOps(expirationKey).members(); - expirationRedisOperations.delete(expirationKey); - for(String session : sessionsToExpire) { - String sessionKey = getSessionKey(session); + Set sessionsToExpire = redis.boundSetOps(expirationKey).members(); + redis.delete(expirationKey); + for(Object session : sessionsToExpire) { + String sessionKey = getSessionKey((String) session); touch(sessionKey); } } @@ -123,7 +119,7 @@ final class RedisSessionExpirationPolicy { * @param key */ private void touch(String key) { - sessionRedisOperations.hasKey(key); + redis.hasKey(key); } static long expiresInMillis(ExpiringSession session) { diff --git a/spring-session/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java b/spring-session/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java index 0adf6d50..abdc70c7 100644 --- a/spring-session/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java +++ b/spring-session/src/main/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.java @@ -88,8 +88,8 @@ public class RedisHttpSessionConfiguration implements ImportAware, BeanClassLoad } @Bean - public RedisTemplate sessionRedisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate template = new RedisTemplate(); + public RedisTemplate sessionRedisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setConnectionFactory(connectionFactory); @@ -97,7 +97,7 @@ public class RedisHttpSessionConfiguration implements ImportAware, BeanClassLoad } @Bean - public RedisOperationsSessionRepository sessionRepository(RedisTemplate sessionRedisTemplate) { + public RedisOperationsSessionRepository sessionRepository(@Qualifier("sessionRedisTemplate") RedisOperations sessionRedisTemplate) { RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository(sessionRedisTemplate); sessionRepository.setDefaultMaxInactiveInterval(maxInactiveIntervalInSeconds); return sessionRepository; diff --git a/spring-session/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java b/spring-session/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java index 617d3b35..f41e8c38 100644 --- a/spring-session/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java +++ b/spring-session/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java @@ -19,10 +19,12 @@ import static org.mockito.Mockito.*; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.session.ExpiringSession; import org.springframework.session.data.redis.RedisOperationsSessionRepository; @@ -58,8 +60,7 @@ public class Gh109Tests { */ @Bean @Override - public RedisOperationsSessionRepository sessionRepository( - RedisTemplate sessionRedisTemplate) { + public RedisOperationsSessionRepository sessionRepository(RedisOperations sessionRedisTemplate, ApplicationEventPublisher applicationEventPublisher) { RedisOperationsSessionRepository sessionRepository = new RedisOperationsSessionRepository( sessionRedisTemplate); sessionRepository.setDefaultMaxInactiveInterval(sessionTimeout);