SpringBoot OAuth2RestTemplate повторных запросов - PullRequest
0 голосов
/ 08 мая 2019

Нам нужно добавлять повторы при вызовах API, в котором есть Oauth2 из Spring.

Мы не нашли простого способа сделать это.Мы даже попробовали перехватчик, но нам не повезло.

Вот наш код:

Application.java

@EnableRetry
@SpringBootApplication
public class Application {

    public static void main(String args[]) {
        SpringApplication.run(Application.class);
    }

    @Bean
    public OAuth2RestTemplate oAuth2RestTemplate(ClientHttpRequestInterceptor interceptor) {
        List<String> scopes = new ArrayList<>();
        scopes.add("some-scope");

        ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
        resourceDetails.setAccessTokenUri("tokenUrl");
        resourceDetails.setClientId("client-id");
        resourceDetails.setClientSecret("client-secret");
        resourceDetails.setScope(scopes);

        OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(resourceDetails);

        List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>();
        interceptors.add(interceptor);
        oAuth2RestTemplate.setInterceptors(interceptors);
        return oAuth2RestTemplate;
    }

    @Bean
    public CommandLineRunner run(OAuth2RestTemplate oAuth2RestTemplate) throws Exception {
        return args -> {
            oAuth2RestTemplate.getForObject(
                    "some-url-that-returns-error.com", Quote.class);
        };
    }
}

MyInterceptor.java

@Component
public class MyInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
        return interceptWithRetry(httpRequest, bytes, execution);
    }

    @Retryable
    private ClientHttpResponse interceptWithRetry(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution execution) throws IOException {
        System.out.println("====================================");
        return execution.execute(httpRequest, bytes);
    }
}

И зависимости в нашем pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
            <version>2.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Когда мы запускаем это и возникает ошибка, мы не можем видеть повторную попытку вызова, независимо от того, какие параметры мы передаем в @Retryable,Перехватчик вызывается только один раз.

Может ли кто-нибудь дать некоторые рекомендации по этому поводу?

Спасибо

1 Ответ

0 голосов
/ 08 мая 2019

Мы до сих пор не знаем причину, по которой Retryable не работал в перехватчике. В итоге мы переместили аннотацию к методу в Сервисе и полностью избавились от перехватчика.

SomeService.java

@Service
public class SomeService {

    private OAuth2RestTemplate restTemplate;

    public SomeService(OAuth2RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @Retryable
    public Quote getSomething() {
        System.out.println("============= THIS WILL THROW AN EXCEPTION =================");
        return restTemplate.getForObject(
                "some-url-that-returns-error.com", Quote.class);
    }

}

Это работает. Однако было бы неплохо иметь что-то, чтобы избежать повторения @Retryable(params) для каждого метода каждого сервиса.

Пока я отмечу вопрос как ответивший.

...