2011-07-18 65 views

Respuesta

4

Este artículo probablemente tipo que fuera : http://onebyteatatime.wordpress.com/2009/03/19/how-to-set-socket-timeout-using-spring-webservicetemplate/

La forma en que lo tengo implementado, defino mi WebServiceTemplate utilizar 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> 

Luego, en el código, tengo la MessageSender y establezca el tiempo de espera en él. También podría hacer esto en su xml.

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

Si está utilizando la versión 2.1.0 de la primavera de servicios web, se puede establecer el tiempo de espera utilizando HttpComponentsMessageSender.

CommonsHttpMessageSender han quedado obsoletos y ya no son recomendados por Spring.

De la manera en que lo tengo implementado, defino mi WebServiceTemplate para usar HttpComponentsMessageSender.

Los valores son en milisegundos

<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> 

Sólo asegúrese de que tiene en su archivo de POM, que ha añadido la siguiente

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

Para el CommonsHttpMessageSender, podemos establecer el tiempo de espera de la siguiente manera:

<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> 

y ref la webServiceMessageSender como se indica a continuación:

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

Igual respuesta Sathish, pero mediante programación (4.x primavera):

@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

Estoy usando en mi proyecto de Spring Boot y Spring WS una inyección usando 'Integer' ya, p. '@Value (" $ {my.ws.readtimeout} ") private Integer readTimeout' – EliuX

3

desde la primavera de Servicios Web 2.2, también se puede utilizar ClientHttpRequestMessageSender de primavera:

@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)); 
    } 

    (...) 
} 

(sin dependencia a los componentes HTTP de Apache necesarios)

0

El siguiente código funcionó para mí.

@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; 
} 
Cuestiones relacionadas