Тайм-аут HTTP не работает для Spring - http - PullRequest
0 голосов
/ 02 мая 2018

При обновлении до Spring 4 мы были обязаны изменить конфигурацию контекста http invoker, чтобы она соответствовала http-клиенту 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 для времени ожидания сокета вместо настроенных значений.

1 Ответ

0 голосов
/ 31 мая 2018

После более подробного изучения этой проблемы выяснилось, что проблема в Spring 4 возникла не из jar-файла http-клиента, а только в том случае, если значения тайм-аута передаются 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.

...