Установка времени ожидания в URL-соединении - Принудительное завершение чтения данных с помощью метода, аналогичного HttpURLConnection.setReadTimeout () - PullRequest
0 голосов
/ 19 февраля 2019

Согласно этому ответу , метод HttpURLConnection.setReadTimeout() позволяет установить максимальное время ожидания сервера для START чтения данных из входного потока - как указано Oracle:

Исключение SocketTimeoutException может генерироваться при чтении из возвращенного входного потока, если истекает время ожидания чтения до того, как данные станут доступны для чтения.

Это не позволяет вам установитьтайм-аут, чтобы заставить сервер FINISH чтение данных в течение определенного периода времени

Мой вопрос:

Есть ли способ установить тайм-аут, чтобы заставить сервер завершить чтениеданные за указанный промежуток времени или это вообще невозможно?

Спасибо

1 Ответ

0 голосов
/ 19 февраля 2019

Вы не можете установить timeout, согласно вашему требованию, на HttpURLConnection.
Однако вы могли бы смягчить ситуацию, используя отдельный Thread.

Получить ExecutoreService

final ExecutorService executor = Executors.newSingleThreadExecutor();

Отправьте задачу Callable<T>, где T - это тип данных, который вы вернете после чтения из потока данных HttpURLConnection.

final Future<T> result = executor.submit(new HttpTask());

Вы получитеFuture<T>, представляющий результат вашей задачи.
Теперь используйте метод Future#get(long timeout, TimeUnit unit).

try {
   final T value = result.get(10, TimeUnit.SECONDS);
} catch (final TimeoutException e) {
   result.cancel(true);
}

В этом случае, если пройдет более 10 секунд, будет TimeoutExceptionбыть брошенным, и вы сможете внезапно завершить свою задачу.

...