onDisconnect tricks - Atmosphere/atmosphere Wiki

When the browser is closing the connection, it is possible, on the server side, to get notified and take appropriate steps. An application just has to register an AtmosphereResourceEventListener or WebSocketEventListener and implement the logic inside the onDisconnect method:

// resource is an instance of AtmosphereResource
resource.addListener( new AtmosphereResourceEventListenerAdapter () {
    /**
     * {@inheritDoc}
     */
    @Override
    public void onDisconnect(AtmosphereResourceEvent event) {
        logger.trace("", event);
        if (event.isCancelled()) {
             // Unexpected closing. The client didn't send the close message when request.enableProtocol
        } else if (event.isClosedByClient()) {
            // atmosphere.js has send the close message. 
            // This API is only with 1.1 and up
        }
    }
}

There are some restrictions for event.isCancelled():

WIFI, Network Outage and WebSocket

If you are using a browser running on a mobile/embedded device, e.g Chrome on iOS, if you turn off your WIFI connection (manually or if you lose it), the server won't be able to detect the disconnection. In that case, you can set the org.atmosphere.websocket.maxIdleTime init-param, which will close the underlying connection after the idle time expires:

        <init-param>
            <param-name>org.atmosphere.websocket.maxIdleTime</param-name>
            <param-value>30000</param-value>
        </init-param>

If you need to support other transports as well, it is recommended to use the property defined below.

With Atmosphere 2.1.x

Install the IdleResourceInterceptor and set the idle time using:

        <init-param>
            <param-name>org.atmosphere.cpr.CometSupport.maxInactiveActivity</param-name>
            <param-value>30000</param-value>
        </init-param>

With Atmosphere 2.0.x

The workaround, for those restrictions, is to fake detection by adding, in web/application.xml

        <init-param>
            <param-name>org.atmosphere.cpr.CometSupport.maxInactiveActivity</param-name>
            <param-value>30000</param-value>
        </init-param>

That will check if a connection has been idle more than 30 seconds and close it, like the disconnect detection would have done.

If you are using Atmosphere 1.0.12 and up, see Detecting Browser close's situation when using long polling