当前位置: 首页 > 知识库问答 >
问题:

如何在Spring的AsynCrestTemplate上设置超时?

吉嘉珍
2023-03-14

我在我的项目中设置了一个RestTemplate和一个AsyncRestTemplate,如下所示:

我注意到连接超时实际上并不起作用,除非我将httpRequestFactory()bean更改为如下所示:

@Bean
public ClientHttpRequestFactory httpRequestFactory() {
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient());
    factory.setConnectTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
    factory.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
    return factory;
}

如果我将DEFAULT_READ_TIMEOUT_MILLISECONDS设置为5,则当我使用restTemplate时会发生超时(正如预期的那样)。但是,当我使用AsyncRestTemplate时,不会发生超时。我已经像httpRequestFactory()一样修改了asyncHttpRequestFactory(),但没有修改骰子。

@Bean
public AsyncClientHttpRequestFactory asyncHttpRequestFactory() {
    HttpComponentsAsyncClientHttpRequestFactory factory = new HttpComponentsAsyncClientHttpRequestFactory(asyncHttpClient());
    factory.setConnectTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
    factory.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
    return factory;
}

下面是我如何尝试在Spring MVC控制器中使用AsyncRestTemplate:

String url = "...";
// Start the clock
long start = System.currentTimeMillis();

ListenableFuture<ResponseEntity<String>> results = asyncRestTemplate.getForEntity(url, String.class);
// Wait until the request is finished
while (!(results.isDone())) {
    Thread.sleep(10); //millisecond pause between each check
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - start));
return results.get().getBody();

与此相关的是,https://spring.io/guides/gs/async-method/使用了@async和RestTemplate,似乎可以实现我所要实现的目标。与RestTemplate相比,使用AsyncRestTemplate有什么优势?

共有1个答案

章承
2023-03-14

与同步非常相似:

final SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setTaskExecutor(new SimpleAsyncTaskExecutor());
requestFactory.setConnectTimeout(connectTimeout);
requestFactory.setReadTimeout(readTimeout);

final AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
asyncRestTemplate.setAsyncRequestFactory(requestFactory); 

从源代码中可以看到,AsyncrestTemplate实例是通过使用SimpleClientTtpRequestFactorySimpleAsynctAskExecutor创建的。因此您可以使用设置了超时值的SimpleClientTtpRequestFactory实例来执行相同的操作。

 类似资料:
  • 我有一些可能需要一段时间才能执行的REST API,我想限制它们的执行持续时间。优选地,如果30秒过去了并且请求没有返回,我希望返回特定的HTTP代码/数据并完全终止该请求。 当前代码:

  • 问题内容: 我org.springframework.ws.client.core.WebServiceTemplate用于拨打Web服务。如何为通话配置超时。 问题答案: 如果你使用的是Spring Webservices 2.1.0版本,则可以使用HttpComponentsMessageSender设置超时。 Spring不推荐使用CommonsHttpMessageSender,因此不再推

  • 问题内容: 我正在尝试在使用http.request且没有运气的HTTP客户端上设置超时。到目前为止,我所做的是: 有什么提示吗? 问题答案: 现在可以使用option和相应的request事件:

  • 问题内容: 我正在尝试在WebClient上设置超时,这是当前代码: 我需要添加超时和池策略,我在想这样的事情: 但是我不知道如何在我的webclient中设置httpClient 问题答案: WebFlux 不使用Apache Commons HTTP Client。虽然你可能可以通过custom实现一个解决方案。现有基于Netty。因此,考虑使用Netty选项来配置客户端,例如: 要么 更新

  • Spring docs表示,需要手动为WebClient配置http客户机以设置超时:https://docs.Spring.io/Spring/docs/current/spring-framework-reference/web-reactive.html#webflux-client-builder-reactor-timeout。但是,由于WebClient返回反应单声道,所以可以(在AP

  • 问题内容: 如何在使用套接字连接创建的BufferedReader和PrintWriter上设置超时?这是我现在为服务器提供的代码,该代码将一直工作到服务器或客户端崩溃为止: 在此代码范围之外,我施加了1000ms的套接字超时,它在等待初始连接时按预期工作。但是该程序在(str = br.readLine())处阻塞。如果客户端挂起或崩溃,则除非我终止该进程,否则它永远不会停止阻塞(即使那样也并不