さまざまな POST エンドポイントにメッセージを配信する汎用アプリケーションがあります。そして、この目的のために CloseableHttpAsyncClient を使用しています。次のように構築/初期化されています。
private static CloseableHttpAsyncClient get() {
CloseableHttpAsyncClient lInstance;
IOReactorConfig ioReactorConfig = IOReactorConfig.custom()
.setIoThreadCount(100)
.setConnectTimeout(10000)
.setSoTimeout(10000).build();
ConnectingIOReactor ioReactor = null;
try {
ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
} catch (IOReactorException e) {
logger_.logIfEnabled(Level.ERROR, e);
}
PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(ioReactor);
connManager.setDefaultMaxPerRoute(50);
connManager.setMaxTotal(5000);
connManager.closeIdleConnections(10000, TimeUnit.MILLISECONDS);
baseRequestConfig = RequestConfig.custom().setConnectTimeout(10000)
.setConnectionRequestTimeout(10000)
.setSocketTimeout(10000).build();
lInstance = HttpAsyncClients.custom().setDefaultRequestConfig(baseRequestConfig)
.setConnectionManager(connManager).build();
lInstance.start();
return lInstance;
}
これは事前に構築され、初期化されています。新しいリクエストがアプリケーションに到着すると、メッセージ、認証タイプに基づいて、新しい postRequest が構築されますhttpPost = new HttpPost(builder.build());
必要なヘッダー、ペイロードなどを設定した後、httpClient を終了してリクエストを送信します。
httpClient.execute(httpPost, httpContext, null);
ここでの質問は、クライアント証明書ベースの認証をサポートするという新しい要件に基づいています。そして、現在のアプローチは最初に httpClient を作成することであるため、問題は、クライアント証明書を一部のエンドポイントに送信し、証明書の送信を必要としない他のエンドポイントと同じように動作するように httpClient の動作を変更する方法です。
作成中に SSLContext を CloseableHttpAsyncClient に導入できることはわかっていますが、作成時には、証明書ベースの認証を必要とするエンドポイントがあるという情報はありません。また、クライアント証明書をサポートし、実行時に認識される多くのエンドポイントを持つことができます。