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)
К сожалению, у меня нет доступа к клиенту, поэтому я просто пытаюсь подтвердить по разным причинам, что это может произойти,
Сервер пытается прочитать данные из запроса, но это занимает больше времени, чем значение тайм-аута для получения данных от клиента. Тайм-аут здесь, как правило, будет соединителем tomcat → атрибут connectionTimeout.
У клиента установлен тайм-аут чтения, и серверу требуется больше времени, чтобы ответить.
Один из потоков, через который я прошел, сказал, что это может произойти с высоким параллелизмом и если включен keepalive.
Для # 1 начальное значение, которое я установил, было 20 с, я увеличил его до 60 с, проверим и посмотрим, есть ли какие-либо изменения.
Между тем, если кто-то из вас, ребята, может дать вам экспертное мнение по этому вопросу, это будет очень полезно. Или по любой другой причине, вы можете подумать о том, что может вызвать эту проблему.
Ответы
Ответ 1
Сервер пытается прочитать данные из запроса, но он занимает больше времени ожидания для данных, поступающих от клиента. Тайм-аут здесь обычно будет атрибутом tomcat connector → connectionTimeout.
Правильно.
У клиента установлен тайм-аут чтения, а сервер занимает больше времени, чем ответ.
Нет. Это вызовет тайм-аут на клиенте.
Один из потоков, через который я прошел, сказал, что это может произойти с высоким concurrency и если включен keepalive.
Это, очевидно, догадки и совершенно неверные. Это происходит тогда и только тогда, когда данные не поступают в течение таймаута. Период. Load и keepalive и concurrency не имеют к этому никакого отношения.
Это просто означает, что клиент не отправляет. Вам не нужно беспокоиться об этом. Клиенты браузера приходят и уходят всевозможными странными способами.
Ответ 2
Вот основные инструкции:
- Найдите файл "server.xml" в папке "conf" под базовым каталогом Tomcat (т.е.
%CATALINA_HOME%/conf/server.xml
). - Откройте файл в редакторе и найдите
<Connector
. - Найдите соответствующий соединитель, для которого истекло время ожидания - это обычно будет соединитель HTTP, то есть тот, который имеет
protocol="HTTP/1.1"
. - Если для разъема установлено значение
connectionTimeout
, его, возможно, потребуется увеличить, например, с 20000 миллисекунд (= 20 секунд) до 120000 миллисекунд (= 2 минуты). Если для connectionTimeout
не connectionTimeout
значение свойства connectionTimeout
, по умолчанию используется значение 60 секунд - если этого недостаточно, возможно, потребуется добавить свойство. - Перезапустите 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>