Симулировать клиент повторить попытку

Пока у нас есть симулированный клиент, который в случае исключения мы повторяли, как показано ниже

Retryer<ClientResponse> retryer = RetryerBuilder.<ClientResponse>newBuilder()
  .retryIfExceptionOfType(FeignException.class)
  .withStopStrategy(StopStrategies.stopAfterAttempt(retryCount))
  .withWaitStrategy(WaitStrategies.exponentialWait(maxWaitSeconds, TimeUnit.SECONDS))
  .build();

retryer.call(() -> { 
  return client.doStuffs(someInput); }
);

недавно я попытался перейти от этого пользовательского ретритера к встроенному фетровому ретритеру, как показано ниже:

Feign client = Feign.builder()
                    .decoder(jacksonDecoder)
                    .encoder(jacksonEncoder)
                    .logger(slf4jLogger)
                    .client(okHttpClient)
                    .retryer(new Retryer.Default(SECONDS.toMillis(minWaitSeconds), SECONDS.toMillis(maxWaitSeconds), retryCount))
                    .requestInterceptor(new BasicAuthRequestInterceptor(clientConfig.getUser(), clientConfig.getPassword()))
                    .target(target);

client.doStuffs(someInput);

было понимание, что симулирующий клиент сам позаботится об исключении, но, очевидно, это не так, в тот момент, когда клиент бросает 5xxЯ получаю исключение без повторов. Нужно ли что-то еще, чтобы реализация повторила попытку?

этот сервис в dropwizard, git и SO потоки в основном вокруг пружины / ленты, что не так со мной.

отд

        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-core</artifactId>
            <version>${feign.version}</version>
        </dependency>

1 ответ

Без дополнительной настройки Feign повторит IOExceptionтолько с Если вы хотите повторить попытку на основе кодов состояния, вам необходимо создать ErrorDecoder это бросает RetryableException или производная от, чтобы вызвать повторную попытку.

Вот простой пример:

class MyErrorDecoder implements ErrorDecoder {
    public Exception decode(String methodKey, Response response) {
        if (response.status() == 503) {
            throw new RetryableException(
                response.status(), 
                "Service Unavailable", 
                response.request().httpMethod(), 
                null);
        } else {
            return new RuntimeException("error");
        }
    }
}

Дополнительные примеры можно найти в документации по обработке ошибок.

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