from java spring spring-ws
ClientHttpRequestMessageSender

java - spring web service client from wsdl



Cómo establecer el tiempo de espera en Spring WebServiceTemplate (7)

Estoy utilizando org.springframework.ws.client.core.WebServiceTemplate para realizar llamadas al servicio web. ¿Cómo puedo configurar el tiempo de espera para la llamada?


Desde Spring Webservices 2.2, también puede utilizar Spring''s 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)); } (...) }

(no se requiere dependencia de los componentes HTTP de Apache)


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


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

La forma en que lo implementé, definí mi WebServiceTemplate para usar 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, obtengo el messageSender y establezco 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);


Lo mismo que la respuesta de Sathish, pero programáticamente (primavera 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); } }


Para 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 refiera webServiceMessageSender de la siguiente manera:

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


Si está utilizando Spring Webservices versión 2.1.0, puede establecer el tiempo de espera utilizando HttpComponentsMessageSender .

CommonsHttpMessageSender está en desuso y ya no es recomendado por Spring.

La forma en que lo implementé, definí mi WebServiceTemplate para usar HttpComponentsMessageSender.

Los valores están 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>

Solo asegúrate de tener en tu archivo pom, agregaste lo siguiente

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