如何关闭 RestHighLevelClient 5.6.X
How to close RestHighLevelClient 5.6.X
以下是我们使用的maven版本
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>5.6.13</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.13</version>
</dependency>
private RestHighLevelClient buildRestClient(ElasticRequestVO elasticRequestVO) {
String elasticHost =
StringUtils.isNotEmpty(elasticRequestVO.getElasticHost()) ? elasticRequestVO.getElasticHost()
: elasticSearchHost;
int elasticPort =
(elasticRequestVO.getElasticPort() != 0) ? elasticRequestVO.getElasticPort() : elasticSearchPort;
String elasticUser =
StringUtils.isNotEmpty(elasticRequestVO.getElasticUser()) ? elasticRequestVO.getElasticUser()
: elasticSearchUser;
String elasticPassword =
StringUtils.isNotEmpty(elasticRequestVO.getElasticPassword()) ? elasticRequestVO.getElasticPassword()
: elasticSearchPassword;
HttpHost host = new HttpHost(elasticHost, elasticPort);
RestClientBuilder restClientBuilder = RestClient.builder(host);
Optional<String> encodedAuth = getAuthenticationHeader(elasticUser, elasticPassword);
if (encodedAuth.isPresent()) {
Header[] requestHeaders =
new Header[] {new BasicHeader(org.apache.http.HttpHeaders.AUTHORIZATION, encodedAuth.get())};
restClientBuilder.setDefaultHeaders(requestHeaders);
}
return new RestHighLevelClient(restClientBuilder.build());
}
如何关闭RestHighLevelClient?
如果您将看到如何在最新版本之一中实现关闭,例如6.2.4你会发现RestHighLevelClient刚刚释放了RestClient
因此,对于关闭,我可以为您提供仅调用 restHighLevelClient.getLowLevelClient()
并关闭其余客户端 lowLevelRestClient.close()
.
P.S。如果只看源代码就会注意到这只是对其余客户端的包装。
不返回 RestHighLevelClient
,而是从 buildRestClient()
返回 RestClient
这里是代码示例
private RestClient buildRestClient(ElasticRequestVO elasticRequestVO) {
String elasticHost =
StringUtils.isNotEmpty(elasticRequestVO.getElasticHost()) ? elasticRequestVO.getElasticHost()
: elasticSearchHost;
int elasticPort =
(elasticRequestVO.getElasticPort() != 0) ? elasticRequestVO.getElasticPort() : elasticSearchPort;
String elasticUser =
StringUtils.isNotEmpty(elasticRequestVO.getElasticUser()) ? elasticRequestVO.getElasticUser()
: elasticSearchUser;
String elasticPassword =
StringUtils.isNotEmpty(elasticRequestVO.getElasticPassword()) ? elasticRequestVO.getElasticPassword()
: elasticSearchPassword;
HttpHost host = new HttpHost(elasticHost, elasticPort);
RestClientBuilder restClientBuilder = RestClient.builder(host);
Optional<String> encodedAuth = getAuthenticationHeader(elasticUser, elasticPassword);
if (encodedAuth.isPresent()) {
Header[] requestHeaders =
new Header[] {new BasicHeader(org.apache.http.HttpHeaders.AUTHORIZATION, encodedAuth.get())};
restClientBuilder.setDefaultHeaders(requestHeaders);
}
return restClientBuilder.build();
}
我的RestHighLevelClient版本是5.6.3,找不到restHighLevelClient.getLowLevelClient()或restHighLevelClient.close()之类的方法,所以我用反射让restClient关闭
Field restClientField = RestHighLevelClient.class.getDeclaredField("client");
restClientField.setAccessible(true);
RestClient restclient = (RestClient)restClientField.get(restHighLevelClient);
restClient.close();
我也遇到了同样的问题。
要关闭连接,您必须更改方法:
private RestClient buildRestClient(ElasticRequestVO elasticRequestVO) {
String elasticHost =
StringUtils.isNotEmpty(elasticRequestVO.getElasticHost()) ? elasticRequestVO.getElasticHost()
: elasticSearchHost;
int elasticPort =
(elasticRequestVO.getElasticPort() != 0) ? elasticRequestVO.getElasticPort() : elasticSearchPort;
String elasticUser =
StringUtils.isNotEmpty(elasticRequestVO.getElasticUser()) ? elasticRequestVO.getElasticUser()
: elasticSearchUser;
String elasticPassword =
StringUtils.isNotEmpty(elasticRequestVO.getElasticPassword()) ? elasticRequestVO.getElasticPassword()
: elasticSearchPassword;
HttpHost host = new HttpHost(elasticHost, elasticPort);
RestClientBuilder restClientBuilder = RestClient.builder(host);
Optional<String> encodedAuth = getAuthenticationHeader(elasticUser, elasticPassword);
if (encodedAuth.isPresent()) {
Header[] requestHeaders =
new Header[] {new BasicHeader(org.apache.http.HttpHeaders.AUTHORIZATION, encodedAuth.get())};
restClientBuilder.setDefaultHeaders(requestHeaders);
}
return restClientBuilder.build();
}
然后,当您调用您的方法时,您可以使用
final RestClient restClient=buildRestClient(...);
并做
new RestHighLevelClient(restClient)
需要的时候。
最后,你关闭。
例子
try (final RestClient restClient=buildRestClient(...)) {
final RestHighLevelClient restHLClient = new RestHighLevelClient(restClient);
// what you want
}
以下是我们使用的maven版本
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>5.6.13</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.13</version>
</dependency>
private RestHighLevelClient buildRestClient(ElasticRequestVO elasticRequestVO) {
String elasticHost =
StringUtils.isNotEmpty(elasticRequestVO.getElasticHost()) ? elasticRequestVO.getElasticHost()
: elasticSearchHost;
int elasticPort =
(elasticRequestVO.getElasticPort() != 0) ? elasticRequestVO.getElasticPort() : elasticSearchPort;
String elasticUser =
StringUtils.isNotEmpty(elasticRequestVO.getElasticUser()) ? elasticRequestVO.getElasticUser()
: elasticSearchUser;
String elasticPassword =
StringUtils.isNotEmpty(elasticRequestVO.getElasticPassword()) ? elasticRequestVO.getElasticPassword()
: elasticSearchPassword;
HttpHost host = new HttpHost(elasticHost, elasticPort);
RestClientBuilder restClientBuilder = RestClient.builder(host);
Optional<String> encodedAuth = getAuthenticationHeader(elasticUser, elasticPassword);
if (encodedAuth.isPresent()) {
Header[] requestHeaders =
new Header[] {new BasicHeader(org.apache.http.HttpHeaders.AUTHORIZATION, encodedAuth.get())};
restClientBuilder.setDefaultHeaders(requestHeaders);
}
return new RestHighLevelClient(restClientBuilder.build());
}
如何关闭RestHighLevelClient?
如果您将看到如何在最新版本之一中实现关闭,例如6.2.4你会发现RestHighLevelClient刚刚释放了RestClient
因此,对于关闭,我可以为您提供仅调用 restHighLevelClient.getLowLevelClient()
并关闭其余客户端 lowLevelRestClient.close()
.
P.S。如果只看源代码就会注意到这只是对其余客户端的包装。
不返回 RestHighLevelClient
,而是从 buildRestClient()
这里是代码示例
private RestClient buildRestClient(ElasticRequestVO elasticRequestVO) {
String elasticHost =
StringUtils.isNotEmpty(elasticRequestVO.getElasticHost()) ? elasticRequestVO.getElasticHost()
: elasticSearchHost;
int elasticPort =
(elasticRequestVO.getElasticPort() != 0) ? elasticRequestVO.getElasticPort() : elasticSearchPort;
String elasticUser =
StringUtils.isNotEmpty(elasticRequestVO.getElasticUser()) ? elasticRequestVO.getElasticUser()
: elasticSearchUser;
String elasticPassword =
StringUtils.isNotEmpty(elasticRequestVO.getElasticPassword()) ? elasticRequestVO.getElasticPassword()
: elasticSearchPassword;
HttpHost host = new HttpHost(elasticHost, elasticPort);
RestClientBuilder restClientBuilder = RestClient.builder(host);
Optional<String> encodedAuth = getAuthenticationHeader(elasticUser, elasticPassword);
if (encodedAuth.isPresent()) {
Header[] requestHeaders =
new Header[] {new BasicHeader(org.apache.http.HttpHeaders.AUTHORIZATION, encodedAuth.get())};
restClientBuilder.setDefaultHeaders(requestHeaders);
}
return restClientBuilder.build();
}
我的RestHighLevelClient版本是5.6.3,找不到restHighLevelClient.getLowLevelClient()或restHighLevelClient.close()之类的方法,所以我用反射让restClient关闭
Field restClientField = RestHighLevelClient.class.getDeclaredField("client");
restClientField.setAccessible(true);
RestClient restclient = (RestClient)restClientField.get(restHighLevelClient);
restClient.close();
我也遇到了同样的问题。 要关闭连接,您必须更改方法:
private RestClient buildRestClient(ElasticRequestVO elasticRequestVO) {
String elasticHost =
StringUtils.isNotEmpty(elasticRequestVO.getElasticHost()) ? elasticRequestVO.getElasticHost()
: elasticSearchHost;
int elasticPort =
(elasticRequestVO.getElasticPort() != 0) ? elasticRequestVO.getElasticPort() : elasticSearchPort;
String elasticUser =
StringUtils.isNotEmpty(elasticRequestVO.getElasticUser()) ? elasticRequestVO.getElasticUser()
: elasticSearchUser;
String elasticPassword =
StringUtils.isNotEmpty(elasticRequestVO.getElasticPassword()) ? elasticRequestVO.getElasticPassword()
: elasticSearchPassword;
HttpHost host = new HttpHost(elasticHost, elasticPort);
RestClientBuilder restClientBuilder = RestClient.builder(host);
Optional<String> encodedAuth = getAuthenticationHeader(elasticUser, elasticPassword);
if (encodedAuth.isPresent()) {
Header[] requestHeaders =
new Header[] {new BasicHeader(org.apache.http.HttpHeaders.AUTHORIZATION, encodedAuth.get())};
restClientBuilder.setDefaultHeaders(requestHeaders);
}
return restClientBuilder.build();
}
然后,当您调用您的方法时,您可以使用
final RestClient restClient=buildRestClient(...);
并做
new RestHighLevelClient(restClient)
需要的时候。 最后,你关闭。
例子
try (final RestClient restClient=buildRestClient(...)) {
final RestHighLevelClient restHLClient = new RestHighLevelClient(restClient);
// what you want
}