* 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
|
||||
try {
|
||||
lastSessionCleanup = cleanupSessions(lastSessionCleanup);
|
||||
lastSessionCleanup = sessionMgr.cleanupSessions(lastSessionCleanup);
|
||||
} catch (Exception x) {
|
||||
logError("Error in session cleanup: " + x, x);
|
||||
} catch (LinkageError x) {
|
||||
|
@ -1511,76 +1511,6 @@ public final class Application implements Runnable {
|
|||
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
|
||||
* defined in app.properties or via app.addCronJob().
|
||||
|
|
|
@ -17,6 +17,7 @@ package helma.framework.core;
|
|||
|
||||
import helma.objectmodel.INode;
|
||||
import helma.objectmodel.db.Node;
|
||||
import helma.objectmodel.db.NodeHandle;
|
||||
import helma.scripting.ScriptingEngine;
|
||||
|
||||
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