From 2dc424c665c6d494ee00b3ff01d110c9e8f9c00d Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Wed, 5 Jun 2019 14:45:28 +0300 Subject: [PATCH] Fixed - Tomcat Session doesn't expire if broadcastSessionEvents = true #2104 --- .../java/org/redisson/tomcat/RedissonSession.java | 4 ++++ .../org/redisson/tomcat/RedissonSessionManager.java | 11 ++++++++++- .../java/org/redisson/tomcat/RedissonSession.java | 4 ++++ .../org/redisson/tomcat/RedissonSessionManager.java | 11 ++++++++++- .../java/org/redisson/tomcat/RedissonSession.java | 4 ++++ .../org/redisson/tomcat/RedissonSessionManager.java | 11 ++++++++++- .../java/org/redisson/tomcat/RedissonSession.java | 4 ++++ .../org/redisson/tomcat/RedissonSessionManager.java | 11 ++++++++++- 8 files changed, 56 insertions(+), 4 deletions(-) diff --git a/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSession.java index 96e091fe7..8adcf1a13 100644 --- a/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.apache.catalina.session.StandardSession; +import org.redisson.api.RSet; import org.redisson.api.RMap; import org.redisson.api.RTopic; import org.redisson.tomcat.RedissonSessionManager.ReadMode; @@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession { } if (broadcastSessionEvents) { + RSet set = redissonManager.getNotifiedNodes(id); + set.add(redissonManager.getNodeId()); + set.expire(60, TimeUnit.SECONDS); map.fastPut(IS_EXPIRATION_LOCKED, true); map.expire(60, TimeUnit.SECONDS); } else { diff --git a/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSessionManager.java b/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSessionManager.java index 125ea8e91..431e6a66c 100644 --- a/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSessionManager.java +++ b/redisson-tomcat/redisson-tomcat-6/src/main/java/org/redisson/tomcat/RedissonSessionManager.java @@ -37,6 +37,7 @@ import org.apache.catalina.util.LifecycleSupport; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.redisson.Redisson; +import org.redisson.api.RSet; import org.redisson.api.RMap; import org.redisson.api.RTopic; import org.redisson.api.RedissonClient; @@ -166,6 +167,12 @@ public class RedissonSessionManager extends ManagerBase implements Lifecycle { return session; } + public RSet getNotifiedNodes(String sessionId) { + String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; + String name = keyPrefix + separator + "redisson:tomcat_notified_nodes:" + sessionId; + return redisson.getSet(name, StringCodec.INSTANCE); + } + public RMap getMap(String sessionId) { String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId; @@ -194,7 +201,7 @@ public class RedissonSessionManager extends ManagerBase implements Lifecycle { log.error("Can't read session object by id: " + id, e); } - if (attrs.isEmpty()) { + if (attrs.isEmpty() || (broadcastSessionEvents && getNotifiedNodes(id).contains(nodeId))) { log.info("Session " + id + " can't be found"); return null; } @@ -322,6 +329,8 @@ public class RedissonSessionManager extends ManagerBase implements Lifecycle { throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); } s.expire(); + RSet set = getNotifiedNodes(msg.getSessionId()); + set.add(nodeId); } } diff --git a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java index c5b480caf..4f13b69bc 100644 --- a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit; import org.apache.catalina.session.StandardSession; import org.redisson.api.RMap; +import org.redisson.api.RSet; import org.redisson.api.RTopic; import org.redisson.tomcat.RedissonSessionManager.ReadMode; import org.redisson.tomcat.RedissonSessionManager.UpdateMode; @@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession { } if (broadcastSessionEvents) { + RSet set = redissonManager.getNotifiedNodes(id); + set.add(redissonManager.getNodeId()); + set.expire(60, TimeUnit.SECONDS); map.fastPut(IS_EXPIRATION_LOCKED, true); map.expire(60, TimeUnit.SECONDS); } else { diff --git a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java index 2e39b1f8b..33f4ed3da 100644 --- a/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java +++ b/redisson-tomcat/redisson-tomcat-7/src/main/java/org/redisson/tomcat/RedissonSessionManager.java @@ -35,6 +35,7 @@ import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.redisson.Redisson; import org.redisson.api.RMap; +import org.redisson.api.RSet; import org.redisson.api.RTopic; import org.redisson.api.RedissonClient; import org.redisson.api.listener.MessageListener; @@ -144,6 +145,12 @@ public class RedissonSessionManager extends ManagerBase { return session; } + public RSet getNotifiedNodes(String sessionId) { + String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; + String name = keyPrefix + separator + "redisson:tomcat_notified_nodes:" + sessionId; + return redisson.getSet(name, StringCodec.INSTANCE); + } + public RMap getMap(String sessionId) { String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId; @@ -172,7 +179,7 @@ public class RedissonSessionManager extends ManagerBase { log.error("Can't read session object by id: " + id, e); } - if (attrs.isEmpty()) { + if (attrs.isEmpty() || (broadcastSessionEvents && getNotifiedNodes(id).contains(nodeId))) { log.info("Session " + id + " can't be found"); return null; } @@ -302,6 +309,8 @@ public class RedissonSessionManager extends ManagerBase { throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); } s.expire(); + RSet set = getNotifiedNodes(msg.getSessionId()); + set.add(nodeId); } } diff --git a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java index c5b480caf..e1247d70b 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.apache.catalina.session.StandardSession; +import org.redisson.api.RSet; import org.redisson.api.RMap; import org.redisson.api.RTopic; import org.redisson.tomcat.RedissonSessionManager.ReadMode; @@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession { } if (broadcastSessionEvents) { + RSet set = redissonManager.getNotifiedNodes(id); + set.add(redissonManager.getNodeId()); + set.expire(60, TimeUnit.SECONDS); map.fastPut(IS_EXPIRATION_LOCKED, true); map.expire(60, TimeUnit.SECONDS); } else { diff --git a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java index 9a881d317..dba307955 100644 --- a/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java +++ b/redisson-tomcat/redisson-tomcat-8/src/main/java/org/redisson/tomcat/RedissonSessionManager.java @@ -33,6 +33,7 @@ import org.apache.catalina.session.ManagerBase; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.redisson.Redisson; +import org.redisson.api.RSet; import org.redisson.api.RMap; import org.redisson.api.RTopic; import org.redisson.api.RedissonClient; @@ -142,6 +143,12 @@ public class RedissonSessionManager extends ManagerBase { } return session; } + + public RSet getNotifiedNodes(String sessionId) { + String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; + String name = keyPrefix + separator + "redisson:tomcat_notified_nodes:" + sessionId; + return redisson.getSet(name, StringCodec.INSTANCE); + } public RMap getMap(String sessionId) { String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; @@ -171,7 +178,7 @@ public class RedissonSessionManager extends ManagerBase { log.error("Can't read session object by id: " + id, e); } - if (attrs.isEmpty()) { + if (attrs.isEmpty() || (broadcastSessionEvents && getNotifiedNodes(id).contains(nodeId))) { log.info("Session " + id + " can't be found"); return null; } @@ -300,6 +307,8 @@ public class RedissonSessionManager extends ManagerBase { throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); } s.expire(); + RSet set = getNotifiedNodes(msg.getSessionId()); + set.add(nodeId); } } diff --git a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java index c5b480caf..e1247d70b 100644 --- a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java +++ b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSession.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.apache.catalina.session.StandardSession; +import org.redisson.api.RSet; import org.redisson.api.RMap; import org.redisson.api.RTopic; import org.redisson.tomcat.RedissonSessionManager.ReadMode; @@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession { } if (broadcastSessionEvents) { + RSet set = redissonManager.getNotifiedNodes(id); + set.add(redissonManager.getNodeId()); + set.expire(60, TimeUnit.SECONDS); map.fastPut(IS_EXPIRATION_LOCKED, true); map.expire(60, TimeUnit.SECONDS); } else { diff --git a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSessionManager.java b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSessionManager.java index 9a881d317..dba307955 100644 --- a/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSessionManager.java +++ b/redisson-tomcat/redisson-tomcat-9/src/main/java/org/redisson/tomcat/RedissonSessionManager.java @@ -33,6 +33,7 @@ import org.apache.catalina.session.ManagerBase; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.redisson.Redisson; +import org.redisson.api.RSet; import org.redisson.api.RMap; import org.redisson.api.RTopic; import org.redisson.api.RedissonClient; @@ -142,6 +143,12 @@ public class RedissonSessionManager extends ManagerBase { } return session; } + + public RSet getNotifiedNodes(String sessionId) { + String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; + String name = keyPrefix + separator + "redisson:tomcat_notified_nodes:" + sessionId; + return redisson.getSet(name, StringCodec.INSTANCE); + } public RMap getMap(String sessionId) { String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; @@ -171,7 +178,7 @@ public class RedissonSessionManager extends ManagerBase { log.error("Can't read session object by id: " + id, e); } - if (attrs.isEmpty()) { + if (attrs.isEmpty() || (broadcastSessionEvents && getNotifiedNodes(id).contains(nodeId))) { log.info("Session " + id + " can't be found"); return null; } @@ -300,6 +307,8 @@ public class RedissonSessionManager extends ManagerBase { throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); } s.expire(); + RSet set = getNotifiedNodes(msg.getSessionId()); + set.add(nodeId); } }