Comment régler le temps d'arrêt dans WebServiceTemplate de printemps

j'utilise org.springframework.ws.client.core.WebServiceTemplate pour faire des appels de Service Web. Comment puis-je configurer le délai pour l'appel.

33
demandé sur Sean Patrick Floyd 2011-07-18 17:36:22

7 réponses

si vous utilisez la version 2.1.0 de Spring Webservices, vous pouvez définir le délai d'attente en utilisant HttpComponentsMessageSender.

Commonshtttpmessagesender sont dépréciés et ne sont plus recommandés par le printemps.

la façon dont je l'ai implémenté, je définis mon WebServiceTemplate pour utiliser 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 juste d'avoir dans votre fichier pom, vous avez ajouté le suivant

<dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.2.1</version>
        <scope>compile</scope>
    </dependency>
39
répondu Sathish Murugesan 2014-01-17 12:09:42
6
répondu Sean Patrick Floyd 2011-07-18 15:31:29

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

La façon dont je l'ai mis en œuvre, je définir mon WebServiceTemplate à 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>

puis, en code, j'obtiens le messageSender et je mets le timeout dessus. Vous pouvez également le faire dans votre xml.

CommonsHttpMessageSender messageSender = (CommonsHttpMessageSender)webServiceTemplate.getMessageSenders()[0];
messageSender.getHttpClient().getParams().setSoTimeout(timeoutMillis);
4
répondu Paul Adamson 2011-08-08 15:59:49

même réponse que Sathish, mais programmatiquement (printemps 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);

     }
 }
3
répondu Guildenstern70 2016-04-15 09:13:12

depuis Spring Webservices 2.2, vous pouvez aussi utiliser 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));
    }

    (...)
}

(pas de dépendance à Apache HTTP Composants requis)

3
répondu darrachequesne 2016-06-21 10:44:58

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
répondu Sreekanth 2016-11-22 23:19:30

Pour les CommonsHttpMessageSender, nous pouvons définir le délai d'attente de la façon 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>
<bean id="genericWebServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
       <property name="messageSender" ref="webServiceMessageSender"/>
</bean>
0
répondu Uresh Kuruhuri 2013-02-26 15:51:36