【问题标题】:How do I set timeouts per request using Spring REST Template?如何使用 Spring REST 模板为每个请求设置超时?
【发布时间】:2017-03-23 22:56:09
【问题描述】:

我有一个使用多个休息客户端的应用程序。这些 REST 客户端中的每一个都使用相同的 Spring REST 模板 bean。我想知道是否有办法使用 Spring rest 模板设置每个请求的超时值?

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    这对我有用...

    RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
    
    private ClientHttpRequestFactory getClientHttpRequestFactory() {
        int timeout = 5000;
        HttpComponentsClientHttpRequestFactory clientHttpRequestFactory
          = new HttpComponentsClientHttpRequestFactory();
        clientHttpRequestFactory.setConnectTimeout(timeout);
        return clientHttpRequestFactory;
    }
    

    【讨论】:

    • 谢谢杰森!但是,有没有办法做到这一点,而无需每次都创建一个新的 httpclient 实例?我们在这些 rest 客户端上重用 Spring rest 模板 bean。如果我们在上面的工厂中定义超时,那么它将为所有客户端全局定义它,而不是为每个客户端定义一个不同的超时。我想知道我是否只需要为每个客户端创建一个休息模板实例。
    • @JCB:你为什么接受这个答案?它不会像您问的那样使用相同的 Spring RestTemplate 实例设置每个请求的超时时间。您是否在其他地方发现 this 是不可能的?
    【解决方案2】:

    要实现超时调用rest模板,首先你应该创建配置类也使用@Bean注解,然后在类中实现并使用RestTemplateConfig调用。

    @Configuration
    public class RestTemplateConfig {
    
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate(clientHttpRequestFactory());
        }
    
        private ClientHttpRequestFactory clientHttpRequestFactory() {
            HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
            clientHttpRequestFactory.setConnectionRequestTimeout(4000);
            clientHttpRequestFactory.setReadTimeout(4000);
            clientHttpRequestFactory.setConnectTimeout(4000);
            return clientHttpRequestFactory;
        }
    }
    
    

    但我建议你使用 Apache HttpClient,你可以管理连接池、保持活动、空闲监视器,还可以创建自定义错误处理程序。可以查看链接:https://springframework.guru/using-resttemplate-with-apaches-httpclient/

    【讨论】:

      【解决方案3】:

      您还可以修改 SimpleClientHttpRequestFactory。

      RestTemplate restTemplate = new RestTemplate();
      restTemplate.setRequestFactory(customHttpRequestFactory());
      
      private SimpleClientHttpRequestFactory customHttpRequestFactory() {
          SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
          simpleClientHttpRequestFactory.setReadTimeout(2000);
          simpleClientHttpRequestFactory.setConnectTimeout(2000);
          return simpleClientHttpRequestFactory;
      }
      

      【讨论】:

      • 这里的答案都没有描述每次休息呼叫的超时时间
      猜你喜欢
      • 1970-01-01
      • 2018-06-29
      • 2017-06-28
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 2022-12-11
      相关资源
      最近更新 更多