2013-06-13 163 views
29

我有一個基於tomcat的web應用程序。我間歇性地收到以下異常,java.net.SocketTimeoutException:在tomcat下讀取超時

Caused by: java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:150) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:532) 
    at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:501) 
    at org.apache.coyote.http11.InternalInputBuffer$InputStreamInputBuffer.doRead(InternalInputBuffer.java:563) 
    at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:124) 
    at org.apache.coyote.http11.AbstractInputBuffer.doRead(AbstractInputBuffer.java:346) 
    at org.apache.coyote.Request.doRead(Request.java:422) 
    at org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:290) 
    at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:431) 
    at org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:315) 
    at org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:200) 
    at java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:385) 

不幸的是我沒有訪問到客戶端,所以我只是想在這可能發生各種原因確認,

  1. 服務器嘗試從請求中讀取數據,但是其花費的時間超過了從客戶端到達的數據的超時值。超時在這裏通常是tomcat連接器 - > connectionTimeout屬性。

  2. 客戶端具有讀取超時設置,並且服務器花費的時間比響應時間要長。

  3. 我經歷的線程之一,說這可能發生在高併發性和Keepalive被啓用。

對於#1,我設定的初始值是20秒,我已經將它撞到了60秒,將測試並查看是否有任何變化。

同時,如果你們中的任何一個人都可以就此提供專家意見,那真的很有幫助。或者因爲這個原因你可以想到哪些可能會導致這個問題。

在此先感謝。

玉萍

+0

我不相信這是2點;但是,爲了確認您還應該設置一個'AccessLogValve'並嘗試將此異常與特定請求關聯起來。 – fge

+0

嗨Vicky,你能解決這個問題嗎?我面臨同樣的問題。 – Elina

回答

29

服務器嘗試從請求讀取數據,但其採取比數據從客戶端到達超時值。超時在這裏通常是tomcat連接器 - > connectionTimeout屬性。

正確。

客戶端有一個讀超時設置,並且服務器正在長於迴應。

號,將導致在客戶端超時

我經歷的線程之一,說這可能發生在高併發性和Keepalive被啓用。

這顯然是猜測,並且完全不正確。當且僅當沒有數據在超時內到達時纔會發生。期。負載和保活和併發與它無關。

它只是意味着客戶端不發送。你不需要擔心它。瀏覽器客戶端以各種奇怪的方式來來去去。

+0

感謝您的輸入。 – Vicky

+0

對於#1作爲我說,我已經顛簸Tomcat的連接器的連接超時值從20秒到60秒。如果超時減少,我會嘗試將其更改爲-1(無限)進行測試,並最終設置一個更合適的值。對於#2,如果假設客戶端超時應該在服務器上預期什麼錯誤/異常? – Vicky

+0

如果客戶端超時讀取響應,則服務器根本不會看到任何內容,否則可能會看到「連接重置」。我不會把服務器讀取超時時間設得太高:它會連接一個線程。如果一個客戶端打開一個到服務器的連接,並且不立即發送任何東西,那麼這個操作會非常糟糕。 – EJP

-3

我使用11.2和接收超時。

我用下面jsoup的版本解決。

<dependency> 
     <groupId>org.jsoup</groupId> 
     <artifactId>jsoup</artifactId> 
     <version>1.7.2</version> 
     <scope>compile</scope> 
    </dependency> 
相關問題