Как - 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>