Настройка времени ожидания для весенних веб-сервисов с RestTemplate - PullRequest
4 голосов
/ 06 февраля 2012

Я хотел бы настроить тайм-аут на стороне клиента для весенних веб-сервисов, используя RestTemplate. Я попробовал следующую конфигурацию:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
    <bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
    <property name="readTimeout" value="10000" />
    </bean>
</constructor-arg>
    <property name="messageConverters">
    <list>
    <ref bean="stringHttpMessageConverter" />
    <ref bean="marshallingHttpMessageConverter" />
    </list>
    </property>
</bean>

Но у меня возникает NoClassDefFoundError, когда я запускаю свой кот:

06 févr. 2012 10:43:43,113 [ERROR,ContextLoader] Context initialization failed
java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpMethodBase

Однако я включил commons-httpclient в мой pom.xml:

    <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>3.1</version>
    </dependency

Есть идеи, как я могу это сделать / исправить?

Заранее спасибо!

Ответы [ 4 ]

9 голосов
/ 18 июля 2013

Ответ Сниколаса почти сработал для меня, осталось только поменять состав актеров:

RestTemplate restTemplate = new RestTemplate();    
((SimpleClientHttpRequestFactory)restTemplate.getRequestFactory()).setReadTimeout(1000*30);

Также вы можете установить время соединения:

((SimpleClientHttpRequestFactory)restTemplate.getRequestFactory()).setConnectTimeout(1000*30);
4 голосов
/ 30 августа 2012

Это сработало для меня

( (HttpComponentsClientHttpRequestFactory) getRestTemplate().getRequestFactory() ).setReadTimeout( 120 * 1000 );

Я использовал его в Android-версии весеннего шаблона Android-отдыха.


Значение по умолчанию: 60 *1000* 1007 *

0 голосов
/ 17 января 2014

Мне нужно было установить тайм-аут для потребления веб-сервиса, и я просто решил его с помощью другой пружины.

Сначала с конфигурацией, приведенной ниже, у меня возникла та же проблема, что и у @jsebFrank (java.lang.NoClassDefFoundError: org / apache / commons / httpclient / HttpMethodBase)

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean
            class="org.springframework.http.client.CommonsClientHttpRequestFactory">
            <property name="connectTimeout" value="10000" />
            <property name="readTimeout" value="10000" />
        </bean>
    </constructor-arg>
    </bean>

Но поскольку поддержка Spring объясняет здесь (в разделе 16.5 Обработка тайм-аута), вы можете использовать SimpleClientHttpRequestFactoryфабрика запросов (которая по умолчанию для Spring restTemplate).

Используя ее, у меня больше нет проблем:

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean
            class="org.springframework.http.client.SimpleClientHttpRequestFactory">
            <property name="connectTimeout" value="10000" />
            <property name="readTimeout" value="10000" />
        </bean>
    </constructor-arg>
    </bean>
0 голосов
/ 06 марта 2012

У меня была такая же проблема, и я сначала попытался ее исправить, изменив конфигурацию Spring. но все мои попытки оказались безуспешными.

Наконец, я частично исправил это, установив следующие свойства системы JVM: sun.net.client.defaultConnectTimeout

sun.net.client.defaultReadTimeout

(перейдите по этой ссылке для получения более подробной информации о них: http://docs.oracle.com/javase/1.4.2/docs/guide/net/properties.html)

Во-первых, я ввожу свои пользовательские значения для «Время ожидания подключения» и «Тайм-аут чтения», хранящийся в файле свойств, с помощью «домашнего» конфигурационного компонента:

   <bean id="rmProperties"  class="com.mydomain.myapp.myConfigBean" scope="singleton">
    ...
    <property name="httpRequestConnectTimeout" value="${httpRequestConnectTimeout}" />
    <property name="httpRequestReadTimeout" value="${httpRequestReadTimeout}" />
    ...
    </bean>

Затем я устанавливаю системные свойства JVM с помощью метода System.setProperty (...), например, так:

    System.setProperty(propName, value);

У меня осталась только одна проблема: значение, установленное в sun.net.client.defaultConnectTimeout кажется, не принимается во внимание. Проведя еще несколько тестов, я понял, что это происходит, когда я пытаюсь достичь своих целевых хостов через прокси-сервер (в моем случае Squid).

Однако использовать этот метод настройки неудобно: настройки тайм-аута будут использоваться для всех дальнейших запросов

Привет

...