5

Our application encoutner timeout exception while indexing(store) document in elasticsearch server. It do not frequently happen but approximately once a day. Here are details.

pom.xml

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.0.0</version>
</dependency>

initialization

@Bean
public RestHighLevelClient buildHighLevelClient() {
    RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(httplist.toArray(new HttpHost[]{})));
    return client;
}

exception information

java.lang.RuntimeException: error while performing request
at org.elasticsearch.client.RestClient$SyncResponseListener.get(RestClient.java:682)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:220)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:192)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:428)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:414)
at org.elasticsearch.client.RestHighLevelClient.bulk(RestHighLevelClient.java:229)
......
Caused by: java.util.concurrent.TimeoutException
at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:364)
at org.apache.http.nio.pool.AbstractNIOConnPool.processNextPendingRequest(AbstractNIOConnPool.java:344)
at org.apache.http.nio.pool.AbstractNIOConnPool.release(AbstractNIOConnPool.java:318)
at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.releaseConnection(PoolingNHttpClientConnectionManager.java:303)
at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.releaseConnection(AbstractClientExchangeHandler.java:239)

1 Answers1

0

I worked around the issue with the following setting:

RestClientBuilder builder = RestClient.builder(
      new HttpHost("localhost", 9200, "http")); builder.setRequestConfigCallback(
      new RestClientBuilder.RequestConfigCallback() {
         @Override
         public RequestConfig.Builder customizeRequestConfig(
                 RequestConfig.Builder requestConfigBuilder) {
             return requestConfigBuilder.setConnectionRequestTimeout(-1); 
         }
     });

The underlying Apache RestClient has a limitation of AFAIK 10 concurrent connections in its connection pool. So if there are more then 10 concurrent requests, additional requests get queued and might hit the default DEFAULT_CONNECTION_REQUEST_TIMEOUT_MILLIS = 500; set in org.elasticsearch.client.RestClientBuilder

Markus
  • 1,887
  • 18
  • 23