在我的 Spring Boot 微服务中,我使用 OAuth2RestTemplate 进行 REST API 调用。现在,我们必须在其余 api 调用中添加请求超时,为此我尝试过 application.properties 文件中的 spring.mvc.async.request-timeout=20000 但不起作用。
@Configuration
public class ResourceConfig {
@Bean
@LoadBalanced
@Qualifier("oauth2BalancedRestTemplate")
public OAuth2RestTemplate oauth2BalancedRestTemplate(@Qualifier("oauth2RestTemplate") OAuth2RestTemplate bean) {
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(bean.getResource());
restTemplate.setRequestFactory(bean.getRequestFactory());
return restTemplate;
}
@Bean
@LoadBalanced
@Qualifier("oauth2JWTBalancedRestTemplate")
public OAuth2RestTemplate oauth2JWTBalancedRestTemplate(@Qualifier("oauth2JWTRestTemplate") OAuth2RestTemplate bean) {
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(bean.getResource());
restTemplate.setRequestFactory(bean.getRequestFactory());
return restTemplate;
}
}
@Service
public class ApiCall {
@Value("${url}")
private String uri;
@Value("${endpoint}")
private String endpoint;
@Autowired
@Qualifier("oauth2JWTBalancedRestTemplate")
private OAuth2RestTemplate restTemplate;
public Response getTrdDetail(Request req) {
HttpHeaders headers = new HttpHeaders();
HttpEntity<Request> httpEntity = new HttpEntity<Request> (req, headers);
return restTemplate.exchange(uri + endpoint, HttpMethod.POST, httpEntity, Response.class);
}
}
确保这些依赖关系
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
配置 HttpComponentsClientHttpRequestFactory bean,然后将其注入到您的 OAuth2RestTemplate bean 中:
@Configuration
public class ResourceConfig {
@Bean
public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(5000); // 5 seconds
factory.setReadTimeout(5000); // 5 seconds
return factory;
}
@Bean
public OAuth2RestTemplate oAuth2RestTemplate() {
ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails();
resourceDetails.setAccessTokenUri("YOUR_ACCESS_TOKEN_URI");
resourceDetails.setClientId("YOUR_CLIENT_ID");
resourceDetails.setClientSecret("YOUR_CLIENT_SECRET");
resourceDetails.setClientAuthenticationScheme(AuthenticationScheme.header);
OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails);
restTemplate.setRequestFactory(clientHttpRequestFactory());
return restTemplate;
}
}