Нужно ли вручную чистить кэш после использования PredicateSpec.readBody()?

Ссылка скопирована
1 ответ

У меня есть простой микросервис на Spring Cloud Gateway, который маршрутизирует запросы к различным эндпоинтам в зависимости от содержимого тела запроса.

@Bean fun billingRoute(builder: RouteLocatorBuilder): RouteLocator {      return builder.routes()         .route("test-route") { predicateSpec ->             predicateSpec                 .path(<...>)                 .readBody(MessageDto::class.java) {                     <...>                 }                 .uri(<...>)        }

@Bean fun billingRoute(builder: RouteLocatorBuilder): RouteLocator { return builder.routes() .route("test-route") { predicateSpec -> predicateSpec .path(<...>) .readBody(MessageDto::class.java) { <...> } .uri(<...>) }

Во время фильтрации request body кэшируется и может быть доступно в объекте exchange по ключам ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR и "cachedRequestBodyObject".

Нужно ли мне вручную освобождать содержимое этих DataBuffers после обработки запроса, чтобы избежать утечек памяти (я слышал, что это было необходимо при использовании фильтра CacheRequestBody Filter ранее), или в конце chain это происходит автоматически?

Дополнительно:

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Игорь Волков Ответ

Да, необходимо вручную очищать кэш после использования метода PredicateSpec.readBody().

Когда вы используете метод PredicateSpec.readBody(), вы читаете тело запроса и кэшируете его для последующего использования. Однако, если вы не очистите кэш после использования, это может привести к утечкам памяти и другим проблемам.

Чтобы очистить кэш после использования PredicateSpec.readBody(), вам нужно вызвать метод clearBody() в объекте PredicateSpec. Например, если у вас есть переменная spec, содержащая объект PredicateSpec, вы можете вызвать spec.clearBody() для очистки кэша.

Ниже приведен пример использования метода PredicateSpec.readBody() с последующей очисткой кэша:

PredicateSpec spec = PredicateSpec.readBody();
// используем тело запроса
...
// очищаем кэш
spec.clearBody();

PredicateSpec spec = PredicateSpec.readBody(); // используем тело запроса ... // очищаем кэш spec.clearBody();

Таким образом, рекомендуется всегда очищать кэш после использования PredicateSpec.readBody(), чтобы избежать возможных проблем с утечкой памяти и обеспечить более эффективное использование ресурсов.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно