Spring WebServiceTemplate에서 시간 초과를 설정하는 방법
웹 서비스 호출에 사용하고 있습니다.통화 시간 제한을 설정하려면 어떻게 해야 합니까?
Spring Webservices 2.1.0 버전을 사용하는 경우 HttpComponentsMessageSender를 사용하여 시간 초과를 설정할 수 있습니다.
CommonsHttpMessageSender는 더 이상 사용되지 않으며 Spring에서 더 이상 권장하지 않습니다.
구현한 방법으로 HttpComponentMessageSender를 사용하도록 웹 서비스 템플릿을 정의합니다.
값은 밀리초 단위입니다.
<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>
그냥 폼 파일에 있는지 확인하세요, 당신은 다음을 추가했습니다.
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.2.1</version>
<scope>compile</scope>
</dependency>
새티쉬 답변과 동일하지만 프로그래밍 방식으로(스프링 4+):
@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 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));
}
(...)
}
(Apache HTTP 구성 요소에 대한 종속성은 필요하지 않음)
아래 코드가 저에게 효과가 있었습니다.
@Bean
public YourClassImpl 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;
}
만약 당신이 그런 종류의 통제를 원한다면, 당신은 할 수 있습니다.
- 자카르타 Commons Http Client를 사용하는 CommonsHttpMessageSender로 전환합니다.
- 또는 하위 클래스 및 메서드 호출에서
그게 제가 한 방법입니다.
@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;
}
}
이 기사는 아마도 당신을 정리해 줄 것입니다: http://onebyteatatime.wordpress.com/2009/03/19/how-to-set-socket-timeout-using-spring-webservicetemplate/
이를 구현하는 방법으로 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>
그런 다음 코드에서는 Sender라는 메시지를 받고 시간 초과를 설정합니다.xml에서도 마찬가지로 이 작업을 수행할 수 있습니다.
CommonsHttpMessageSender messageSender = (CommonsHttpMessageSender)webServiceTemplate.getMessageSenders()[0];
messageSender.getHttpClient().getParams().setSoTimeout(timeoutMillis);
이 코드는 Spring Boot(2.1.5에서 확인됨)과 함께 작동합니다.릴리스):
@Configuration
public class ExampleServiceClientConfiguration {
@Value("${example-service.uri}")
private String exampleServiceUri;
@Value("${example-service.timeout:120}")
private int exampleServiceTimeout;
@Bean
public ExampleServiceClient exampleServiceClient() {
ExampleServiceClient client = new ExampleServiceClient();
client.setMessageSender(httpUrlConnectionMessageSender());
client.setDefaultUri(exampleServiceUri);
client.setMarshaller(marshaller());
client.setUnmarshaller(marshaller());
return client;
}
@Bean
HttpUrlConnectionMessageSender httpUrlConnectionMessageSender() {
HttpUrlConnectionMessageSender sender = new HttpUrlConnectionMessageSender();
Duration timeout = Duration.ofSeconds(exampleServiceTimeout);
sender.setReadTimeout(timeout);
sender.setConnectionTimeout(timeout);
return sender;
}
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath(ObjectFactory.class.getPackageName());
return marshaller;
}
}
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>
언급URL : https://stackoverflow.com/questions/6733744/how-to-set-timeout-in-spring-webservicetemplate
'source' 카테고리의 다른 글
다른 사용자로 오라클 저장 프로시저 실행 (0) | 2023.08.20 |
---|---|
테스트 디렉토리를 적용 범위에서 제외할 수 있습니까?py 보고서? (0) | 2023.08.20 |
java.lang을 가져오는 중입니다.ClassNotFoundException: javax.servlet입니다.Junit의 서블릿 컨텍스트 (0) | 2023.08.20 |
잘못된 레일 교차 출발지 요청 (0) | 2023.08.15 |
Feign 클라이언트 + Spring Cloud(Brixton RC2)에서 동적 값을 가진 @Headers 사용 (0) | 2023.08.15 |