【问题标题】:HTTP time out not working for Spring - httpHTTP 超时不适用于 Spring - http
【发布时间】:2018-05-02 11:01:23
【问题描述】:

在升级到 Spring 4 时,我们不得不更改 http 调用程序的上下文配置以匹配 http-client 4.4.9 和 http-core 4.5.5,如下所示:

    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
    <property name="socketTimeout" value="${connection.timeout}" /> 
    <property name="connectTimeout" value="${connection.timeout}" />
    <property name="staleConnectionCheckEnabled" value="${connection.doStaleCheck}"/> 
    <property name="connectionRequestTimeout" value="${connection.poolTimeout}" />
</bean>

<bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
    <property name="defaultRequestConfig" ref="requestConfig" />
    <property name="maxConnTotal" value="${connection.maxActive}" />
    <property name="maxConnPerRoute" value="${connection.maxActive}" />
</bean>

<bean id="httpClientBld" factory-bean="httpClientBuilder" factorymethod="build" />

但是,在测试时,套接字超时和连接超时似乎无法正常工作......它总是等待大约 1000 毫秒的连接超时和 60000 毫秒的套接字超时,而不是配置的值。

【问题讨论】:

    标签: spring timeout httpclient


    【解决方案1】:

    在进一步研究这个问题后,它原来是 Spring 4 的问题,而不是来自 http 客户端 jar 的问题,并且仅在上下文配置 XML 文件传递​​超时值时发生。作为一种解决方案,我们以语法方式设置超时值

     CloseableHttpClient httpClient = (CloseableHttpClient) context.getBean("httpClientBld");
      HttpComponentsHttpInvokerRequestExecutor executor = new HttpComponentsHttpInvokerRequestExecutor(httpClient);
    
      HttpInvokerProxyFactoryBean httpInvokerProxyFactoryBean = new HttpInvokerProxyFactoryBean();
    
      httpInvokerProxyFactoryBean.setServiceInterface(InterfaceClass.class);
      httpInvokerProxyFactoryBean.setServiceUrl(endpoint);
      httpInvokerProxyFactoryBean.setHttpInvokerRequestExecutor(executor);
      httpInvokerProxyFactoryBean.afterPropertiesSet();
    
      this.cainServer = (InterfaceClass) httpInvokerProxyFactoryBean.getObject();
    

    在我们刚刚使用的上下文中:

    <bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig" factory-method="custom">
        <property name="socketTimeout" value="${connection.timeout}" /> 
        <property name="connectTimeout" value="${connection.timeout}" />
        <property name="staleConnectionCheckEnabled" value="${connection.doStaleCheck}"/> 
        <property name="connectionRequestTimeout" value="${connection.poolTimeout}" />
    </bean>
    <bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />
    <bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder" factory-method="create">
        <property name="defaultRequestConfig" ref="requestConfig" />
        <property name="maxConnTotal" value="${connection.maxActive}" />
        <property name="maxConnPerRoute" value="${connection.maxActive}" />
    </bean>
    <bean id="httpClientBld" factory-bean="httpClientBuilder" factory-method="build" />
    

    值是从 Java 代码传递的。 请注意,仍然存在一个问题,即连接超时仍然是 100 毫秒,而不是配置的超时。但这个问题来自 http 客户端 jar,而不是来自 Spring 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 2013-12-18
      • 2016-11-06
      • 2017-06-28
      • 2011-07-08
      • 1970-01-01
      • 2014-08-15
      相关资源
      最近更新 更多