-
-
Notifications
You must be signed in to change notification settings - Fork 750
onDisconnect tricks
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():
- If your application is using the BlockingIOCometSupport (Tomcat's 7 and less default connector), onDisconnect will not be called. You must use an NIO based connector.
- If you are using Jetty (all versions), onDisconnect will not be called when there is an unexpected network outage or when the browser hasn't sent the close message.
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.
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>
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
- Understanding Atmosphere
- Understanding @ManagedService
- Using javax.inject.Inject and javax.inject.PostConstruct annotation
- Understanding Atmosphere's Annotation
- Understanding AtmosphereResource
- Understanding AtmosphereHandler
- Understanding WebSocketHandler
- Understanding Broadcaster
- Understanding BroadcasterCache
- Understanding Meteor
- Understanding BroadcastFilter
- Understanding Atmosphere's Events Listeners
- Understanding AtmosphereInterceptor
- Configuring Atmosphere for Performance
- Understanding JavaScript functions
- Understanding AtmosphereResourceSession
- Improving Performance by using the PoolableBroadcasterFactory
- Using Atmosphere Jersey API
- Using Meteor API
- Using AtmosphereHandler API
- Using Socket.IO
- Using GWT
- Writing HTML5 Server-Sent Events
- Using STOMP protocol
- Streaming WebSocket messages
- Configuring Atmosphere's Classes Creation and Injection
- Using AtmosphereInterceptor to customize Atmosphere Framework
- Writing WebSocket sub protocol
- Configuring Atmosphere for the Cloud
- Injecting Atmosphere's Components in Jersey
- Sharing connection between Browser's windows and tabs
- Understanding AtmosphereResourceSession
- Manage installed services
- Server Side: javadoc API
- Server Side: atmosphere.xml and web.xml configuration
- Client Side: atmosphere.js API