У меня есть реактивный 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
Принудительно отбросить тело ответа HTTP в Spring Webflux, чтобы избежать нехватки памяти ⇐ JAVA
Программисты JAVA общаются здесь
1766517041
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79853900/force-discard-of-the-http-response-body-in-spring-webflux-to-avoid-out-of-memory[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия