Симулировать клиент повторить попытку
Пока у нас есть симулированный клиент, который в случае исключения мы повторяли, как показано ниже
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");
}
}
}
Дополнительные примеры можно найти в документации по обработке ошибок.