[SPRING] Spring WebServiceTemplate에서 타임 아웃을 설정하는 방법
SPRINGSpring WebServiceTemplate에서 타임 아웃을 설정하는 방법
나는 웹 서비스 호출을 만들기 위해 org.springframework.ws.client.core.WebServiceTemplate을 사용하고있다. 통화 시간 제한을 구성하려면 어떻게해야합니까?
해결법
-
==============================
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.그런 종류의 제어가 필요한 경우
그런 종류의 제어가 필요한 경우
-
==============================
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.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.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.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.아래 코드는 나를 위해 일했습니다.
아래 코드는 나를 위해 일했습니다.
@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.그게 내가 한 일이야.
그게 내가 한 일이야.
@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; } }
from https://stackoverflow.com/questions/6733744/how-to-set-timeout-in-spring-webservicetemplate by cc-by-sa and MIT license