Можно ли пропустить автоматические выключатели Micronaut для некоторых кодов состояния HTTP?

Есть ли способ настроить автоматический выключатель Micronaut так, чтобы он не открывался для определенных кодов состояния HTTP? Если я, например, провожу поиск элемента и этот элемент не найден, то сервер может вернуть HTTP-статус 404. Это может быть вполне допустимый ответ, и я не хочу, чтобы в этих случаях размыкался автоматический выключатель.

Насколько я понимаю, автоматический выключатель Micronaut не привязан к HTTP, но все же есть решение, которое почти доводит меня до нужного состояния:

@Client("${myEndpoint}")
@CircuitBreaker(attempts = "4", predicate = ServerErrorRetryPredicate.class)
public interface MyClient {
    @Get
    Single<MyItem> getItem(int itemId);
}

public class ServerErrorRetryPredicate implements RetryPredicate {
    @Override
    public boolean test(Throwable throwable) {
        if (throwable instanceof HttpClientResponseException) {
            HttpClientResponseException e = (HttpClientResponseException) throwable;
            return e.getStatus().getCode() >= 500;
        }
        return true;
    }
}

Здесь я использую новый предикат, который поставляется с Micronaut 2, и в этом случае предикат не работает, если статус HTTP меньше 500 (поэтому он не будет работать для статуса HTTP 404, который я получаю, когда элемент не найден). Это отлично работает, чтобы избежать повторных попыток, но не влияет на автоматические выключатели.

Можно ли избежать размыкания выключателя на основе результата предиката, как если бы повторная попытка была пропущена на его основе?

1 ответ

Глядя на DefaultRetryInterceptor, автоматический выключатель размыкается при возникновении исключения. Также http-клиент micronaut всегда выдает ошибку при ответе 404 (за исключением блокирующих клиентов), что вызывает срабатывание автоматического выключателя.

В predicate, excludes а также includes поля @CircuitBreaker похоже, используется только для функции повтора.

Другие вопросы по тегам