У меня есть приложение Java, которое использует Spring RestTemplate API для написания кратких, читаемых пользователей служб JSON REST:
По существу:
RestTemplate rest = new RestTemplate(clientHttpRequestFactory);
ResponseEntity<ItemList> response = rest.exchange(url,
HttpMethod.GET,
requestEntity,
ItemList.class);
for(Item item : response.getBody().getItems()) {
handler.onItem(item);
}
Ответ JSON содержит список элементов, и, как вы можете видеть, у меня есть управляемый событиями проект в моем собственном коде для обработки каждого элемента по очереди. Однако весь список находится в памяти как часть response
, который создает RestTemplate.exchange()
.
Я хотел бы, чтобы приложение могло обрабатывать ответы, содержащие большое количество элементов - например, 50 000, и в этом случае есть две проблемы с реализацией:
- Ни один элемент не обрабатывается до тех пор, пока весь HTTP-ответ не будет перенесен - добавление нежелательной задержки.
- Огромный объект ответа находится в памяти и не может быть GC'd до тех пор, пока не будет обработан последний элемент.
Существует ли достаточно зрелый API-интерфейс Java JSON/REST, который потребляет ответы в зависимости от событий?
Я предполагаю, что это позволит вам сделать что-то вроде:
RestStreamer rest = new RestStreamer(clientHttpRequestFactory);
// Tell the RestStreamer "when, while parsing a response, you encounter a JSON
// element matching JSONPath "$.items[*]" pass it to "handler" for processing.
rest.onJsonPath("$.items[*]").handle(handler);
// Tell the RestStreamer to make an HTTP request, parse it as a stream.
// We expect "handler" to get passed an object each time the parser encounters
// an item.
rest.execute(url, HttpMethod.GET, requestEntity);
Я очень благодарен, что смог реализовать свою собственную реализацию этого поведения с помощью потоковых JSON-API от Jackson, GSON и т.д. - но мне бы хотелось, чтобы мне сказали, что есть что-то там, что делает это надежно с кратким, выразительным API, интегрированный с аспектом HTTP.