Нужно ли вручную чистить кэш после использования PredicateSpec.readBody()?
У меня есть простой микросервис на 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 это происходит автоматически?
Дополнительно:
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Да, необходимо вручную очищать кэш после использования метода PredicateSpec.readBody().
Когда вы используете метод PredicateSpec.readBody(), вы читаете тело запроса и кэшируете его для последующего использования. Однако, если вы не очистите кэш после использования, это может привести к утечкам памяти и другим проблемам.
Чтобы очистить кэш после использования PredicateSpec.readBody(), вам нужно вызвать метод clearBody() в объекте PredicateSpec. Например, если у вас есть переменная spec, содержащая объект PredicateSpec, вы можете вызвать spec.clearBody() для очистки кэша.
Ниже приведен пример использования метода PredicateSpec.readBody() с последующей очисткой кэша:
PredicateSpec spec = PredicateSpec.readBody(); // используем тело запроса ... // очищаем кэш spec.clearBody();
Таким образом, рекомендуется всегда очищать кэш после использования PredicateSpec.readBody(), чтобы избежать возможных проблем с утечкой памяти и обеспечить более эффективное использование ресурсов.