Исключение Java: время ожидания чтения сокета

Я пытаюсь обратиться к очень тяжелому процессу. Средняя продолжительность работы оценивается в 9-10 минут.

Когда я выполняю этот процесс, я устанавливаю тайм-аут для смехотворно огромного числа: 99999999.

Через 2 минуты я получаю следующую ошибку:

java.net.SocketTimeoutException: время ожидания чтения

Я попытался связать его еще немного, и я установил тайм-аут на 3000, и через 3 секунды, как и ожидалось, я получил ту же ошибку.

Есть ли у вас какие-либо идеи о том, почему socket.setSoTimeout(99999999) задает значение 120000 max?

Ответ 1

У меня была та же проблема, и решение не использовалось socket.shutdownInput(); socket.shutDownOutput(); до последнего времени чтения или записи данных в сокет. Это заставило сокет перейти в состояние FIN_WAIT, ожидая за 2 минуты до закрытия. Вы можете прочитать об этом в этом сообщении

Ответ 2

Ясно, что вы не устанавливаете тайм-аут, который, по вашему мнению, вы устанавливаете, или кто-то еще его меняет. Вам нужно будет опубликовать код, чтобы получить дальнейшее разъяснение.

Обратите внимание, что в соответствии с W.R. Stevens в TCP/IP Illustrated, том II, № 17.4 тайм-аут удерживается коротким числом целых 1000 Гц, поэтому тайм-аут, превышающий 11 минут, невозможен. Это относится к BSD-коду.

Ответ 3

Я не уверен, как работает ваше приложение, но попытайтесь установить бесконечный тайм-аут в сокет

public void setSoTimeout(int timeout)
              throws SocketException

Включить/отключить SO_TIMEOUT с указанным таймаутом в миллисекундах. Если этот параметр установлен на ненулевой тайм-аут, вызов read() на InputStream, связанный с этим Socket, будет блокироваться только на это количество времени. Если истечение времени ожидания истекает, появляется java.net.SocketTimeoutException, хотя Socket все еще действителен. Опция должна быть активирована до того, как будет введена операция блокировки. Тайм-аут должен быть > 0. Тайм-аут нуля интерпретируется как бесконечный тайм-аут.

Если вы предоставите больше информации о своем вызове, я могу улучшить ответ.