I've got a NoNodeAvailableException while using Java Transport Client to connect with Elasticsearch 5.1.1. However I've also seen many topics here with the same title and I have no idea to solve this problem.
The NoNodeAvailableException is given below.
NoNodeAvailableException[None of the configured nodes were available: [{c3-miui-assist-fe10.assist-search}{lhxqrIimSkGBYbxKxuf1UQ}{0Pgd3xXfRpyoT3jyERSGPQ}{10.114.35.4}{10.114.35.4:9300}]]; nested: SendRequestTransportException[[c3-miui-assist-fe10.assist-search][10.114.35.4:9300][indices:data/read/search]]; nested: NodeNotConnectedException[[c3-miui-assist-fe10.assist-search][10.114.35.4:9300] Node not connected];
at org.elasticsearch.client.transport.TransportClientNodesService$RetryListener.onFailure(TransportClientNodesService.java:272)
at org.elasticsearch.action.ActionListenerResponseHandler.handleException(ActionListenerResponseHandler.java:51)
at org.elasticsearch.transport.TransportService$ContextRestoreResponseHandler.handleException(TransportService.java:984)
at org.elasticsearch.transport.TransportService$5.doRun(TransportService.java:552)
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:527)
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: SendRequestTransportException[[c3-miui-assist-fe10.assist-search][10.114.35.4:9300][indices:data/read/search]]; nested: NodeNotConnectedException[[c3-miui-assist-fe10.assist-search][10.114.35.4:9300] Node not connected];
at org.elasticsearch.transport.TransportService.sendRequestInternal(TransportService.java:531)
at org.elasticsearch.transport.TransportService.sendRequest(TransportService.java:465)
at org.elasticsearch.action.TransportActionNodeProxy.execute(TransportActionNodeProxy.java:51)
at org.elasticsearch.client.transport.TransportProxyClient.lambda$execute$0(TransportProxyClient.java:59)
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:231)
at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:59)
at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:345)
at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:403)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:80)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:54)
Here is my code:
@Service
public class ESProxy {
private Client client;
private static Logger logger = LoggerFactory.getLogger(ESProxy.class);
@PostConstruct
public void init() {
logger.info("start to init elasticsearch client");
Properties properties = System.getProperties();
Resource res = new ClassPathResource("es.properties");
try {
properties.load(res.getInputStream());
String clusterName = properties.getProperty("cluster.name");
String sniff = properties.getProperty("client.transport.sniff");
String hosts = properties.getProperty("hosts");
String port = properties.getProperty("port");
String userPasswd = properties.getProperty("xpack.security.user");
String[] cols = hosts.split(",");
TransportAddress[] addresses = new TransportAddress[cols.length];
for (int i = 0; i < cols.length; i++) {
addresses[i] = new InetSocketTransportAddress(InetAddress.getByName(cols[i]), Integer.valueOf(port));
}
Settings settings = Settings.builder()
.put("cluster.name", clusterName)
.put("xpack.security.user", userPasswd)
.put("client.transport.sniff", Boolean.valueOf(sniff))
.build();
TransportClient client = new PreBuiltXPackTransportClient(settings).addTransportAddresses(addresses);
this.client = client;
} catch (IOException e) {
logger.error("{}", e);
e.printStackTrace();
}
}
public Client getClient() {
return this.client;
}
@PreDestroy
public void destroy() {
logger.info("destroy the client");
this.client.close();
}
}
and I just use the following code to use this proxy.
String queryStr = "{\"match\":{\"split_word\":{\"query\":\""+ passage +"\"}}}";
SearchResponse response = esProxy.getClient().prepareSearch("pastime_detail").setQuery(QueryBuilders.wrapperQuery(queryStr)).setSize(3).execute().actionGet();
The cluster.name, the port and the hosts are the same as the configuration in elasticsearch.yml.
Then I deployed this service on the server. After getting the right response for the first two times, I was stuck in the NoNodeAvailableException above. But after about 20 seconds, I could get the right response again. And then the NoNodeAvailableException appeared when I send another requests.
I am so confused. Anyone can help me to solve this problem?