Как получить текущую скорость передачи данных в Commons HttpClient 3.x
-
20-09-2019 - |
Вопрос
У меня есть код, который выполняет несколько HTTP GET, POST и PUT, используя Commons HttpClient 3.1.Я хотел бы предоставить индикатор текущей скорости передачи в моем графическом интерфейсе, но не смог найти никаких методов для определения скорости передачи обрабатываемого HttpMethod.
Я мог бы легко просто рассчитать время передачи и выполнить некоторые простые математические вычисления после ее завершения, чтобы определить, какова была скорость, но это ухудшает взаимодействие с пользователем во время длительной загрузки или скачивания.Кто-нибудь знает, как определить скорость передачи запроса Commons HttpClient? пока оно еще обрабатывается?
Решение
Я не часто использовал HttpClient, поэтому здесь может быть простой крючок.Однако, похоже, что HttpConnection.getResponseInputStream() возвращает простой InputStream
.
Чтобы добавить хук самостоятельно, вам нужно переопределить HttpConnectionManager
и HttpConnection
, чтобы вернуть декорированный поток, который отслеживает количество прочитанных байтов.Затем вы можете запустить второй поток для опроса этого потока и отображения скорости передачи или (лучше) создать поток с обратным вызовом каждые N байт (лучше, потому что вам не нужно заботиться о параллелизме, и вы также можете установить N так что обратный вызов вызывается только для больших файлов).
Другие советы
Более простым крючком было бы расширить HttpEntityWrapper
и переопределить getContent()
метод:
public InputStream getContent() throws IOException {
InputStream wrappedin = wrappedEntity.getContent();
return new MyTransferRateInputStream(wrappedin);
}
Позже вы можете добавить это в качестве перехватчика ответа.
httpClient.addResponseInterceptor(HttpResponseInterceptor itcp)
Таким образом, вам не нужно переопределять упомянутое HttpConnectionManager
и HttpConnection