diff options
author | Beat Schwarzentrub | 2018-12-18 09:22:18 +0000 |
---|---|---|
committer | Beat Schwarzentrub | 2018-12-18 19:01:59 +0000 |
commit | bec0b89d6a016345e4397c45e0d0b67e015c4f1f (patch) | |
tree | 22ec9c4ea551f70336e9a65e939427c07df8841e | |
parent | 83d7666519b0df569c86bed96e7f5f647de4e253 (diff) | |
download | org.eclipse.scout.rt-features/bschwarzent/tmp_20181218.tar.gz org.eclipse.scout.rt-features/bschwarzent/tmp_20181218.tar.xz org.eclipse.scout.rt-features/bschwarzent/tmp_20181218.zip |
Change-Id: Ieb5da89c245b6aebe5ead6583c273f88779667a9
-rw-r--r-- | org.eclipse.scout.rt.ui.html/src/main/java/org/eclipse/scout/rt/ui/html/json/JsonMessageRequestHandler.java | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/org.eclipse.scout.rt.ui.html/src/main/java/org/eclipse/scout/rt/ui/html/json/JsonMessageRequestHandler.java b/org.eclipse.scout.rt.ui.html/src/main/java/org/eclipse/scout/rt/ui/html/json/JsonMessageRequestHandler.java index 41616b67ee..02d6dd1a5f 100644 --- a/org.eclipse.scout.rt.ui.html/src/main/java/org/eclipse/scout/rt/ui/html/json/JsonMessageRequestHandler.java +++ b/org.eclipse.scout.rt.ui.html/src/main/java/org/eclipse/scout/rt/ui/html/json/JsonMessageRequestHandler.java @@ -11,6 +11,7 @@ package org.eclipse.scout.rt.ui.html.json; import java.io.IOException; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; import javax.servlet.ServletResponse; @@ -27,6 +28,9 @@ import org.eclipse.scout.rt.platform.config.PlatformConfigProperties.Application import org.eclipse.scout.rt.platform.context.RunContexts; import org.eclipse.scout.rt.platform.exception.DefaultExceptionTranslator; import org.eclipse.scout.rt.platform.exception.PlatformError; +import org.eclipse.scout.rt.platform.job.IFuture; +import org.eclipse.scout.rt.platform.job.Jobs; +import org.eclipse.scout.rt.platform.job.internal.ExecutionSemaphore; import org.eclipse.scout.rt.platform.resource.MimeType; import org.eclipse.scout.rt.platform.util.ObjectUtility; import org.eclipse.scout.rt.platform.util.StringUtility; @@ -42,6 +46,7 @@ import org.eclipse.scout.rt.ui.html.UiSession; import org.eclipse.scout.rt.ui.html.json.JsonRequest.RequestType; import org.eclipse.scout.rt.ui.html.logging.IUiRunContextDiagnostics; import org.json.JSONObject; +import org.quartz.SimpleScheduleBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; @@ -367,12 +372,33 @@ public class JsonMessageRequestHandler extends AbstractUiServletRequestHandler { throw e; } sessionStore.registerUiSession(uiSession); + startValidationJob(uiSession); LOG.info("Created new UI session with ID {} in {} ms [maxIdleTime={}s, httpSession.maxInactiveInterval={}s]", uiSession.getUiSessionId(), StringUtility.formatNanos(System.nanoTime() - startNanos), m_maxUserIdleTime, req.getSession().getMaxInactiveInterval()); return uiSession; } + protected void startValidationJob(final IUiSession uiSession) { + LOG.info("Started validation job for UI session with ID {}", uiSession.getUiSessionId()); + Jobs.schedule(() -> { + int idleSeconds = (int) ((System.currentTimeMillis() - uiSession.getLastAccessedTime()) / 1000L); + int maxIdleSeconds = m_maxUserIdleTime; + LOG.info("Idle time for UI session with ID {}: {} s (maxUserIdleTime={})", uiSession.getUiSessionId(), idleSeconds, maxIdleSeconds); + if (idleSeconds > maxIdleSeconds) { + LOG.info("UI session with ID {} seems to be idle for {} seconds (maxUserIdleTime={}) -> disposing this session", uiSession.getUiSessionId(), idleSeconds, maxIdleSeconds); + IFuture.CURRENT.get().cancel(false); + uiSession.dispose(); + } + }, Jobs.newInput() + .withRunContext(RunContexts.empty()) + .withName("UI session validator [id={}]", uiSession.getUiSessionId()) + .withExecutionSemaphore(BEANS.get(ExecutionSemaphore.class).withPermits(1)) + .withExecutionTrigger(Jobs.newExecutionTrigger() + .withStartIn(1, TimeUnit.MINUTES) + .withSchedule(SimpleScheduleBuilder.repeatMinutelyForever()))); + } + /** * @return <code>true</code> if session is valid, <code>false</code> otherwise */ |