java - स्प्रिंग WebServiceTemplate में टाइमआउट कैसे सेट करें




spring spring-ws (6)

मैं वेब सेवा कॉल करने के लिए org.springframework.ws.client.core.WebServiceTemplate उपयोग कर रहा हूं। मैं कॉल के लिए टाइमआउट कैसे कॉन्फ़िगर कर सकता हूं


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>

नीचे दिए गए कोड ने मेरे लिए काम किया।

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


यदि आप स्प्रिंग Webservices 2.1.0 संस्करण का उपयोग कर रहे हैं, तो आप HttpComponentsMessageSender का उपयोग करके टाइमआउट सेट कर सकते हैं।

CommonsHttpMessageSender को स्प्रिंग द्वारा अब और नहीं अनुशंसित किया गया है।

जिस तरह से मैंने इसे लागू किया है, मैं HttpCompordsMessageSender का उपयोग करने के लिए अपने WebServiceTemplate को परिभाषित करता हूं।

मान मिलिससेकंड में हैं

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

बस सुनिश्चित करें कि आपके पास अपनी pom फाइल है, आपने निम्नलिखित को जोड़ा है

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

सतीश के उत्तर के समान, लेकिन प्रोग्रामेटिक रूप से (स्प्रिंग 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);

     }
 }

स्प्रिंग वेबसर्विस 2.2 के बाद से, आप स्प्रिंग के 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 घटकों के लिए कोई निर्भरता आवश्यक)






spring-ws