web-dev-qa-db-ja.com

java.net.SocketTimeoutException:tomcatでタイムアウトした読み取り

TomcatベースのWebアプリケーションがあります。次の例外が断続的に発生しています。

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. 私が経験したスレッドの1つは、これが高い並行性で発生する可能性があり、キープアライブが有効になっていると言いました。

#1の場合、私が設定した初期値は20秒でしたが、これを最大60秒まで上げ、テストして変更があるかどうかを確認します。

一方、皆さんのいずれかがこれについて専門家の意見を提供できる場合、それは本当に役に立ちます。または、この問題を引き起こす可能性のある他の理由を考えることができます。

47
Vicky

サーバーは要求からデータを読み取ろうとしていますが、クライアントからデータが届くまでのタイムアウト値よりも時間がかかります。ここでのタイムアウトは通常、Tomcatコネクタ-> connectionTimeout属性です。

正しい。

クライアントには読み取りタイムアウトが設定されており、サーバーは応答に時間がかかります。

いいえ。タイムアウトになりますクライアントで

私が経験したスレッドの1つは、これが高い並行性で発生する可能性があり、キープアライブが有効になっていると言いました。

これは明らかに当て推量であり、完全に間違っています。タイムアウト内にデータが到着しない場合にのみ発生します。期間。ロードとキープアライブと同時実行は、それとは何の関係もありません。

クライアントが送信していないことを意味します。心配する必要はありません。ブラウザクライアントは、あらゆる種類の奇妙な方法で出入りします。

36
user207421

基本的な手順は次のとおりです。

  1. Tomcatのベースディレクトリ(つまり、%CATALINA_HOME%/conf/server.xml)の下の「conf」フォルダーで「server.xml」ファイルを見つけます。
  2. エディターでファイルを開き、<Connectorを検索します。
  3. タイムアウトしている関連コネクタを見つけます-これは通常、HTTPコネクタ、つまりprotocol="HTTP/1.1"を持つコネクタです。
  4. connectionTimeout 値がコネクタに設定されている場合、増やす必要がある場合があります。 20000ミリ秒(= 20秒)から120000ミリ秒(= 2分)まで。コネクタにconnectionTimeoutプロパティ値が設定されていない場合、デフォルトは60秒です。これが不十分な場合、プロパティの追加が必要になる場合があります。
  5. Tomcatを再起動します
4
Steve Chambers
Connection.Response resp = Jsoup.connect(url) //
                .timeout(20000) //
                .method(Connection.Method.GET) //
                .execute();

実際には、インターネットが遅いときにエラーが発生するため、タイムアウト時間を最大化しようとすると、コードは間違いなく機能します。

0
Rishabh Gupta