Как реактивно загружать и обрабатывать большие данные?
Мне нужно начать загрузку некоторого контента по HTTP, а затем прочитать данные как реактивный поток.
Таким образом, хотя загруженные данные большие, я почти сразу же могу прочитать первые несколько байтов тела ответа (не нужно ждать всего тела ответа). Затем выполните некоторые вычисления и через несколько секунд прочитайте другую часть данных. Должен быть некоторый предел кэшируемых данных, потому что оперативная память не может обрабатывать весь контент (его десятки ГБ).
Я пытался использовать HttpClient
"s sendAsync
метод с BodyHandlers.ofInputStream()
, но он всегда блокирует и ожидает поступления всех данных.
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://..."))
.build();
HttpResponse<InputStream> response = client
.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
.get(); // this finishes as soon as the header is received
try {
InputStream stream = response.body();
byte[] test = stream.readNBytes(20); // trying to read just a few bytes
// but it waits for the whole body
} catch (IOException ex) {}
Что мне нужно изменить, чтобы тело ответа загружалось постепенно?
1 ответ
Это ошибка. Это было исправлено в Java 11.0.2: https://bugs.openjdk.java.net/browse/JDK-8212926