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 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<String> 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 {

@ -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<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) {
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<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.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<String> 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 {

@ -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<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) {
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<String> set = getNotifiedNodes(msg.getSessionId());
set.add(nodeId);
}
}

@ -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<String> 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 {

@ -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<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) {
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<String> set = getNotifiedNodes(msg.getSessionId());
set.add(nodeId);
}
}

@ -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<String> 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 {

@ -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<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) {
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<String> set = getNotifiedNodes(msg.getSessionId());
set.add(nodeId);
}
}

Loading…
Cancel
Save