/**
* Вызов веб-сервиса
* @param request
* @return
*/
public String invove(String request){
StreamSource source = new StreamSource(new StringReader(request));
ByteArrayOutputStream output = new ByteArrayOutputStream();
StreamResult result = new StreamResult(output);
webServiceTemplate.sendSourceAndReceiveToResult(url, source, result);
String resultStr = "";
try {
resultStr = new String(output.toByteArray(), "UTF-8");
} catch (UnsupportMultiThreadedHttpConnectionManageredEncodingException e) {
logger.error(e.getMessage(), e);
}
return resultStr;
}
В данном случае я отсылаю запрос в виде строки и принимаю обратно строку.
Основным классом, выполняющим грязную работу, является WebServiceTemplate.
При этом создание экземпляра этого класса можно сделать так:
Всё просто, не правда ли?
Правда, если мы хотим выставить таймаут на ожидание выполнения запроса, то необходимо в проект добавить библиотеку http commons 3.1.1 и изменить определение бина следующим образом:
<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
<property name="messageSenders">
<list>
<ref bean="httpSender" />
</list>
</property>
</bean>
<!-- add for thread safety -->
<bean id="connmanager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
<property name="params" ref="connmanagerParams"/>
</bean>
<!-- Total to 300 connections -->
<bean id="connmanagerParams" class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<property name="maxTotalConnections" value="300"/>
</bean>
<bean id="httpParams" class="org.apache.commons.httpclient.params.HttpClientParams">
<!-- Timeout in milliseconds: in this case 10 seconds -->
<property name="soTimeout" value="10000" />
</bean>
<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
<property name="params" ref="httpParams" />
<property name="httpConnectionManager" ref="connmanager"/>
</bean>
<bean id="httpSender" class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
<constructor-arg>
<ref bean="httpClient"/>
</constructor-arg>
</bean>
Счастливой пятницы!
UPD 2012-07-14: Наткнулся на проблему, что по умолчанию
org.apache.commons.httpclient.HttpClient
не безопасен для использования в многопоточной среде. Чтобы это исправить, необходимо HttpClient передатьэкземплярMultiThreadedHttpConnectionManager
После этого Commons Http должен работать корректно в заданной конфигурации.
Комментариев нет:
Отправить комментарий