2011-07-18 3 views

ответ

6

Если вы хотите, чтобы вид контроля, вы можете

+1

Итак, для WebServiceTemplate нет даже тайм-аута по умолчанию? как долго может быть действительным звонок? –

+0

@ SMK есть другой способ, см. Мое обновление –

4

Эта статья, вероятно, своего рода вы из : http://onebyteatatime.wordpress.com/2009/03/19/how-to-set-socket-timeout-using-spring-webservicetemplate/

так, как я это реализовать, я определяю мой WebServiceTemplate использовать CommonsHttpMessageSender:

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> 
     <constructor-arg ref="messageFactory" /> 
     <property name="messageSender"> 
      <bean 
       class="org.springframework.ws.transport.http.CommonsHttpMessageSender"> 
      </bean> 
     </property> 
</bean> 

Затем в коде, я получаю MessageSender и установить тайм-аут на нем. Вы также можете сделать это в своем xml.

CommonsHttpMessageSender messageSender = (CommonsHttpMessageSender)webServiceTemplate.getMessageSenders()[0]; 
messageSender.getHttpClient().getParams().setSoTimeout(timeoutMillis); 
35

Если вы используете Spring WebServices 2.1.0 версии, вы можете установить тайм-аут, используя HttpComponentsMessageSender.

CommonsHttpMessageSender устарели и не рекомендуются весной.

Способ, которым я его реализовал, я определяю свой WebServiceTemplate для использования HttpComponentsMessageSender.

Значения в миллисекундах

<bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> 
    <property name="defaultUri" value="${endpoint.url}" /> 
    <property name="marshaller" ref="marshaller" /> 
    <property name="unmarshaller" ref="unmarshaller" /> 
    <property name="messageSender"> 
     <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender"> 
      <property name="connectionTimeout" value="1200000" /> 
      <property name="readTimeout" value="1200000" /> 
     </bean> 
    </property> 
</bean> 

Просто Убедитесь, что у вас есть в вашем файле пом, вы добавили следующую

<dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.2.1</version> 
     <scope>compile</scope> 
    </dependency> 
0

Для CommonsHttpMessageSender, мы можем установить тайм-аут следующим образом:

<bean id="httpParams" class="org.apache.commons.httpclient.params.HttpClientParams"> 
    <!-- Timeout in milliseconds: in this case 1 minute --> 
    <property name="soTimeout" value="60000" /> 
</bean> 

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient"> 
    <property name="params" ref="httpParams" /> 
</bean> 

<!-- Define the message sender used by all web service templates --> 
<bean id="webServiceMessageSender" class="org.springframework.ws.transport.http.CommonsHttpMessageSender"> 
    <constructor-arg> 
     <ref bean="httpClient"/> 
    </constructor-arg> 
</bean> 

и реф в webServiceMessageSender, как показано ниже:

<bean id="genericWebServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"> 
     <property name="messageSender" ref="webServiceMessageSender"/> 
</bean> 
3

То же Sathish ответ, но программно (Spring 4.x):

@Component 
public class MyWebServiceGatewaySupport extends WebServiceGatewaySupport 
{ 
    @Value("${my.ws.readtimeout}") 
    private String readTimeout; 

    @Value("${my.ws.connectiontimeout}") 
    private String connectionTimeout; 

    Object marshalSendAndReceive(String endpoint, Object requestPayload) 
    { 

     WebServiceTemplate wsTemplate = this.getWebServiceTemplate(); 
     WebServiceMessageSender[] senders = wsTemplate.getMessageSenders(); 
     for (WebServiceMessageSender sender: senders) 
     { 
      try 
      { 
       int readTimeoutMsec = Integer.parseInt(readTimeout); 
       int connTimeoutMsec = Integer.parseInt(connectionTimeout); 
       HttpComponentsMessageSender httpSender = (HttpComponentsMessageSender) sender; 
       httpSender.setReadTimeout(readTimeoutMsec); 
       httpSender.setConnectionTimeout(connTimeoutMsec); 
      } 
      catch (ClassCastException|NumberFormatException cex) 
      { 
       logger.warn("Cannot set WS timeout: " + cex.getMessage()); 
      } 
     } 

     return wsTemplate.marshalSendAndReceive(endpoint, requestPayload); 

    } 
} 
+0

Я использую в своем проекте Spring Boot и Spring WS инъекцию с использованием 'Integer' уже, например. '@Value (" $ {my.ws.readtimeout} ") private Integer readTimeout' – EliuX

3

С весны WebServices 2.2, вы можете также использовать Spring в ClientHttpRequestMessageSender:

@Service 
public class CustomWebServiceImpl extends WebServiceGatewaySupport implements CustomWebService { 
    private static final int CONNECTION_TIMEOUT = (10 * 1000); 
    private static final int READ_TIMEOUT = (10 * 1000); 

    public CustomWebServiceImpl() { 
     SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); 
     requestFactory.setConnectTimeout(CONNECTION_TIMEOUT); 
     requestFactory.setReadTimeout(READ_TIMEOUT); 
     setMessageSender(new ClientHttpRequestMessageSender(requestFactory)); 
    } 

    (...) 
} 

(нет зависимости к HTTP-компонентам Apache)

0

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

@Bean 
public YourlassImpl YourClassImpl(Jaxb2Marshaller marshaller, HttpComponentsMessageSender httpComponentsMessageSender) { 
    YourClassImpl client = new YourClassImpl(); 
    client.setDefaultUri(PiiProperties.SOAP_ACTION.getValue()); 
    client.setMarshaller(marshaller); 
    client.setUnmarshaller(marshaller); 
    client.setMessageSender(httpComponentsMessageSender); 
    return client; 
} 

@Bean 
public HttpComponentsMessageSender httpComponentsMessageSender() {  
    HttpComponentsMessageSender sender = new HttpComponentsMessageSender(); 
    sender.setReadTimeout(1000); 
    sender.setConnectionTimeout(1000); 
    return sender; 
} 
Смежные вопросы