未调用 Vaadin Web 应用程序中的分离事件

Detach event in Vaadin web app not getting called

我的问题源于一个与这里几乎相同的问题(最终没有得到满意的答案):

https://vaadin.com/forum/thread/13932610

像这个人一样,我希望在关闭打开我的应用程序的浏览器时,会触发分离事件;然而,这并没有发生。我试过添加分离侦听器,覆盖分离方法,并同时执行这两项操作,但其中 none 成功了。至于我怎么知道分离事件没有被调用,我的分离事件是一个简单的打印语句——它没有出现在输出中。

请注意,就像在上述线程中一样,我已经设置了心跳间隔(在我的例子中为 2 秒)并将 closeIdelSessions 设置为 true。所以,我以为我只需要等待六秒钟,但事实并非如此。

当我尝试这个(找到下面代码的基本部分)时,detach() 最终被调用。我 运行 使用 Jetty,我没有触及它的默认设置。关闭浏览器后大约需要 45 分钟,当我看到 "Detach called" 登录控制台时。所以是的,时间很长。原因是最后一个 UI 只有在 HttpSession 过期后才会被清理(这取决于应用程序容器等设置)。如果你想更快地进行强制清理,你需要使用https://vaadin.com/directory/component/cleanupservlet-add-on

@Push
@SuppressWarnings("serial")
public class DemoUI extends UI {

    @WebServlet(value = "/*", asyncSupported = true)
    @VaadinServletConfiguration(productionMode = false, ui = DemoUI.class, heartbeatInterval=5, closeIdleSessions=true)
    public static class Servlet extends VaadinServlet {
    }

    @Override
    public void detach() {
        System.out.println("Detach called");                            
    }

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        ...
    }