我正在使用当前的Spring启动版本(1.4.x),并想知道api调用是否有任何默认超时。我通过设置断点来测试它,但它一直在等待并且没有超时。 我还试图通过使用一些注释或yml设置为我的所有spring-boot应用程序配置默认超时。
我找到了几个替代方案(其中一个here)但是使用callable实际上添加了额外的非业务逻辑代码,其中在xml bean中设置某些东西在最新的Spring启动应用程序中已经过时了。
答案 0 :(得分:4)
您可以在application.properties中尝试server.connection-timeout=5000
。official documentation:
server.connection-timeout =#连接器在关闭连接之前等待另一个HTTP请求的时间(以毫秒为单位)。未设置时,将使用连接器特定于容器的默认值。使用值-1表示没有(即无限)超时。
更新: 刚刚注意到你使用的是微服务架构,所以如果你需要在微服务之间进行通信时需要处理超时,我建议在客户端而不是服务器端处理它。 如果您尝试呼叫的微服务过载,其性能下降到严重影响用户体验的程度,有时退回一些备用数据会比删除请求更好。 < / p>
想象一下,我们拥有一个拥有微服务架构的电子商务网站,其中一个向用户提供建议的微服务变得极其缓慢。在这种情况下,首选的解决方案是返回一些后备数据,这些数据可能是本月十大热门产品,而不是向客户显示5xx错误页面。此外,如果后续请求因超时而失败,我们可以决定避免向“推荐 - 服务”发送请求。并立即返回后备数据。一段时间后,我们可以尝试向“推荐 - 服务”发送请求。再次,如果它变得健康 - 只需使用它而不是后备数据。
这称为 Circuit Breaker 模式,并且已经在名为Hystrix的框架中实现了它。这是一篇很好的文章,深入解释它:http://www.baeldung.com/spring-cloud-netflix-hystrix。 Spring Cloud Feign + Spring Cloud Hystrix看起来非常不错,特别是考虑到它们与Discovery服务开箱即用(例如Spring Cloud Eureka)。
答案 1 :(得分:3)
我同意以上所有选项并在我的春季启动应用程序中尝试以下选项。它现在完美无缺。下面是作为bean的代码示例。现在只需要@Autowire
RestTemplate
我需要它(java class
)。
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setConnectTimeout(15000);
((SimpleClientHttpRequestFactory) restTemplate.getRequestFactory()).setReadTimeout(15000);
return restTemplate;
}
答案 2 :(得分:2)
有几种方法可以做到这一点:
1)将ClientHttpRequestFactory
与RestTemplate
一起使用:
public RestTemplate restTemplate() {
return new RestTemplate(clientHttpRequestFactory());
}
private ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(timeinMillis);
factory.setConnectTimeout(timeinMillis);
return factory;
}
2)第二种方法是使用可调用但我猜你已经探索过这个解决方案。
答案 3 :(得分:0)
可以使用Tomcat的$.alert(divID,'Main Menu',1000,600);
属性设置超时。
请参阅此答案如何为Tomcat设置它。
Configuring maxKeepAliveRequests in Spring Boot embedded Tomcat
答案 4 :(得分:0)
您可以使用注解 @Configuration
创建配置文件
对于使用 RestTemplate:
` @Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return new RestTemplateBuilder()
.setConnectTimeout(Duration.ofMillis(30000))
.setReadTimeout(Duration.ofMillis(30000))
.build();
}`
对于 WebClient 超时:
@Bean
public WebClient webClient() {
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(
HttpClient.create().responseTimeout(Duration.ofMillis(30000))
))
.build();
}
配置完成后,在控制器或任何其他要使用此RestTemplate 或WebClient 的文件中,只需像这样自动装配:
@Autowired
private RestTemplate restTemplate;
或
@Autowired
private WebClient webClient;