views:

84

answers:

1

My web app must process and serve a lot of data to display certain pages. Sometimes, the user closes or refreshes a page while the server is still busy processing it. This means the server will continue to process data for several minutes only to send it to a client who is no longer listening.

Is it possible to detect that the connection has been broken, and react to it?

In this particular project, we're using Django and NginX, or Apache. I assumed this is possible because the Django development server appears to react to cancelled requests by printing Broken Pipe exceptions. I'd love to have it raise an exception that my application code could catch. It appears JSP can do this. So can node.js here.

Alternatively, I could register an unload event handler on the page in question, have it do a synchronous XHR requesting that the previous request from this user be cancelled, and do some kind of inter-process communication to make it so. Perhaps if the slower data processing were handed to another process that I could more easily identify and kill, without killing the responding process...

+1  A: 

HTTP is stateless, hence the only way to detect a disconnected client is via timeouts.

See the answers to this SO question (Java Servlet : How to detect browser closing ?).

Oded
I think stateless is right word for connectionless, :)
jerjer
@jerjer - Thanks for the correction :)
Oded
It seems odd, since TCP should be able to do this. I guess some things are lost in the abstraction.
Nick Retallack
@Nick Retallack - TCP can do this, but the HTTP protocol is defined as stateless. This means that TCP will make sure a request or response will go through reliably, but that's it.
Oded
@Oded yes, but isn't it possible to see if a TCP connection is still being maintained?
Earlz
@Earlz - HTTP would close the TCP connection once the request/response is over, no?
Oded
This is not a satisfactory answer. It is clearly possible. The only difficulty is that most servers do not expose this information easily. They do know it though. They have to know it, or they could not operate. One way to get it is to log disconnects and have your application periodically check the log.
Nick Retallack