web-dev-qa-db-fra.com

Comment définir le délai d'expiration dans Spring WebServiceTemplate

J'utilise org.springframework.ws.client.core.WebServiceTemplate pour passer des appels de service Web. Comment puis-je configurer le délai d'attente pour l'appel.

37
Sai Kumar

Si vous utilisez la version de Spring Webservices 2.1.0, vous pouvez définir le délai d’expiration à l’aide de HttpComponentsMessageSender

CommonsHttpMessageSender sont obsolètes et ne sont plus recommandés par Spring.

De la manière dont je l’ai implémenté, je définis mon WebServiceTemplate pour qu’il utilise HttpComponentsMessageSender. 

Les valeurs sont en millisecondes

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

Assurez-vous simplement que vous avez dans votre fichier pom, vous avez ajouté ce qui suit

<dependency>
        <groupId>org.Apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.2.1</version>
        <scope>compile</scope>
    </dependency>
41
Sathish Murugesan
6
Sean Patrick Floyd

Identique à la réponse Sathish, mais par programme (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);

     }
 }
4
Guildenstern70

Cet article va probablement vous aider: http://onebyteatatime.wordpress.com/2009/03/19/how-to-set-socket-timeout-using-spring-webservicetemplate/

De la manière dont je l’ai implémenté, je définis mon WebServiceTemplate pour utiliser 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>

Ensuite, dans le code, je récupère le messageSender et lui fixe le délai d'expiration. Vous pouvez également le faire dans votre XML.

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

Depuis Spring Webservices 2.2, vous pouvez également utiliser le ClientHttpRequestMessageSender de Spring:

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

    (...)
}

(aucune dépendance aux composants HTTP Apache n'est requise)

3
darrachequesne

Le code ci-dessous a fonctionné pour moi. 

@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;
}
1
Sreekanth

Pour CommonsHttpMessageSender, nous pouvons définir le délai d'expiration de la manière suivante:

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

et référez-vous à webServiceMessageSender comme ci-dessous:

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

C'est comme ça que j'ai fait: 

@Configuration
public class MunisServiceConfig {

    @Value("${service.uri}")
    private String soapUri;

    @Bean
    Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
        jaxb2Marshaller.setContextPath(CheckStatePayment.class.getPackage().getName());

        return jaxb2Marshaller;
    }

    @Bean
    public WebServiceTemplate munisService() {
        WebServiceTemplate template = new WebServiceTemplate();

        template.setMarshaller(jaxb2Marshaller());
        template.setUnmarshaller(jaxb2Marshaller());

        template.setDefaultUri(soapUri);

        HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
        httpComponentsMessageSender.setReadTimeout(3000);
        httpComponentsMessageSender.setConnectionTimeout(5000);
        template.setMessageSender(httpComponentsMessageSender);

        return template;
    }

}
0
Sarvar Nishonboev