Тайм-аут вызова веб-сервиса со стороны клиента - PullRequest
9 голосов
/ 11 мая 2011

Я звоню в веб-сервис, используя RestEasy Client.Одним из требований является прерывание / тайм-аут вызова, если он выполняется более 5 секунд.Как бы я достиг этого с клиентом RestEasy?Я видел только тайм-аут на стороне сервера, т. Е. Веб-служба Rest Easy отключит запрос, если он не будет выполнен в течение определенного времени.

Ответы [ 4 ]

11 голосов
/ 11 мая 2011

Клиент RESTEasy обычно использует Apache HttpClient для управления сетевым диалогом.

Вы можете переопределить свойства HttpClient своими собственными параметрами тайм-аута:

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, connectionTimeoutMillis);
HttpConnectionParams.setSoTimeout(params, socketTimeoutMillis);

Первый параметр позволяет вамукажите время ожидания для установления начального соединения, а второе позволяет указать максимальный период времени, в течение которого сокет будет ожидать, пока не будет отправлено никаких данных.

Вы можете использовать модифицированный HttpClient для построения вашего ClientExecutor:

ClientExecutor executor = new ApacheHttpClient4Executor(httpClient);

Что может быть использовано в свою очередь для создания объекта ClientRequest.Или вы можете вставить его в RestClientProxyFactoryBean, если вы используете конфигурацию Spring для RESTEasy.

Это не совсем то же самое, что абсолютный 5-секундный тайм-аут, но в зависимости от того, что вы пытаетесь выполнить, настраивая эти два свойстваобычно будет заполнять счет.

2 голосов
/ 21 мая 2015

Если вы предпочитаете шаблон строителя, вот как вы это делаете:

 Client client = new ResteasyClientBuilder()
            .establishConnectionTimeout(5, TimeUnit.SECONDS)
            .socketTimeout(5, TimeUnit.SECONDS)
            .build();

взято отсюда: http://blog.eisele.net/2014/12/setting-timeout-for-jax-rs-20-resteasy-client.html

2 голосов
/ 04 декабря 2012

Ответ от Картера Пейджа верен для версии Apache HttpClient> = 4.0.

Для более ранних версий HttpClient (например, 3.1) код немного отличается:

HttpClient httpClient = new HttpClient();
HttpConnectionParams params = httpClient.getHttpConnectionManager().getParams();
params.setConnectionTimeout(connectionTimeoutMillis);
params.setSoTimeout(socketTimeoutMillis);

ClientExecutor executor = new ApacheHttpClientExecutor(httpClient);
MyService service = ProxyFactory.create(MyService.class, URL, executor);
0 голосов
/ 28 ноября 2012

Если вы используете клиентскую среду Resteasy с пружинной интеграцией ( документация ), способ установить значения тайм-аута:

<bean id="httpClient" class="org.apache.http.impl.client.DefaultHttpClient">
    <property name="params" ref="httpParams"/>
</bean>

<bean id="httpParams" class="org.apache.http.params.BasicHttpParams"/>

<bean id="httpConnectionParams" class="org.apache.http.params.HttpConnectionParamBean">
    <constructor-arg ref="httpParams"/>
    <property name="connectionTimeout" value="10000"/>
    <property name="soTimeout" value="30000"/>
</bean>
...