diff --git a/src/main/java/org/appng/tomcat/session/SessionManager.java b/src/main/java/org/appng/tomcat/session/SessionManager.java index b8c5674..e437fe1 100644 --- a/src/main/java/org/appng/tomcat/session/SessionManager.java +++ b/src/main/java/org/appng/tomcat/session/SessionManager.java @@ -227,7 +227,7 @@ public void remove(org.apache.catalina.Session session, boolean expired) { * Session to be removed */ public void removeLocal(org.apache.catalina.Session session) { - if (session.getIdInternal() != null) { + if (null != session && session.getIdInternal() != null) { org.apache.catalina.Session removed = sessions.remove(session.getIdInternal()); if (log().isTraceEnabled()) { String message = null == removed ? "%s was not locally cached." 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 aa87f62..7fe6468 100644 --- a/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastSessionManager.java +++ b/src/main/java/org/appng/tomcat/session/hazelcast/HazelcastSessionManager.java @@ -116,21 +116,35 @@ public void processExpires() { } else { keys = getPersistentSessions().keySet(); } + + if (log.isDebugEnabled()) { + log.debug(String.format("Performing expiration check for %s sessions.", keys.size())); + } + AtomicInteger count = new AtomicInteger(0); keys.forEach(k -> { - SessionData sessionData = getPersistentSessions().get(k); try { - Session session = Session.load(this, sessionData); - if (null == session) { - // session is not valid, so manager.remove(session, true) already has been called - // which in turn will remove the session from the local cache and also from the persistent store - count.incrementAndGet(); - if (log.isTraceEnabled()) { - log.trace(String.format("%s has been removed by internal expiration", k, mapName)); + SessionData sessionData = getPersistentSessions().get(k); + if (null == sessionData) { + if (log.isDebugEnabled()) { + log.debug(String.format("Session %s not found in persistent store.", k)); + } + if (sticky) { + removeLocal(sessions.get(k)); + } + } else { + Session session = Session.load(this, sessionData); + if (null == session) { + // session is not valid, so manager.remove(session, true) already has been called + // which in turn will remove the session from the local cache and also from the persistent store + count.incrementAndGet(); + if (log.isTraceEnabled()) { + log.trace(String.format("%s has been removed by internal expiration", k, mapName)); + } } } - } catch (Exception e) { - log.error("Error expiring session " + k, e); + } catch (Throwable t) { + log.error("Error expiring session " + k, t); } }); long timeEnd = System.currentTimeMillis();