Я писал глобальный фильтр в Spring Cloud Gateway, который создает ресурс, который должен быть доступен для всех последующих фильтров (т. Е. Диапазон OpenCensus, но это здесь не важно) и должен быть закрыт после того, как ответ был написан.
В документации упоминаются глобальные фильтры, включая секции pre
и post
, но у меня есть ощущение, что мой подход может оставить открытые промежутки, если есть какие-либо исключения во время обычной обработки запроса, то есть после выполнения части "pre"фильтр, но перед частью "post".
Вот мой фрагмент:
@Bean
@Order(0)
public GlobalFilter createSpan() {
return (exchange, chain) -> {
/* PRE */
SomethingCloseable resource = Factory.createResource();
exchange.getAttributes().put(THE_RESOURCE, resource);
return chain.filter(exchange).then(Mono.fromRunnable(/* POST */ resource::close));
};
}
В терминах OpenCensus, диапазоны всегда заключаются в документацию try/catch/finally
, а close
вызов всегда выполняется в блоке finally
.
Таким образом, здесь актуален вопрос: будет ли выполнен вызов Closeable#close
, если во время обработки запроса произойдет необработанное исключение, например, в других фильтрах?