Как остановить повторную попытку, когда автоматический выключатель разомкнут в Failsafe - PullRequest
0 голосов
/ 03 июля 2019
public CircuitBreaker<Connection> circuitBreaker(){
    return new CircuitBreaker<>() //Break circuit open
            .handle(ConnectionException.class) //on this exception
            .withFailureThreshold(3) //if failure happens for 3 consecutive times
            .withSuccessThreshold(2) // Close circuit if 3 trail executions succees
            .withDelay(Duration.ofSeconds(120)); //trail executions with delay of 30 seconds

}


public RetryPolicy<Connection> retryPolicy(){
    return new RetryPolicy<>()
            .onFailedAttempt(e -> log.warn("Connection attempt to cache failed"))
            .withMaxRetries(2) //retry 2 times
            .withDelay(Duration.ofSeconds(5)); //every 5 seconds

}

private <T> Connection getRepositoryAdapter(String query){

    return Failsafe.with(fallback,retryPolicy,circuitBreaker)
            .get(this::connect);
}

Приведенный выше фрагмент кода вызывает резервный метод только после повторной попытки, даже если цепь разомкнута.

Как мы можем настроить Failback таким образом, чтобы при разомкнутой цепи метод резервирования вызывался без повторной попытки?(за исключением первого запроса, когда цепь будет закрыта).

Решение Изменение политики повторных попыток для обработки только исключения ConnectionException решает проблему.

public RetryPolicy<Connection> retryPolicy(){
    return new RetryPolicy<>()
        .handle(ConnectionException.class)                
        .onFailedAttempt(e -> log.warn("Connection attempt to cache failed"))
        .withMaxRetries(2) //retry 2 times
        .withDelay(Duration.ofSeconds(5)); //every 5 seconds

}
...