From 80587ebe17b9bdcfeb830ffb435db5b0d49eb418 Mon Sep 17 00:00:00 2001 From: madness-inc Date: Wed, 25 Jan 2023 16:17:29 +0100 Subject: [PATCH] ATS-34 --- .../org/appng/tomcat/session/SessionManager.java | 8 ++++---- .../session/hazelcast/HazelcastSessionManager.java | 13 ++++++++++--- .../tomcat/session/mongo/MongoSessionManager.java | 11 ++++++++--- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/appng/tomcat/session/SessionManager.java b/src/main/java/org/appng/tomcat/session/SessionManager.java index e69b5f7..5866a1f 100644 --- a/src/main/java/org/appng/tomcat/session/SessionManager.java +++ b/src/main/java/org/appng/tomcat/session/SessionManager.java @@ -67,10 +67,10 @@ public abstract class SessionManager extends ManagerBase { /** * Remove the session from the underlying persistent storage * - * @param session - * the session to remove + * @param id + * the session ID to remove */ - public abstract void removeInternal(org.apache.catalina.Session session); + public abstract void removeInternal(String id); public abstract Log log(); @@ -212,7 +212,7 @@ public void add(org.apache.catalina.Session session) { @Override public void remove(org.apache.catalina.Session session, boolean expired) { super.remove(session, expired); - removeInternal(session); + removeInternal(session.getId()); if (expired && log().isDebugEnabled()) { String message = String.format(Locale.ENGLISH, "[%s] %s has expired (created: %s, last accessed: %s, maxLifeTime: %ss, age: %ss)", diff --git a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastSessionManager.java b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastSessionManager.java index 74302fa..de0e81e 100644 --- a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastSessionManager.java +++ b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastSessionManager.java @@ -3,6 +3,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.ObjectStreamException; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -143,6 +144,12 @@ public void processExpires() { if (expireInternal(id, sessionData)) { count.incrementAndGet(); } + } catch (ObjectStreamException ose) { + log.info(String.format("{} occurred while checking session {} for expiration, so it will be removed: {}", + ose.getClass(), id, ose.getMessage())); + sessions.remove(id); + removeInternal(id); + count.incrementAndGet(); } catch (Throwable t) { log.error(String.format("Error expiring session %s", id), t); } @@ -193,10 +200,10 @@ protected SessionData findSessionInternal(String id) throws IOException { } @Override - public void removeInternal(org.apache.catalina.Session session) { - SessionData removed = getPersistentSessions().remove(session.getId()); + public void removeInternal(String id) { + SessionData removed = getPersistentSessions().remove(id); if (null != removed && log.isTraceEnabled()) { - log.trace(String.format("[%s] %s has been removed from '%s'", removed.getSite(), session.getId(), mapName)); + log.trace(String.format("[%s] %s has been removed from '%s'", removed.getSite(), id, mapName)); } } diff --git a/src/main/java/org/appng/tomcat/session/mongo/MongoSessionManager.java b/src/main/java/org/appng/tomcat/session/mongo/MongoSessionManager.java index 6114c24..37ca72f 100644 --- a/src/main/java/org/appng/tomcat/session/mongo/MongoSessionManager.java +++ b/src/main/java/org/appng/tomcat/session/mongo/MongoSessionManager.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.ObjectStreamException; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -27,7 +28,6 @@ import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleState; -import org.apache.catalina.Session; import org.apache.juli.logging.Log; import org.appng.tomcat.session.SessionData; import org.appng.tomcat.session.SessionManager; @@ -259,8 +259,7 @@ protected void updateSession(String id, SessionData sessionData) throws IOExcept } @Override - public void removeInternal(Session session) { - String id = session.getId(); + public void removeInternal(String id) { BasicDBObject sessionQuery = sessionQuery(id); try { this.collection.remove(sessionQuery); @@ -285,6 +284,12 @@ public void processExpires() { if (expireInternal(id, loadSession(id, mongoSession))) { count.incrementAndGet(); } + } catch (ObjectStreamException ose) { + log.info(String.format("{} occurred while checking session {} for expiration, so it will be removed: {}", + ose.getClass(), id, ose.getMessage())); + sessions.remove(id); + removeInternal(id); + count.incrementAndGet(); } catch (Throwable t) { log.error(String.format("Error expiring session %s", id), t); }