我有一个每秒运行一次的定期作业(这是可配置的)。
在这项工作中,我首先创建一个到 Elasticsearch 服务器的连接:
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost(address, port, "http")));
然后我检查是否存在一个名为test. 如果它不存在,我先创建它。
GetIndexRequest indexRequest = new GetIndexRequest();
indexRequest.indices("test");
boolean testIndexIsExists = false;
try {
testIndexIsExists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);
} catch (IOException ioe) {
logger.error("Can't check the existence of test index in Elasticsearch!");
}
if(testIndexIsExists) {
// bulk request...
} else {
CreateIndexRequest testIndex = new CreateIndexRequest("test");
try {
testIndex.mapping("doc", mappingConfiguration);
client.indices().create(testIndex, RequestOptions.DEFAULT);
// bulk request...
} catch (IOException ioe) {
logger.error("Can't create test index in Elasticsearch");
}
}
在执行了一个包含近 2000 个文档的批量请求后,我关闭了 Elasticsearch 客户端连接:
client.close();
Java 高级 REST 客户端版本:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.4.0</version>
</dependency>
我的问题是一堆 TCP 连接已经建立并且没有关闭。这些 TCP 连接随着时间的推移占用所有操作系统 TCP 连接。
另一方面,我有点困惑。实例应该RestHighLevelClient是整个应用程序的单例对象,还是我必须在每个作业运行周期中创建一个新实例并在完成该作业后关闭该实例?
达令说
回首忆惘然
相关分类