Нам нужно добавлять повторы при вызовах 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
,Перехватчик вызывается только один раз.
Может ли кто-нибудь дать некоторые рекомендации по этому поводу?
Спасибо