* Move cleanupSessions() from Application to SessionManager.
This commit is contained in:
parent
a35d3ea425
commit
f7f2604969
2 changed files with 71 additions and 71 deletions
|
@ -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().
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue