У меня есть периодическое задание, которое запускается каждую секунду (это настраивается).
В этой работе я сначала создаю соединение с сервером 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 я закрываю соединение в этом задании:
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
экземпляр быть одноэлементным объектом для всего приложения, или я должен создавать новый экземпляр в каждом цикле выполнения задания и закрывать экземпляр после выполнения этого задания?