diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java index 92b0664a4..4705d8cf6 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/AbstractHawkbitUI.java @@ -23,6 +23,8 @@ import org.eclipse.hawkbit.ui.utils.VaadinMessageSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationListener; +import org.springframework.context.support.AbstractApplicationContext; import org.vaadin.spring.events.EventBus.UIEventBus; import com.vaadin.annotations.Theme; @@ -100,6 +102,21 @@ public abstract class AbstractHawkbitUI extends UI implements DetachListener { if (pushStrategy != null) { pushStrategy.clean(); + clearContextListener(); + } + + SpringContextHelper.clearContext(); + } + + private void clearContextListener() { + if (pushStrategy instanceof ApplicationListener && context instanceof AbstractApplicationContext) { + final ApplicationListener listener = (ApplicationListener) pushStrategy; + ((AbstractApplicationContext) context).getApplicationListeners().remove(listener); + + // we do not need to explicitly remove the listener from + // ApplicationEventMulticaster because it is done by + // UIBeanStore#destroy delegating to + // ApplicationListenerDetector#postProcessBeforeDestruction } } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java index e272be40c..aa2ea94ba 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/push/DelayedEventBusPushStrategy.java @@ -131,6 +131,9 @@ public class DelayedEventBusPushStrategy LOG.debug("Cleanup delayed event push strategy for UI {}", vaadinUI.getUIId()); jobHandle.cancel(true); queue.clear(); + + jobHandle = null; + vaadinUI = null; } private final class DispatchRunnable implements Runnable { diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SpringContextHelper.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SpringContextHelper.java index d268f8aca..6dd535821 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SpringContextHelper.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/utils/SpringContextHelper.java @@ -12,9 +12,6 @@ import org.springframework.context.ApplicationContext; /** * Singleton for the spring application context. - * - * - * */ public final class SpringContextHelper { @@ -27,6 +24,12 @@ public final class SpringContextHelper { // Utility class } + /** + * method to set application context. + * + * @param context + * ApplicationContext + */ public static void setContext(final ApplicationContext context) { SpringContextHelper.context = context; } @@ -70,4 +73,11 @@ public final class SpringContextHelper { return context.getBean(beanName, beanClazz); } + /** + * method to clear application context. + * + */ + public static void clearContext() { + context = null; + } } diff --git a/hawkbit-ui/src/main/resources/hawkbit-ui-defaults.properties b/hawkbit-ui/src/main/resources/hawkbit-ui-defaults.properties index 3ead3843d..b67a37593 100644 --- a/hawkbit-ui/src/main/resources/hawkbit-ui-defaults.properties +++ b/hawkbit-ui/src/main/resources/hawkbit-ui-defaults.properties @@ -12,6 +12,7 @@ vaadin.servlet.productionMode=true vaadin.servlet.urlMapping=/UI/* vaadin.servlet.heartbeatInterval=60 vaadin.servlet.closeIdleSessions=false +server.servlet.session.timeout=300 hawkbit.server.ui.links.documentation.root=https://www.eclipse.org/hawkbit/ hawkbit.server.ui.links.documentation.security=https://www.eclipse.org/hawkbit/concepts/authorization/