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
This commit is contained in:
hengsin 2023-03-06 20:46:22 +08:00 committed by GitHub
parent 3e2cd6d23a
commit de3ffd3c30
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 13 additions and 23 deletions

View File

@ -24,9 +24,7 @@
**********************************************************************/ **********************************************************************/
package org.adempiere.webui.util; package org.adempiere.webui.util;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.TimeUnit; 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.DesktopCache;
import org.zkoss.zk.ui.sys.DesktopCtrl; import org.zkoss.zk.ui.sys.DesktopCtrl;
import org.zkoss.zk.ui.sys.ServerPush; import org.zkoss.zk.ui.sys.ServerPush;
import org.zkoss.zk.ui.sys.SessionCtrl;
import org.zkoss.zk.ui.sys.WebAppCtrl; import org.zkoss.zk.ui.sys.WebAppCtrl;
import fi.jawsy.jawwa.zk.atmosphere.AtmosphereServerPush; import fi.jawsy.jawwa.zk.atmosphere.AtmosphereServerPush;
@ -49,22 +46,29 @@ import fi.jawsy.jawwa.zk.atmosphere.AtmosphereServerPush;
*/ */
public class DesktopWatchDog { public class DesktopWatchDog {
/** singleton instance **/
private final static DesktopWatchDog INSTANCE = new DesktopWatchDog(); private final static DesktopWatchDog INSTANCE = new DesktopWatchDog();
/** Desktops being watched **/
private final ConcurrentLinkedDeque<DesktopEntry> desktops = new ConcurrentLinkedDeque<DesktopWatchDog.DesktopEntry>(); private final ConcurrentLinkedDeque<DesktopEntry> desktops = new ConcurrentLinkedDeque<DesktopWatchDog.DesktopEntry>();
/**
* default constructor
*/
private DesktopWatchDog() { private DesktopWatchDog() {
Adempiere.getThreadPoolExecutor().scheduleWithFixedDelay(() -> { Adempiere.getThreadPoolExecutor().scheduleWithFixedDelay(() -> {
doMonitoring(); doMonitoring();
}, 60, 40, TimeUnit.SECONDS); }, 60, 40, TimeUnit.SECONDS);
} }
/**
* Check each entries in {@link #desktops}.
*/
private void doMonitoring() { private void doMonitoring() {
List<Session> toDestroy = new ArrayList<Session>();
List<Session> actives = new ArrayList<Session>();
Iterator<DesktopEntry> iterator = desktops.iterator(); Iterator<DesktopEntry> iterator = desktops.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
DesktopEntry entry = iterator.next(); DesktopEntry entry = iterator.next();
//not active, remove from watch list
if (!entry.desktop.isAlive()) { if (!entry.desktop.isAlive()) {
iterator.remove(); iterator.remove();
continue; continue;
@ -81,33 +85,19 @@ public class DesktopWatchDog {
entry.noAtmosphereResourceCount++; entry.noAtmosphereResourceCount++;
else else
entry.noAtmosphereResourceCount=0; 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(); iterator.remove();
try { try {
final WebApp wapp = entry.desktop.getWebApp(); final WebApp wapp = entry.desktop.getWebApp();
final Session session = entry.desktop.getSession(); final Session session = entry.desktop.getSession();
final DesktopCache desktopCache = ((WebAppCtrl) wapp).getDesktopCache(session); final DesktopCache desktopCache = ((WebAppCtrl) wapp).getDesktopCache(session);
desktopCache.removeDesktop(entry.desktop); desktopCache.removeDesktop(entry.desktop);
if (!actives.contains(session) && !toDestroy.contains(session))
toDestroy.add(session);
} catch (Throwable t) { } catch (Throwable t) {
t.printStackTrace(); 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();
}
} }
} }
} }