反应式假装客户端全局重试
reactive feign client global retry
我正在从 feign 客户端切换到反应式 feign 客户端,我已经为 feign 定义了全局重试器:
@Bean
Retryer retryer() {
return new Retryer.Default(100, 1, 5);
}
@Bean
ErrorDecoder errorDecoder() {
return new HttpErrorDecoder();
}
static class HttpErrorDecoder implements ErrorDecoder {
private final ErrorDecoder defaultErrorDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
Exception exception = defaultErrorDecoder.decode(methodKey, response);
if (response.status() != HttpStatus.SC_OK) {
return new RetryableException(response.status(),
"api call for url: " + response.request().url() + " failed",
response.request().httpMethod(), exception.getCause(), null,
response.request());
}
return exception;
}
}
对于非反应性客户端,重试工作正常,对于反应性客户端,错误解码器会按应有的方式引发 RetryableException,但 Retryer 没有反应 - 没有执行重试。我主要使用 webflux Mono<T>
,有没有办法让它工作,或者 Retryer 对反应式伪装不起作用?如果是这样,是否可以定义“全局重试”,或者我是否需要为每个 call/mono 定义重试?
重试者是 removed from Reactive client. You should use ReactiveRetryPolicy
@Bean
public ReactiveRetryPolicy reactiveRetryPolicy() {
return BasicReactiveRetryPolicy.retryWithBackoff(5, 100);
}
我正在从 feign 客户端切换到反应式 feign 客户端,我已经为 feign 定义了全局重试器:
@Bean
Retryer retryer() {
return new Retryer.Default(100, 1, 5);
}
@Bean
ErrorDecoder errorDecoder() {
return new HttpErrorDecoder();
}
static class HttpErrorDecoder implements ErrorDecoder {
private final ErrorDecoder defaultErrorDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
Exception exception = defaultErrorDecoder.decode(methodKey, response);
if (response.status() != HttpStatus.SC_OK) {
return new RetryableException(response.status(),
"api call for url: " + response.request().url() + " failed",
response.request().httpMethod(), exception.getCause(), null,
response.request());
}
return exception;
}
}
对于非反应性客户端,重试工作正常,对于反应性客户端,错误解码器会按应有的方式引发 RetryableException,但 Retryer 没有反应 - 没有执行重试。我主要使用 webflux Mono<T>
,有没有办法让它工作,或者 Retryer 对反应式伪装不起作用?如果是这样,是否可以定义“全局重试”,或者我是否需要为每个 call/mono 定义重试?
重试者是 removed from Reactive client. You should use ReactiveRetryPolicy
@Bean
public ReactiveRetryPolicy reactiveRetryPolicy() {
return BasicReactiveRetryPolicy.retryWithBackoff(5, 100);
}