Fixed - Tomcat Session doesn't expire if broadcastSessionEvents = true #2104

pull/2152/head
Nikita Koksharov 6 years ago
parent ad03cba3fa
commit 2dc424c665

@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.catalina.session.StandardSession; import org.apache.catalina.session.StandardSession;
import org.redisson.api.RSet;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.tomcat.RedissonSessionManager.ReadMode; import org.redisson.tomcat.RedissonSessionManager.ReadMode;
@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession {
} }
if (broadcastSessionEvents) { if (broadcastSessionEvents) {
RSet<String> set = redissonManager.getNotifiedNodes(id);
set.add(redissonManager.getNodeId());
set.expire(60, TimeUnit.SECONDS);
map.fastPut(IS_EXPIRATION_LOCKED, true); map.fastPut(IS_EXPIRATION_LOCKED, true);
map.expire(60, TimeUnit.SECONDS); map.expire(60, TimeUnit.SECONDS);
} else { } else {

@ -37,6 +37,7 @@ import org.apache.catalina.util.LifecycleSupport;
import org.apache.juli.logging.Log; import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory; import org.apache.juli.logging.LogFactory;
import org.redisson.Redisson; import org.redisson.Redisson;
import org.redisson.api.RSet;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
@ -166,6 +167,12 @@ public class RedissonSessionManager extends ManagerBase implements Lifecycle {
return session; return session;
} }
public RSet<String> 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<String, Object> getMap(String sessionId) { public RMap<String, Object> getMap(String sessionId) {
String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":";
String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId; 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); 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"); log.info("Session " + id + " can't be found");
return null; return null;
} }
@ -322,6 +329,8 @@ public class RedissonSessionManager extends ManagerBase implements Lifecycle {
throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); throw new IllegalStateException("Unable to find session: " + msg.getSessionId());
} }
s.expire(); s.expire();
RSet<String> set = getNotifiedNodes(msg.getSessionId());
set.add(nodeId);
} }
} }

@ -30,6 +30,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.catalina.session.StandardSession; import org.apache.catalina.session.StandardSession;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RSet;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.tomcat.RedissonSessionManager.ReadMode; import org.redisson.tomcat.RedissonSessionManager.ReadMode;
import org.redisson.tomcat.RedissonSessionManager.UpdateMode; import org.redisson.tomcat.RedissonSessionManager.UpdateMode;
@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession {
} }
if (broadcastSessionEvents) { if (broadcastSessionEvents) {
RSet<String> set = redissonManager.getNotifiedNodes(id);
set.add(redissonManager.getNodeId());
set.expire(60, TimeUnit.SECONDS);
map.fastPut(IS_EXPIRATION_LOCKED, true); map.fastPut(IS_EXPIRATION_LOCKED, true);
map.expire(60, TimeUnit.SECONDS); map.expire(60, TimeUnit.SECONDS);
} else { } else {

@ -35,6 +35,7 @@ import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory; import org.apache.juli.logging.LogFactory;
import org.redisson.Redisson; import org.redisson.Redisson;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RSet;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener; import org.redisson.api.listener.MessageListener;
@ -144,6 +145,12 @@ public class RedissonSessionManager extends ManagerBase {
return session; return session;
} }
public RSet<String> 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<String, Object> getMap(String sessionId) { public RMap<String, Object> getMap(String sessionId) {
String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":";
String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId; 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); 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"); log.info("Session " + id + " can't be found");
return null; return null;
} }
@ -302,6 +309,8 @@ public class RedissonSessionManager extends ManagerBase {
throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); throw new IllegalStateException("Unable to find session: " + msg.getSessionId());
} }
s.expire(); s.expire();
RSet<String> set = getNotifiedNodes(msg.getSessionId());
set.add(nodeId);
} }
} }

@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.catalina.session.StandardSession; import org.apache.catalina.session.StandardSession;
import org.redisson.api.RSet;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.tomcat.RedissonSessionManager.ReadMode; import org.redisson.tomcat.RedissonSessionManager.ReadMode;
@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession {
} }
if (broadcastSessionEvents) { if (broadcastSessionEvents) {
RSet<String> set = redissonManager.getNotifiedNodes(id);
set.add(redissonManager.getNodeId());
set.expire(60, TimeUnit.SECONDS);
map.fastPut(IS_EXPIRATION_LOCKED, true); map.fastPut(IS_EXPIRATION_LOCKED, true);
map.expire(60, TimeUnit.SECONDS); map.expire(60, TimeUnit.SECONDS);
} else { } else {

@ -33,6 +33,7 @@ import org.apache.catalina.session.ManagerBase;
import org.apache.juli.logging.Log; import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory; import org.apache.juli.logging.LogFactory;
import org.redisson.Redisson; import org.redisson.Redisson;
import org.redisson.api.RSet;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
@ -143,6 +144,12 @@ public class RedissonSessionManager extends ManagerBase {
return session; return session;
} }
public RSet<String> 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<String, Object> getMap(String sessionId) { public RMap<String, Object> getMap(String sessionId) {
String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":";
String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId; String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId;
@ -171,7 +178,7 @@ public class RedissonSessionManager extends ManagerBase {
log.error("Can't read session object by id: " + id, e); 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"); log.info("Session " + id + " can't be found");
return null; return null;
} }
@ -300,6 +307,8 @@ public class RedissonSessionManager extends ManagerBase {
throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); throw new IllegalStateException("Unable to find session: " + msg.getSessionId());
} }
s.expire(); s.expire();
RSet<String> set = getNotifiedNodes(msg.getSessionId());
set.add(nodeId);
} }
} }

@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.catalina.session.StandardSession; import org.apache.catalina.session.StandardSession;
import org.redisson.api.RSet;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.tomcat.RedissonSessionManager.ReadMode; import org.redisson.tomcat.RedissonSessionManager.ReadMode;
@ -152,6 +153,9 @@ public class RedissonSession extends StandardSession {
} }
if (broadcastSessionEvents) { if (broadcastSessionEvents) {
RSet<String> set = redissonManager.getNotifiedNodes(id);
set.add(redissonManager.getNodeId());
set.expire(60, TimeUnit.SECONDS);
map.fastPut(IS_EXPIRATION_LOCKED, true); map.fastPut(IS_EXPIRATION_LOCKED, true);
map.expire(60, TimeUnit.SECONDS); map.expire(60, TimeUnit.SECONDS);
} else { } else {

@ -33,6 +33,7 @@ import org.apache.catalina.session.ManagerBase;
import org.apache.juli.logging.Log; import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory; import org.apache.juli.logging.LogFactory;
import org.redisson.Redisson; import org.redisson.Redisson;
import org.redisson.api.RSet;
import org.redisson.api.RMap; import org.redisson.api.RMap;
import org.redisson.api.RTopic; import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
@ -143,6 +144,12 @@ public class RedissonSessionManager extends ManagerBase {
return session; return session;
} }
public RSet<String> 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<String, Object> getMap(String sessionId) { public RMap<String, Object> getMap(String sessionId) {
String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":"; String separator = keyPrefix == null || keyPrefix.isEmpty() ? "" : ":";
String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId; String name = keyPrefix + separator + "redisson:tomcat_session:" + sessionId;
@ -171,7 +178,7 @@ public class RedissonSessionManager extends ManagerBase {
log.error("Can't read session object by id: " + id, e); 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"); log.info("Session " + id + " can't be found");
return null; return null;
} }
@ -300,6 +307,8 @@ public class RedissonSessionManager extends ManagerBase {
throw new IllegalStateException("Unable to find session: " + msg.getSessionId()); throw new IllegalStateException("Unable to find session: " + msg.getSessionId());
} }
s.expire(); s.expire();
RSet<String> set = getNotifiedNodes(msg.getSessionId());
set.add(nodeId);
} }
} }

Loading…
Cancel
Save