I seem to be having trouble with some tcp requests getting "stuck" at times, like it is waiting for some response but the connection has been "severed" so a response will never come. Is this expected behavior for HttpURLConnection with default timeouts? Are there sensible defaults set so that I can't get into this odd "hung" situation by default?
1 Answers
Appears the "default" timeouts for HttpURLConnection are zero which means "no timeout."
Unfortunately, in my experience, it appears using these defaults can lead to an unstable state, depending on what happens with your connection to the server. If you use an HttpURLConnection
and don't explicitly set (at least read) timeouts, your connection can get into a permanent stale state. By default. So always set setReadTimeout
to "something" or you might orphan connections (and possibly threads depending on how your app runs).
It appears from trial and error that calling setConnectTimeout
isn't required because the socket itself seems to have like a 2 minute "connect timeout" built in (at least in OS X).
You may also be able to set a "global default" for the timeouts by adjusting system properties.
Fix/prognosis: always set a readTimeout (even if very large), or use a different client that lets you set SO_KEEPALIVE. The default without these result in threads hanging "forever" without it (when/if they do a read), or on stale sockets sticking around forever...

- 62,887
- 36
- 269
- 388
-
I find it very odd that the Java HTTP API would not override that default two minute connect timeout with the infinite setting. What else would be the point of allowing you to set the read or connect timeouts if the OS is basically going to use a system setting instead? – Lo-Tan Oct 17 '18 at 23:20
-
1The default is 2 minutes, you "can" override it to infinity, I believe (but shouldn't, in my experience!) – rogerdpack Nov 06 '18 at 18:25