假装客户端重试异常
Feign client retry on exception
到目前为止,我们有一个假客户端,在出现异常的情况下,我们曾经按以下方式重试
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 / ribbon 而我不是这种情况。
部门
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>${feign.version}</version>
</dependency>
无需额外配置,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");
}
}
}
有关更多示例,请查看 Error Handling 文档。
到目前为止,我们有一个假客户端,在出现异常的情况下,我们曾经按以下方式重试
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 / ribbon 而我不是这种情况。
部门
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-core</artifactId>
<version>${feign.version}</version>
</dependency>
无需额外配置,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");
}
}
}
有关更多示例,请查看 Error Handling 文档。