From de3ffd3c30e1b4ce279c738cd00dd8ffa8c8a449 Mon Sep 17 00:00:00 2001 From: hengsin Date: Mon, 6 Mar 2023 20:46:22 +0800 Subject: [PATCH] IDEMPIERE-5049 Zk Session and Desktop object not destroy immediately after logout (#1681) - remove unreliable killing of session - increase no message from Desktop check from 3 to 5 --- .../adempiere/webui/util/DesktopWatchDog.java | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/DesktopWatchDog.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/DesktopWatchDog.java index 463a4a2313..3b55e0aa9d 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/DesktopWatchDog.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/util/DesktopWatchDog.java @@ -24,9 +24,7 @@ **********************************************************************/ package org.adempiere.webui.util; -import java.util.ArrayList; import java.util.Iterator; -import java.util.List; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.TimeUnit; @@ -37,7 +35,6 @@ import org.zkoss.zk.ui.WebApp; import org.zkoss.zk.ui.sys.DesktopCache; import org.zkoss.zk.ui.sys.DesktopCtrl; import org.zkoss.zk.ui.sys.ServerPush; -import org.zkoss.zk.ui.sys.SessionCtrl; import org.zkoss.zk.ui.sys.WebAppCtrl; import fi.jawsy.jawwa.zk.atmosphere.AtmosphereServerPush; @@ -49,22 +46,29 @@ import fi.jawsy.jawwa.zk.atmosphere.AtmosphereServerPush; */ public class DesktopWatchDog { + /** singleton instance **/ private final static DesktopWatchDog INSTANCE = new DesktopWatchDog(); + /** Desktops being watched **/ private final ConcurrentLinkedDeque desktops = new ConcurrentLinkedDeque(); + /** + * default constructor + */ private DesktopWatchDog() { Adempiere.getThreadPoolExecutor().scheduleWithFixedDelay(() -> { doMonitoring(); }, 60, 40, TimeUnit.SECONDS); } + /** + * Check each entries in {@link #desktops}. + */ private void doMonitoring() { - List toDestroy = new ArrayList(); - List actives = new ArrayList(); Iterator iterator = desktops.iterator(); while (iterator.hasNext()) { DesktopEntry entry = iterator.next(); + //not active, remove from watch list if (!entry.desktop.isAlive()) { iterator.remove(); continue; @@ -81,33 +85,19 @@ public class DesktopWatchDog { entry.noAtmosphereResourceCount++; else entry.noAtmosphereResourceCount=0; - } - if (entry.noAtmosphereResourceCount >= 3) { + } + if (entry.noAtmosphereResourceCount >= 5) { + //no message from desktop for 5 consecutive run of doMonitoring. + //remove desktop from DesktopCache. iterator.remove(); try { final WebApp wapp = entry.desktop.getWebApp(); final Session session = entry.desktop.getSession(); final DesktopCache desktopCache = ((WebAppCtrl) wapp).getDesktopCache(session); desktopCache.removeDesktop(entry.desktop); - if (!actives.contains(session) && !toDestroy.contains(session)) - toDestroy.add(session); } catch (Throwable t) { t.printStackTrace(); } - } else { - final Session session = entry.desktop.getSession(); - if (!actives.contains(session)) - actives.add(session); - int index = toDestroy.indexOf(session); - if (index >= 0) - toDestroy.remove(index); - } - } - if (!toDestroy.isEmpty()) { - for(Session session : toDestroy) { - if (!((SessionCtrl)session).isInvalidated()) { - ((SessionCtrl)session).invalidateNow(); - } } } }