Spring IoCでCloseableHttpClient
オブジェクトを構成し、それをクラスに挿入して、XMLを介して構成のカスタマイズを行えるようにしたいと考えています。
私が見ることができるものから、HttpClient
はこのパターンに非常に強い抵抗をしているようです。彼らはあなたに次のようなことをしてほしい
CloseableHttpClient chc =
HttpClients.custom().set<thing that should be a property>().build();
いや。
その後、使用できるシングルトンCloseableHttpClient
Beanを作成するためのメカニズムはありませんか?
これは私にとってはうまくいくようです:
<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にプロパティを追加できるはずです。
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>