Поэтому я использую Google Volley
для HTTP-запроса, который в основном использует Java
HttpURLConnection
.
Согласно моим тестам, проблема заключается в этом:
Когда время ожидания "чтения" на HttpURLConnection
достигает, перед закрытием соединения выполняется молчащий повтор, а соответствующее исключение выбрано (SocketTimeoutException
).
Примечание, что:
- Я заметил эту ошибку при использовании запроса HTTP POST
.
- Тайм-аут "чтения" отличается от тайм-аута "connect".
- Если тайм-аут "read" (установленный вызовом connection.setReadTimeout(int)
) НЕ установлен (0) или установлен на большее значение, чем connection.setConnectTimeout(int)
, эта ошибка не возникает.
- Этот вопрос обсуждался, например, здесь, но я не нашел удовлетворительного решения.
- Несколько сопутствующую проблему можно найти здесь, но я не уверен, что это релевантно (не так ли?)
Дополнительные сведения
Мое приложение используется для оплаты денег, поэтому не требуется повторная попытка запроса (да, я знаю, что он может обрабатываться сервером, я хочу, чтобы мой клиент был "правильным" ) в любом случае).
Когда установлен тайм-аут "read" , в случае установления соединения с сервером, но сервер ожидает /sleeps/delayays -response, время "timeout" перед ответом (таким образом, возникает исключение "read" , а не "connect" ') другой (тихий) запрос отправляется непосредственно перед тем, как это исключение будет поднято, в результате чего будут получены 2 похожих запроса, что неприемлемо.
Какое решение я ищу?
Ну, это тот, который будет хорошо решить эту проблему/ошибку, так же, как исправлено объяснение здесь (но я снова считаю, что это не имеет значения в этом случай).
Кроме того, я хотел бы сохранить исходный поток как есть, что означает не принуждение соединения к закрытию или что-то в этом роде.
То, что я собираюсь сделать на данный момент, устанавливает тайм-аут "read" в два раза "тайм-аут соединения" (они начинают подсчитывать в то же время), чтобы убедиться, что исключение "connection" возникает в первую очередь. Я также попытаюсь решить эту проблему на стороне сервера. Проблема в том, что этот тайм-аут "read" существует по какой-то причине, и моя текущая реализация практически просто игнорирует его и обрабатывает только таймауты "соединения".
ИЗМЕНИТЬ
Библиотека Volley
RetryPolicy
не повлияла на эту проблему, так как это повторение молчания.
Я выглядел как можно глубже в библиотеке. Журналы/точки останова повсюду, отменены вызовы повторной попытки. Это, как я знаю, это проблема 99.99% a HttpURLConnection
.