Обработка исключений асинхронных вызовов веб-клиента для вызовов, отличных от REST
Я вызываю веб-клиент Spring следующим образом и получаю ответ Mono (асинхронный). Обратите внимание, что вызов не заблокирован. Я вызываю это в запланированном задании, поэтому этот асинхронный вызов не инициируется вызовом REST. Проблема в том, что когда возникает исключение, оно будет сгенерировано и распечатает всю трассировку стека (я хочу этого избежать). Я просто хочу ловить исключения и регистрировать их более элегантно. Мы не можем поместить логику вокруг предложения try/catch, потому что это вызов Mono. Также я видел, как глобально перехватывать исключения для асинхронных вызовов веб-клиента, но тогда его нужно вызывать через вызов REST. Использование АОП также не является решением, так как это асинхронный монофонический вызов. Итак, как мне захватить исключения и обработать их?
var monoVersionReply = webClient.post().uri(versionInfoApi)
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.retrieve()
.onStatus(HttpStatus::isError, response -> {
if (response.statusCode().is4xxClientError()) {
logger.error("4xx client error: " + response.statusCode() + ", message:" + response);
} else {
logger.error("server error error: " + response.statusCode() + ", message:" + response);
}
return Mono.error(new RemoteApiCallException("service response code is not 200: " + response.statusCode()));
})
.bodyToMono(String.class)
.onErrorMap(Predicate.not(RemoteApiCallException.class::isInstance), throwable -> new RemoteApiCallException(throwable.getMessage()))
.doOnError(e -> logAllErrors(e));
monoVersionReply.subscribe(reply -> handleGetVersionResponse(reply));
В строке 10 верните Mono.error(exception) — это то, что я хочу поймать и обработать. doOnError() работает нормально и обрабатывается правильно.