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




spring spring-ws (7)

यदि आप उस तरह का नियंत्रण चाहते हैं, तो आप कर सकते हैं

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


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


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>

मैंने ऐसा कैसे किया:

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

}

यदि आप स्प्रिंग 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>

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

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

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

     }
 }




spring-ws