* Move cleanupSessions() from Application to SessionManager.

This commit is contained in:
hns 2007-09-25 10:43:04 +00:00
parent a35d3ea425
commit f7f2604969
2 changed files with 71 additions and 71 deletions

View file

@ -1479,7 +1479,7 @@ public final class Application implements Runnable {
// purge sessions // purge sessions
try { try {
lastSessionCleanup = cleanupSessions(lastSessionCleanup); lastSessionCleanup = sessionMgr.cleanupSessions(lastSessionCleanup);
} catch (Exception x) { } catch (Exception x) {
logError("Error in session cleanup: " + x, x); logError("Error in session cleanup: " + x, x);
} catch (LinkageError x) { } catch (LinkageError x) {
@ -1511,76 +1511,6 @@ public final class Application implements Runnable {
logEvent("Scheduler for " + name + " exiting"); logEvent("Scheduler for " + name + " exiting");
} }
/**
* Purge sessions that have not been used for a certain amount of time.
* This is called by run().
*
* @param lastSessionCleanup the last time sessions were purged
* @return the updated lastSessionCleanup value
*/
private long cleanupSessions(long lastSessionCleanup) {
long now = System.currentTimeMillis();
long sessionCleanupInterval = 60000;
// check if we should clean up user sessions
if ((now - lastSessionCleanup) > sessionCleanupInterval) {
// get session timeout
int sessionTimeout = 30;
try {
sessionTimeout = Math.max(0,
Integer.parseInt(props.getProperty("sessionTimeout",
"30")));
} catch (NumberFormatException nfe) {
logEvent("Invalid sessionTimeout setting: " + props.getProperty("sessionTimeout"));
}
RequestEvaluator thisEvaluator = null;
try {
thisEvaluator = getEvaluator();
Map sessions = sessionMgr.getSessions();
Iterator it = sessions.values().iterator();
while (it.hasNext()) {
Session session = (Session) it.next();
session.pruneUploads();
if ((now - session.lastTouched()) > (sessionTimeout * 60000)) {
NodeHandle userhandle = session.userHandle;
if (userhandle != null) {
try {
Object[] param = {session.getSessionId()};
thisEvaluator.invokeInternal(userhandle, "onLogout", param);
} catch (Exception x) {
// errors should already be logged by requestevaluator, but you never know
logError("Error in onLogout", x);
}
}
sessionMgr.discardSession(session);
}
}
} catch (Exception cx) {
logEvent("Error cleaning up sessions: " + cx);
cx.printStackTrace();
} finally {
if (thisEvaluator != null) {
releaseEvaluator(thisEvaluator);
}
}
return now;
} else {
return lastSessionCleanup;
}
}
/** /**
* Executes cron jobs for the application, which are either * Executes cron jobs for the application, which are either
* defined in app.properties or via app.addCronJob(). * defined in app.properties or via app.addCronJob().

View file

@ -17,6 +17,7 @@ package helma.framework.core;
import helma.objectmodel.INode; import helma.objectmodel.INode;
import helma.objectmodel.db.Node; import helma.objectmodel.db.Node;
import helma.objectmodel.db.NodeHandle;
import helma.scripting.ScriptingEngine; import helma.scripting.ScriptingEngine;
import java.util.*; import java.util.*;
@ -261,4 +262,73 @@ public class SessionManager {
} }
} }
/**
* Purge sessions that have not been used for a certain amount of time.
* This is called by run().
*
* @param lastSessionCleanup the last time sessions were purged
* @return the updated lastSessionCleanup value
*/
protected long cleanupSessions(long lastSessionCleanup) {
long now = System.currentTimeMillis();
long sessionCleanupInterval = 60000;
// check if we should clean up user sessions
if ((now - lastSessionCleanup) > sessionCleanupInterval) {
// get session timeout
int sessionTimeout = 30;
try {
sessionTimeout = Math.max(0,
Integer.parseInt(app.getProperty("sessionTimeout", "30")));
} catch (NumberFormatException nfe) {
app.logEvent("Invalid sessionTimeout setting: " + app.getProperty("sessionTimeout"));
}
RequestEvaluator thisEvaluator = null;
try {
thisEvaluator = app.getEvaluator();
Session[] sessionArray = (Session[]) sessions.values().toArray(new Session[0]);
for (int i = 0; i < sessionArray.length; i++) {
Session session = sessionArray[i];
session.pruneUploads();
if ((now - session.lastTouched()) > (sessionTimeout * 60000)) {
NodeHandle userhandle = session.userHandle;
if (userhandle != null) {
try {
Object[] param = {session.getSessionId()};
thisEvaluator.invokeInternal(userhandle, "onLogout", param);
} catch (Exception x) {
// errors should already be logged by requestevaluator, but you never know
app.logError("Error in onLogout", x);
}
}
discardSession(session);
}
}
} catch (Exception cx) {
app.logEvent("Error cleaning up sessions: " + cx);
cx.printStackTrace();
} finally {
if (thisEvaluator != null) {
app.releaseEvaluator(thisEvaluator);
}
}
return now;
} else {
return lastSessionCleanup;
}
}
} }