首页 > 解决方案 > 使用 java 为弹性搜索客户端设置超时

问题描述

我正在尝试以客户端将在 1 小时左右后关闭的方式使用弹性搜索客户端类:


public class ElasticSearchClient implements Closeable {

    public static final String INDEX = EnvConf.getProperty("elastic.tests_report.index");
    private static final String HOST = EnvConf.getProperty("elastic.host");
    private static final int PORT = EnvConf.getAsInteger("elastic.port");
    private final RestHighLevelClient restClient;

    public ElasticSearchClient() {
        RestClientBuilder builder = RestClient.builder(
                new HttpHost(HOST, PORT))
                .setRequestConfigCallback(
                        requestConfigBuilder -> requestConfigBuilder
                                .setConnectTimeout(5000)
                                .setSocketTimeout(10000))
                .setMaxRetryTimeoutMillis(90000);
        restClient = new RestHighLevelClient(builder);
    }

    public IndexResponse index(String index , String type , XContentBuilder contentBuilder) throws IOException {
        IndexRequest indexRequest = new IndexRequest(index, type)
                .source(contentBuilder);
        return restClient.index(indexRequest , RequestOptions.DEFAULT);
    }



    public SearchResponse query(QueryBuilder queryBuilder, int maxHits, String...indices) throws IOException {
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS))
                .size(maxHits)
                .sort(new FieldSortBuilder("start_timestamp").order(SortOrder.DESC));
        SearchRequest searchRequest = new SearchRequest(indices);
        searchRequest.source(searchSourceBuilder.query(queryBuilder));
        return restClient.search(searchRequest , RequestOptions.DEFAULT);
    }

    @Override
    public void close() throws IOException {
        restClient.close();
    }
}

我以为它会运行 1.5 小时,我看到 30 分钟后它停止索引客户端,这是我收到的错误消息:

java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STOPPED
    at org.apache.http.util.Asserts.check(Asserts.java:46)
    at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase.ensureRunning(CloseableHttpAsyncClientBase.java:90)
    at org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:123)
    at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:533)
    at org.elasticsearch.client.RestClient.performRequestAsyncNoCatch(RestClient.java:516)
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:228)
    at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1762)
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1732)
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1694)
    at org.elasticsearch.client.RestHighLevelClient.index(RestHighLevelClient.java:926)
    at com.indeni.automation.api.db.ElasticSearchClient.index(ElasticSearchClient.java:46)
    at com.indeni.automation.core.runner.testng.TestListener.updateDataSourceWithTestResult(TestListener.java:215)
    at com.indeni.automation.core.runner.testng.TestListener.onFinish(TestListener.java:125)
    at org.testng.TestRunner.fireEvent(TestRunner.java:1239)
    at org.testng.TestRunner.afterRun(TestRunner.java:1030)
    at org.testng.TestRunner.run(TestRunner.java:636)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
    at org.testng.SuiteRunner.access$000(SuiteRunner.java:39)
    at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:400)
    at org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

我注意到它在 30 分钟后停止工作,我不知道原因。

标签: javaelasticsearch

解决方案


推荐阅读