From 0652a702f6c9109ccb858f658b5cf14e6f73b815 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 17 Dec 2023 15:11:59 +0100 Subject: [PATCH] Work on zombie UI sessions clean-up --- .../src/org/argeo/app/swt/ux/SwtArgeoApp.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java index e733e8a..b5ff82d 100644 --- a/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java +++ b/swt/org.argeo.app.swt/src/org/argeo/app/swt/ux/SwtArgeoApp.java @@ -95,7 +95,7 @@ public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber // private CmsUserManager cmsUserManager; // TODO make more optimal or via CmsSession/CmsView - private static Timer janitorTimer = new Timer(true); + private Timer janitorTimer = new Timer(true); private Map> managedUis = new HashMap<>(); // ACR @@ -128,9 +128,6 @@ public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber // TODO does it make sense to accept that? appPid = ""; } - if (log.isDebugEnabled()) - log.info("Argeo Suite App " + appPid + " started"); - Objects.requireNonNull(contentRepository, "Content repository must be provided"); Objects.requireNonNull(appUserState, "App user state must be provided"); @@ -139,25 +136,34 @@ public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber @Override public void run() { - Iterator> uiRefs = managedUis.values().iterator(); - refs: while (uiRefs.hasNext()) { - WeakReference uiRef = uiRefs.next(); - SwtAppUi ui = uiRef.get(); - if (ui == null) { - if (log.isTraceEnabled()) - log.warn("Unreferenced UI in " + appPid + ", removing it"); - uiRefs.remove(); - continue refs; - } - if (!ui.isDisposed() && !ui.getDisplay().isDisposed()) { - ui.getDisplay().asyncExec(() -> ui.disposeIfTimedout()); + try { + Iterator> uiRefs = managedUis.values().iterator(); + refs: while (uiRefs.hasNext()) { + WeakReference uiRef = uiRefs.next(); + SwtAppUi ui = uiRef.get(); + if (ui == null) { + if (log.isTraceEnabled()) + log.warn("Unreferenced UI in " + appPid + ", removing it"); + uiRefs.remove(); + continue refs; + } + if (!ui.isDisposed() && !ui.getDisplay().isDisposed()) { + ui.getDisplay().asyncExec(() -> { + ui.disposeIfTimedout(); + }); + ui.getDisplay().wake(); + } } + if (log.isTraceEnabled()) + log.trace(managedUis.size() + " UIs being managed by app " + appPid); + } catch (Exception e) { + e.printStackTrace(); } - if (log.isTraceEnabled()) - log.trace(managedUis.size() + " UIs being managed by app " + appPid); } }, janitorPeriod, janitorPeriod); + if (log.isDebugEnabled()) + log.info("Argeo Suite App " + appPid + " started"); } public void stop(Map properties) { @@ -196,7 +202,7 @@ public class SwtArgeoApp extends AbstractArgeoApp implements CmsEventSubscriber CmsSwtUtils.registerCmsTheme(uiParent.getShell(), theme); SwtAppUi argeoSuiteUi = new SwtAppUi(uiParent, SWT.INHERIT_DEFAULT); // TODO make timeout configurable - argeoSuiteUi.setUiTimeout(6 * 60 * 60 * 1000);// 6 hours + argeoSuiteUi.setUiTimeout(12 * 60 * 60 * 1000);// 12 hours String uid = cmsView.getUid(); argeoSuiteUi.addDisposeListener(new CleanUpUi(uid)); managedUis.put(uid, new WeakReference<>(argeoSuiteUi)); -- 2.30.2