пятница, 6 июля 2012 г.

Пример клиента на Spring Web Service

Итак, вызов веб-сервиса выглядит следующим образом:

 /**  
  * Вызов веб-сервиса       
  * @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 должен работать корректно в заданной конфигурации.

Комментариев нет:

Отправить комментарий