如何使用Spring IoC和HttpClient 4.3.1的CloseableHttpClient?

18

我希望Spring IoC能够配置一个CloseableHttpClient对象并将其注入到我的类中,以便可以通过XML对其配置进行自定义。

据我所见,HttpClient似乎强烈反对这种模式。他们希望你做一些像这样的事情:

CloseableHttpClient chc =
    HttpClients.custom().set<thing that should be a property>().build();

我感到恶心。

是否有一种机制可以创建一个单例CloseableHttpClient bean,然后我可以使用它?


2
使用Java配置,这很容易。只需声明一个构建它的@Bean方法即可。 - Sotirios Delimanolis
2个回答

44

这似乎对我起作用:

<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" />

这使我可以在“httpClient”bean中获得一个CloseableHttpClient,并配置套接字和连接超时。您应该能够向requestConfigBuilder或httpClientBuilder添加更多属性。


3
使用Java配置,这可以在一个bean中完成,方法是将requestConfig bean和httpClient分开,或者复制相同的xml结构。是否有最佳实践可以指导应该做什么?在Java中,像XML配置中那样将设置分为四个步骤是否有意义? - Michele Palmia
@user666 是的,当时这个方法是可行的(在2014年的 HttpClient 4.3.1 版本上)。 - Matt

9
使用Java配置,这非常简单,只需要:
@Bean
public CloseableHttpClient httpClient() {
    HttpClientBuilder builder = HttpClientBuilder.create();
    builder.setEverything(everything); // configure it
    CloseableHttpClient httpClient = builder.build();
}

使用XML配置会更加复杂。你可以创建自己的FactoryBean实现,比如说CloseableHttpClientFactoryBean,它将所有调用委托给一个HttpClientBuilder并在getObject()内部调用build()

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();
    }
}

配置文件

<bean name="httpClient" class="com.spring.http.clients.CloseableHttpClientFactoryBean">
    <property name="everything" ref="everything"/>
</bean>

你需要为每个HttpClientBuilder方法编写setter方法。 请注意,如果您不需要任何自定义配置,可以使用factory-method获取默认的CloseableHttpClient
<bean name="httpClient" class="org.apache.http.impl.client.HttpClients" factory-method="createDefault" >
</bean>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接