I am using opensearch-java client to connect to my OpenSearch cluster hosted in AWS. The client uses Apache HttpClient5 Transport to connect to the cluster. This is how my client is setup:
protected OpenSearchAsyncClient createInstance() throws Exception {
final HttpHost[] hosts = config.getNodeAddresses().stream().map(
address -> new HttpHost("https", address, config.getPort())).toArray(HttpHost[]::new);
final BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
final SSLContext sslcontext = SSLContextBuilder
.create()
.build();
final ApacheHttpClient5TransportBuilder builder = ApacheHttpClient5TransportBuilder.builder(hosts);
builder.setHttpClientConfigCallback(httpClientBuilder -> {
final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
.setSslContext(sslcontext)
.build();
final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
.create()
.setTlsStrategy(tlsStrategy)
.setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT)
.setMaxConnTotal(config.getMaxConnTotal())
.setMaxConnPerRoute(config.getMaxConnPerRoute())
.setConnectionTimeToLive(TimeValue.ofSeconds(config.getConnectionTimeToLive()))
.setValidateAfterInactivity(TimeValue.ofSeconds(
config.getValidateAfterInactivity()))
.setConnPoolPolicy(PoolReusePolicy.FIFO)
.build();
return httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setConnectionManager(connectionManager)
.evictIdleConnections(TimeValue.ofSeconds(config.getEvictIdleConnections()))
.evictExpiredConnections()
.setIOReactorConfig(
IOReactorConfig.custom()
.setSoTimeout(Timeout.ofSeconds(config.getSoTimeout()))
.setSoKeepAlive(true)
.setIoThreadCount(config.getIoThreadCount())
.setSelectInterval(TimeValue.ofMilliseconds(config.getIOSelectInterval()))
.build())
.setIoReactorExceptionCallback(e ->
LOGGER.error("OpenSearch client's IOReactor encountered uncaught exception", e));
});
builder.setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
.setConnectionRequestTimeout(Timeout.ofMilliseconds(config.getConnectionRequestTimeout()))
.setConnectTimeout(Timeout.ofMilliseconds(config.getConnectTimeout()))
.setResponseTimeout(Timeout.ofMilliseconds(config.getReadTimeout()))
.setConnectionKeepAlive(TimeValue.ofSeconds(config.getConnectionKeepAlive())));
builder.setFailureListener(new ApacheHttpClient5Transport.FailureListener() {
@Override
public void onFailure(Node node) {
LOGGER.error("OpenSearch client encountered failure in this node: {}", node.getHost());
}
});
builder.setMapper(new JacksonJsonpMapper(Mapper.getObjectMapper()));
final OpenSearchTransport transport = builder.build();
return new OpenSearchAsyncClient(transport);
}
Here's the version of OpenSearch I am using:
<dependency>
<groupId>org.opensearch.client</groupId>
<artifactId>opensearch-java</artifactId>
<version>2.4.0</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.opensearch</groupId>
<artifactId>opensearch</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.1.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.core5</groupId>
<artifactId>httpcore5</artifactId>
<version>5.1.5</version>
</dependency>
I would like to change the client's properties dynamically during runtime, instead of changing the properties and restarting all the nodes. But, the client doesn't have any accessible methods that I can use to change the properties dynamically. Is there a way to change these properties dynamically by changing config.? Thank you!