Симулировать клиента Retryer с новым перехватчиком запроса? - PullRequest
0 голосов
/ 27 ноября 2018

В настоящее время я создаю симулируемый клиент вручную и передаю ему Перехватчики для авторизации.Я хотел бы иметь более умный Retryer для некоторого кода ответа.

public class myErrorEncoder extends ErrorDecoder.Default {

@Override
public Exception decode(final String methodKey, final Response response) {
    if (response.status() == 401) {
        String token = refreshToken();  // I would like to refresh the token and Edit the client
        return new RetryableException("Token Expired will retry it", null);
    } else {
        return super.decode(methodKey, response);
    }
}

}

Перехватчик

@Bean public CustomInterceptor getInterceptor(String token) {
    return new CustomInterceptor(token);}

Feign Builder

 private <T> T feignBuild(final Class<T> clazz, final String uri, final String token) {
    return Feign
            .builder().client(new ApacheHttpClient())
            .encoder(new GsonEncoder())
            .decoder(new ResponseEntityDecoder(feignDecoder())
            .retryer(new Retryer.Default(1,100,3))
            .errorDecoder(new ErrorDecoder())
            .requestInterceptor(getInterceptor(token))
            .contract(new ClientContract())
            .logger(new Slf4jLogger(clazz)).target(clazz, uri);
}

Теперь я хотел бы обновить симулированный клиент с обновленным токеном и повторить попытку.Есть ли способ получить доступ к экземпляру клиента и настроить его.

1 Ответ

0 голосов
/ 15 декабря 2018

Ваше использование перехватчика неверно.Перехватчики повторно применяются во время повторных попыток, но они создаются только один раз и, как ожидается, будут поточно-ориентированными.Для достижения того, что вы ищете, необходимо отделить генерацию токена от перехватчика и попросить перехватчик запросить новый токен.

public class TokenInterceptor() {
   TokenService tokenService;

   public TokenInterceptor(TokenService tokenService) {
      this.tokenService = tokenService;
   }

   public void apply(RequestTemplate template) {
      /* getToken() should create a new token */
      String token = this.tokenService.getToken();
      template.header("Authorization", "Bearer " + token);
   }
}

Это обеспечит создание нового токена в каждом цикле повторов.

...