detach() event in Listener never called

I have seen some old posts and this
but cannot seem to get the detach() event.

I am using the code below to initialize the servlet params and then build a little UI.

        What I was expecting is that if I closed my browser, eventyually after 15 seconds or more, I would get 

the detach event triggered, But that does not seem to happen.

I read in other threads that it does not work with @Push or websockets etc. I tried removing @Push but it still does not get called.

Am I doing something wrong ? Or is my assumption that this method should be called when a browser closes incorrect ?

Thanks for any help.

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 {

protected void init(VaadinRequest request) {
    addDetachListener(new DetachListener() {
        public void detach(DetachEvent event) {
                System.err.println("Detach Event = "+event.getConnector().getConnectorId());

                // UI Code here 


Some more info :- I am running my code from within Eclipse using Tomcat 7.x (not sure if that makes any difference)

It looks like I do get the events, but only when I open a new browser request after the previous one has expired.

In fact with chrome, I simply need to type http://local and autocomplete brings up the URL (without loading it ) and that causes the old session to detach …

Is there any way around this ? Ideally I would like the server to detect the loss of hearbeat without having to wait for a new request,

Hello. Same problem.

Have you checked if this Add-On actually does what you are trying to do?!addon/cleanupservlet-add-on

Well, i try to use minimal count of add-ons.
In this case i create service, that close timeouted UIs and Sessions.

public class VaadinServletWithListeners extends VaadinServlet {

    private static ConcurrentHashMap<VaadinSession, Integer> mapVaadinSessionToCodOp = new ConcurrentHashMap<>();

    protected void servletInitialized() throws ServletException {

        VaadinService.getCurrent().addSessionInitListener((SessionInitListener) event -> {
            VaadinSession session = event.getSession();
            mapVaadinSessionToCodOp.put(session, 0);

            String remoteAddr = event.getRequest().getRemoteAddr();

        VaadinService.getCurrent().addSessionDestroyListener((SessionDestroyListener) event -> {
            VaadinSession session = event.getSession();

    public static synchronized ConcurrentHashMap<VaadinSession, Integer> getMapVaadinSessionToCodOp(){
        return mapVaadinSessionToCodOp;

public class SessionAndUICloser {

public void closeSessionsAndUIs() {
    int defaultHeartbeatInterval = DefaultDeploymentConfiguration.DEFAULT_HEARTBEAT_INTERVAL;
    int cleanupIntervalMillis = 3 * 1000 * defaultHeartbeatInterval;

    // Close all timeouted UIs and Sessions
    ConcurrentHashMap<VaadinSession, Integer> allSessionsWithCodOps = VaadinServletWithListeners.getMapVaadinSessionToCodOp();
    Enumeration<VaadinSession> keys = allSessionsWithCodOps.keys();
    while (keys.hasMoreElements()){
        VaadinSession vaadinSession = keys.nextElement();
        Collection<UI> uIs = vaadinSession.getUIs();
        boolean hasAliveUIs = false;
        for (UI ui : uIs){
            if (System.currentTimeMillis() > ui.getLastHeartbeatTimestamp() + cleanupIntervalMillis){
            } else {
                hasAliveUIs = true;
        if (!hasAliveUIs){

[/code]SessionAndUICloser starts with SPRING-scheduler with period 60 sec.
Second Integer in Map - it is user id in my purposes.

Maybe this code has some bugs and memory leaks?