У меня есть http-outbound-gateway, который использует динамические c URL-адреса с подключением и временем ожидания чтения
<int-http:outbound-gateway request-channel="request"
reply-channel="response" url-expression="headers.serviceUrl" http-method="POST"
expected-response-type="java.lang.String" charset="UTF-8" request-factory="httpOutboundRequestFactoryBean" message-converters="messageConverterList" header-mapper="headerMapperBean"/>
<bean id="httpOutboundRequestFactoryBean"
class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
<property name="readTimeout" value="5000"/>
<property name="connectTimeout" value="1000"/>
</bean>
Можно ли настроить указанное c время ожидания в соответствии с URL-адресом, определенным в headers.serviceUrl ?
Я искал вокруг и нашел только эту проблему .
Один из возможных способов - использовать непосредственно RestTemplate и каждый раз создавать экземпляр RestTemplate. время и динамически установить requestFactory (с тайм-аутом) в соответствии с URL, но, возможно, есть встроенный способ сделать это с помощью интеграции пружин
заранее спасибо!
EDIT : ADD ANSWER
Я добавил этот активатор службы незадолго до того, как http-outbound-gateway
public class ThreadLocalSample {
public static ThreadLocal<Integer> serviceTimeout = new ThreadLocal<>();
private static final Logger LOGGER = LoggerFactory.getLogger(ThreadLocalSample.class);
public Message<?> setTimeout(final Message<?> message){
final int number = (new Random().nextInt(20 - 1 + 1) + 1)*1000;
serviceTimeout.set(number);
LOGGER.info("Service timeout thread local: "+number);
return message;
}
Расширил HttpComponentsClientHttpRequestFactory и переопределил конфигурацию слияния, используя локальный тайм-аут:
public class MyHttpConnectionFactory extends HttpComponentsClientHttpRequestFactory {
private RequestConfig requestConfig;
private static final Logger LOGGER = LoggerFactory.getLogger(MyHttpConnectionFactory.class);
@Override
protected RequestConfig createRequestConfig(final Object client) {
this.requestConfig = super.createRequestConfig(client);
return this.requestConfig;
}
@Override
protected RequestConfig mergeRequestConfig(final RequestConfig clientConfig) {
if (this.requestConfig == null) { // nothing to merge
return clientConfig;
}
final RequestConfig.Builder builder = RequestConfig.copy(clientConfig);
final int connectTimeout = this.requestConfig.getConnectTimeout();
if (connectTimeout >= 0) {
builder.setConnectTimeout(connectTimeout);
}
final int connectionRequestTimeout = this.requestConfig.getConnectionRequestTimeout();
if (connectionRequestTimeout >= 0) {
builder.setConnectionRequestTimeout(connectionRequestTimeout);
}
final int socketTimeout = ThreadLocalSample.serviceTimeout.get();
LOGGER.info("Service timeout: "+socketTimeout);
if (socketTimeout >= 0) {
builder.setSocketTimeout(socketTimeout);
}
return builder.build();
}
}
Изменен поток интеграции пружины:
<int-http:outbound-gateway request-channel="request"
reply-channel="response" url-expression="headers.serviceUrl" http-method="POST"
expected-response-type="java.lang.String" charset="UTF-8" request-factory="httpOutboundRequestFactoryBean" message-converters="messageConverterList" header-mapper="headerMapperBean"/>
<bean id="httpOutboundRequestFactoryBean"
class="sample.MyHttpConnectionFactory">
<property name="readTimeout" value="5000"/>
<property name="connectTimeout" value="1000"/>
</bean>