假冒客户重试异常

时间:2019-07-11 10:59:21

标签: java dropwizard feign openfeign

到目前为止,我们有一个假冒客户,如果发生例外情况,我们通常按以下方式重试

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周围,而我却不是这种情况。

dep

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

1 个答案:

答案 0 :(得分:0)

没有其他配置,Feign将仅在IOException s上重试。如果您希望根据状态代码重试,则需要创建一个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文档。