如何在 RestTemplate 中添加超时

Posted

技术标签:

【中文标题】如何在 RestTemplate 中添加超时【英文标题】:How to add timeout in RestTemplate 【发布时间】:2016-09-30 18:51:03 【问题描述】:

我需要在我的代码中添加超时这是我的代码,但我不知道如何修改此代码以添加超时。

`

 @EBean(scope = EBean.Scope.Singleton)
public class KioraRestClient 

public static final String SERVER_HOST         = KioraBuildConfig.REST_SERVER_API_URL;
public static final String VERSION_SERVER_HOST = KioraBuildConfig.REST_VERSION_SERVER_API_URL;


@AfterInject
void Initialize() 

    try 
        turnOffSslChecking();
     catch (NoSuchAlgorithmException e) 
        e.printStackTrace();
     catch (KeyManagementException e) 
        e.printStackTrace();
    

    // this factory needs to be crated here since requires some injected dependencies
    ClientHttpRequestFactory keyPairRequestFactory = new KioraHttpRequestFactory(
            new ContentAuthUriDecorator(authPreferences)
    );

    ClientHttpRequestFactory timeoutFactory = new SimpleTimeoutRequestFactory();        


    //TODO: Extract common interface for the controllers
    LicenseController.getRestTemplate().setRequestFactory(keyPairRequestFactory);
    UserController.getRestTemplate().setRequestFactory(keyPairRequestFactory);
    ContentController.getRestTemplate().setRequestFactory(keyPairRequestFactory);

    VersionController.getRestTemplate().setRequestFactory(timeoutFactory);
    RootIPController.getRestTemplate().setRequestFactory(keyPairRequestFactory);

    PurchaseController.getRestTemplate().setRequestFactory(keyPairRequestFactory);
    HotspotController.getRestTemplate().setRequestFactory(keyPairRequestFactory);

`

我尝试像这样添加超时,但是这个 20 秒的超时似乎没有效果`

HttpComponentsClientHttpRequestFactory  httpRequestFactory =  new     HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectTimeout(20 * 1000); 
 PurchaseController.getRestTemplate().setRequestFactory(httpRequestFactory);
    HotspotController.getRestTemplate().setRequestFactory(httpRequestFactory);

`

【问题讨论】:

这个和rest模板无关,只和底层http库有关。顺便说一句,我建议使用 okhttp 而不是旧的 http 组件。 您想通过超时设置实现什么目标? ***.com/questions/3069382/… 我需要等待响应,然后做剩下的事情 【参考方案1】:

您只是设置连接超时而不是读取超时。连接超时定义在放弃尝试连接之前将等待多长时间。但是,读取超时定义了等待响应的时间。

用同样的方法设置读取超时,你就能看到它生效了

httpRequestFactory.setReadTimeout(20 * 1000);

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/client/HttpComponentsClientHttpRequestFactory.html#setReadTimeout-int-

【讨论】:

以上是关于如何在 RestTemplate 中添加超时的主要内容,如果未能解决你的问题,请参考以下文章

RestTemplate设置每个请求的超时

关于spring resttemplate超时设置

Eureka restTemplate访问超时

设置RestTemplate的读取超时

Spring RestTemplate 连接超时不起作用

restTemplate超时时间引发的生产事故