2014-02-18 36 views
2

我正在使用HTTPClient庫,並且我遇到了一個奇怪的問題,其中Socket.close()調用永遠不會返回導致TimeoutException。這種情況偶爾會發生,我可以在10%的時間內重現它。Socket.close()永遠不會返回在操作系統上導致TimeoutException

我在Android 4.2,4.3和4.4上看到此問題。

下面是Android的Bug票我對這個問題的產生:
http://code.google.com/p/android/issues/detail?id=66102

任何想法,爲什麼Socket.close會永遠永遠掛?我該如何避免這種情況?謝謝!

02-17 20:48:31.800: E/AndroidRuntime(12871): FATAL EXCEPTION: FinalizerWatchdogDaemon 
02-17 20:48:31.800: E/AndroidRuntime(12871): Process: com.vblast.sample, PID: 12871 
02-17 20:48:31.800: E/AndroidRuntime(12871): java.util.concurrent.TimeoutException: org.apache.http.impl.conn.PoolingHttpClientConnectionManager.finalize() timed out after 10 seconds 
02-17 20:48:31.800: E/AndroidRuntime(12871): at libcore.io.Posix.close(Native Method) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at libcore.io.BlockGuardOs.close(BlockGuardOs.java:75) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at libcore.io.IoBridge.closeSocket(IoBridge.java:188) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at java.net.PlainSocketImpl.close(PlainSocketImpl.java:162) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at java.net.Socket.close(Socket.java:317) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at org.apache.http.impl.BHttpConnectionBase.close(BHttpConnectionBase.java:346) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at org.apache.http.impl.conn.LoggingManagedHttpClientConnection.close(LoggingManagedHttpClientConnection.java:83) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at org.apache.http.impl.conn.CPoolEntry.closeConnection(CPoolEntry.java:70) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at org.apache.http.impl.conn.CPoolEntry.close(CPoolEntry.java:96) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at org.apache.http.pool.AbstractConnPool.shutdown(AbstractConnPool.java:127) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.shutdown(PoolingHttpClientConnectionManager.java:347) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.finalize(PoolingHttpClientConnectionManager.java:168) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:187) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:170) 
02-17 20:48:31.800: E/AndroidRuntime(12871): at java.lang.Thread.run(Thread.java:841) 
+0

是設置超時的選項? – RyPope

+0

好,因爲關閉永遠懸掛,我假設關閉調用與可能的超時值設置無關... – Jona

回答

2

結果我混淆了使用Socket.setSoLinger()作爲我的連接超時設置導致長時間掛起,因此TimeoutException。 :/

這是Socket.setSoLinger()做:

如果插座連接器處於連接模式,並且SO_LINGER選項設置 與非零逗留時間的插座和插座具有 的未數據,那麼close()將阻塞高達當前的延遲間隔,直到傳輸所有數據爲止。

http://pubs.opengroup.org/onlinepubs/009695399/functions/close.html

0

這裏真正的問題是,您泄露了連接,要求在關閉時關閉連接。你需要檢查你的代碼,以確保最後關閉塊。您可能還必須自己調用HttpURLConnection.disconnect()。

+0

我打電話給CloseableHttpResponse.close()。這應該足夠好。我沒有使用HttpURLConnection類。即使泄漏連接,它不應該掛在調用Socket.close()正確?我只是不確定什麼會導致Socket.close()掛起。 – Jona

相關問題