복붙노트

[SPRING] Spring WebServiceTemplate에서 타임 아웃을 설정하는 방법

SPRING

Spring WebServiceTemplate에서 타임 아웃을 설정하는 방법

나는 웹 서비스 호출을 만들기 위해 org.springframework.ws.client.core.WebServiceTemplate을 사용하고있다. 통화 시간 제한을 구성하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.Spring Webservices 2.1.0 버전을 사용하고 있다면, HttpComponentsMessageSender를 사용하여 타임 아웃을 설정할 수 있습니다.

    Spring Webservices 2.1.0 버전을 사용하고 있다면, HttpComponentsMessageSender를 사용하여 타임 아웃을 설정할 수 있습니다.

    CommonsHttpMessageSender는 더 이상 사용되지 않으며 권장되지 않습니다.

    구현 방법은 HttpComponentsMessageSender를 사용하도록 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>
    
  2. ==============================

    2.그런 종류의 제어가 필요한 경우

    그런 종류의 제어가 필요한 경우

  3. ==============================

    3.이 기사는 아마 당신을 소멸시킬 것이다. http://onebyteatatime.wordpress.com/2009/03/19/how-to-set-socket-timeout-using-spring-webservicetemplate/

    이 기사는 아마 당신을 소멸시킬 것이다. http://onebyteatatime.wordpress.com/2009/03/19/how-to-set-socket-timeout-using-spring-webservicetemplate/

    구현 방법은 CommSerHttpMessageSender를 사용하도록 WebServiceTemplate을 정의합니다.

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

    그런 다음 코드에서 messageSender를 가져 와서 타임 아웃을 설정합니다. 당신은 똑같이 당신의 XML에서 이것을 할 수 있습니다.

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

    4.Sathish 응답과 같지만 프로그래밍 방식으로 (Spring 4.x) :

    Sathish 응답과 같지만 프로그래밍 방식으로 (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);
    
         }
     }
    
  5. ==============================

    5.Spring Webservices 2.2부터 Spring의 ClientHttpRequestMessageSender를 사용할 수도있다.

    Spring Webservices 2.2부터 Spring의 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 구성 요소에 대한 의존성은 필요하지 않음)

  6. ==============================

    6.CommonsHttpMessageSender의 경우 다음과 같은 방법으로 제한 시간을 설정할 수 있습니다.

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

    7.아래 코드는 나를 위해 일했습니다.

    아래 코드는 나를 위해 일했습니다.

    @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;
    }
    
  8. ==============================

    8.그게 내가 한 일이야.

    그게 내가 한 일이야.

    @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;
        }
    
    }
    
  9. from https://stackoverflow.com/questions/6733744/how-to-set-timeout-in-spring-webservicetemplate by cc-by-sa and MIT license