Симулировать клиент повторить попытку - PullRequest
0 голосов
/ 11 июля 2019

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

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 потоки в основном вокруг spring / tape, что не так со мной.

dep

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

1 Ответ

0 голосов
/ 18 июля 2019

Без дополнительной настройки 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");
        }
    }
}

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

...