Как - Spring IoC и HttpClient 4.3.1 CloseableHttpClient?
Я хотел бы иметь Spring IoC настроить объект CloseableHttpClient
и ввести его в свой класс, чтобы настройка его конфигурации выполнялась через XML.
Из того, что я вижу, HttpClient
, похоже, довольно сильно противостоит этой схеме. Они хотят, чтобы вы делали что-то вроде
CloseableHttpClient chc =
HttpClients.custom().set<thing that should be a property>().build();
Ик.
Нет ли какого-либо механизма для создания singleton CloseableHttpClient
bean, который я могу использовать?
Ответы
Ответ 1
Кажется, это работает для меня:
<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig"
factory-method="custom">
<property name="socketTimeout" value="${socketTimeoutInMillis}" />
<property name="connectTimeout" value="${connectionTimeoutInMillis}" />
</bean>
<bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />
<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"
factory-method="create">
<property name="defaultRequestConfig" ref="requestConfig" />
</bean>
<bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />
Это дает мне CloseableHttpClient в "httpClient" bean, при этом настроены таймауты сокетов и соединений. Вы должны иметь возможность добавлять дополнительные свойства либо в requestConfigBuilder, либо в httpClientBuilder.
Ответ 2
С конфигурацией Java это так же просто, как
@Bean
public CloseableHttpClient httpClient() {
HttpClientBuilder builder = HttpClientBuilder.create();
builder.setEverything(everything); // configure it
CloseableHttpClient httpClient = builder.build();
}
С конфигурацией XML это немного сложнее. Вы можете создать свою собственную реализацию FactoryBean
, скажем CloseableHttpClientFactoryBean
, которая делегирует все вызовы HttpClientBuilder
и вызывает build()
внутри getObject()
.
public class CloseableHttpClientFactoryBean implements FactoryBean<CloseableHttpClient> {
private HttpClientBuilder builder;
public CloseableHttpClientFactoryBean() {
builder = HttpClientBuilder.create();
}
... // all the setters
// for example
public void setEverything(Everything everything) {
// delegate
builder.setEverything(everything);
}
public CloseableHttpClient getObject() {
return builder.build();
}
}
И config
<bean name="httpClient" class="com.spring.http.clients.CloseableHttpClientFactoryBean">
<property name="everything" ref="everything"/>
</bean>
Вам понадобится метод setter для каждого метода HttpClientBuilder
.
Обратите внимание: если вам не нужна какая-либо настраиваемая конфигурация, вы можете использовать factory-method
для получения значения по умолчанию CloseableHttpClient
<bean name="httpClient" class="org.apache.http.impl.client.HttpClients" factory-method="createDefault" >
</bean>