web-dev-qa-db-ja.com

方法-Spring IoCおよびHttpClient 4.3.1 CloseableHttpClient?

Spring IoCでCloseableHttpClientオブジェクトを構成し、それをクラスに挿入して、XMLを介して構成のカスタマイズを行えるようにしたいと考えています。

私が見ることができるものから、HttpClientはこのパターンに非常に強い抵抗をしているようです。彼らはあなたに次のようなことをしてほしい

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

いや。

その後、使用できるシングルトンCloseableHttpClient Beanを作成するためのメカニズムはありませんか?

16
nsayer

これは私にとってはうまくいくようです:

<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にプロパティを追加できるはずです。

41
Matt

Java configを使用すると、これは次のように簡単です

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

そして設定

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

HttpClientBuilderメソッドごとにセッターメソッドが必要です。

カスタム構成が必要ない場合は、factory-methodを使用してデフォルトのCloseableHttpClientを取得できます。

<bean name="httpClient" class="org.Apache.http.impl.client.HttpClients" factory-method="createDefault" >
</bean>