Принудительно отбросить тело ответа HTTP в Spring Webflux, чтобы избежать нехватки памятиJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Принудительно отбросить тело ответа HTTP в Spring Webflux, чтобы избежать нехватки памяти

Сообщение Anonymous »

У меня есть реактивный API-интерфейс rest Spring Webflux, который предоставляет конечную точку REST.
Бизнес-логика конечной точки rest проста. На основании некоторого идентификатора я собираюсь вызвать другую стороннюю службу, которую не могу контролировать.
Эта сторонняя веб-служба ответит гигантским ответом JSON, схему которого я заранее не знаю.
Представьте себе гигантский объект ответа JSON. Много-много полей, много уровней глубины. Размер ответа также велик.
Предположим, у меня есть алгоритм, позволяющий просмотреть гигантский JSON и найти нужную мне информацию. Мне просто нужно одно поле и одно значение из этого гигантского ответа JSON. Я просто точно знаю, что ключ и значение JSON находятся в ответе. Но мне нужно искать среди всех ключей и значений гигантского JSON.
@RestController
public class QuestionController {

private final WebClient webClient;

public QuestionController(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://somehost.com/api").build();
}

@GetMapping("/question")
public Mono getUserById(@PathVariable Long id){
return this.webClient.get().uri("/somePath/{id}", id)
.retrieve()
.bodyToMono(JsonNode.class)
.map(oneGiantJsonNode -> complexSearchIntoJson(oneGiantJsonNode))
;
}

private String complexSearchIntoJson(JsonNode oneGiantJsonNode) {
return "here there is a complex algorithm to search through the giant JSON to get the value needed. I WOULD LIKE TO DISCARD THE GIANT JSON ONCE THE VALUE IS OBTAINED";
}

}

Проблема: хотя алгоритм работает нормально, при высокой нагрузке у меня всегда возникает исключение нехватки памяти.
После исследования я считаю, что при высокой нагрузке я делаю много http-вызовов к этому стороннему серверу, что очень надежно, но у меня «слишком много гигантских ответов JSON в моем приложении».
Как мне принудительно отбросить JSON сразу после обнаружения необходимой мне информации из JSON?
Я попробовал наивный вариант, но, похоже, объект не удаляется.

private String complexSearchIntoJson(JsonNode oneGiantJsonNode) {
String resultNeeded = [...];
// force discarding the giant json
oneGiantJsonNode = null;
return resultNeeded;
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... -of-memory
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»