Подтвердить что ты не робот

Java.net.SocketTimeoutException: время чтения после tomcat

У меня есть веб-приложение на основе 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 с, проверим и посмотрим, есть ли какие-либо изменения.

Между тем, если кто-то из вас, ребята, может дать вам экспертное мнение по этому вопросу, это будет очень полезно. Или по любой другой причине, вы можете подумать о том, что может вызвать эту проблему.

4b9b3361

Ответ 1

Сервер пытается прочитать данные из запроса, но он занимает больше времени ожидания для данных, поступающих от клиента. Тайм-аут здесь обычно будет атрибутом tomcat connector → connectionTimeout.

Правильно.

У клиента установлен тайм-аут чтения, а сервер занимает больше времени, чем ответ.

Нет. Это вызовет тайм-аут на клиенте.

Один из потоков, через который я прошел, сказал, что это может произойти с высоким concurrency и если включен keepalive.

Это, очевидно, догадки и совершенно неверные. Это происходит тогда и только тогда, когда данные не поступают в течение таймаута. Период. Load и keepalive и concurrency не имеют к этому никакого отношения.

Это просто означает, что клиент не отправляет. Вам не нужно беспокоиться об этом. Клиенты браузера приходят и уходят всевозможными странными способами.

Ответ 2

Вот основные инструкции:

  1. Найдите файл "server.xml" в папке "conf" под базовым каталогом Tomcat (т.е. %CATALINA_HOME%/conf/server.xml).
  2. Откройте файл в редакторе и найдите <Connector.
  3. Найдите соответствующий соединитель, для которого истекло время ожидания - это обычно будет соединитель HTTP, то есть тот, который имеет protocol="HTTP/1.1".
  4. Если для разъема установлено значение connectionTimeout, его, возможно, потребуется увеличить, например, с 20000 миллисекунд (= 20 секунд) до 120000 миллисекунд (= 2 минуты). Если для connectionTimeout не connectionTimeout значение свойства connectionTimeout, по умолчанию используется значение 60 секунд - если этого недостаточно, возможно, потребуется добавить свойство.
  5. Перезапустите Tomcat

Ответ 3

Connection.Response resp = Jsoup.connect(url) //
                .timeout(20000) //
                .method(Connection.Method.GET) //
                .execute();

На самом деле, ошибка возникает, когда у вас медленный интернет, поэтому постарайтесь максимально увеличить время ожидания, и тогда ваш код будет работать точно так же, как и у меня.

Ответ 4

Я использую 11.2 и получил таймауты.

Я решил использовать версию jsoup ниже.

    <dependency>
        <groupId>org.jsoup</groupId>
        <artifactId>jsoup</artifactId>
        <version>1.7.2</version>
        <scope>compile</scope>
    </dependency>