package fr.ippon.tatami.service.elasticsearch;
import org.elasticsearch.action.admin.cluster.node.info.NodesInfoRequest;
import org.elasticsearch.action.admin.cluster.node.info.NodesInfoResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
/**
* Transport client configuration.
*/
public class RemoteElasticsearchEngine implements ElasticsearchEngine {
private static final Logger log = LoggerFactory.getLogger(RemoteElasticsearchEngine.class);
@Inject
private Environment env;
private TransportClient client;
@PostConstruct
private void init() {
log.info("Initializing Elasticsearch remote client...");
Settings settings = ImmutableSettings.settingsBuilder()
.put("cluster.name", env.getRequiredProperty("elasticsearch.cluster.name"))
.build();
client = new TransportClient(settings, false);
// Looking for nodes configuration
String nodes = env.getRequiredProperty("elasticsearch.cluster.nodes");
String[] nodesAddresses = nodes.split(",");
if (nodesAddresses.length == 0) {
throw new IllegalStateException("ES client must have at least one node to connect to");
}
for (String nodeAddress : nodesAddresses) {
client.addTransportAddress(parseAddress(nodeAddress));
}
if (log.isInfoEnabled()) {
NodesInfoResponse nir =
client.admin().cluster().nodesInfo(new NodesInfoRequest()).actionGet();
log.info("Elasticsearch client is now connected to the " + nir.nodes().length + " node(s) cluster named \""
+ nir.clusterName() + "\"");
}
}
@PreDestroy
private void close() {
log.info("Closing Elasticsearch remote client");
client.close();
}
public Client client() {
return client;
}
private InetSocketTransportAddress parseAddress(String address) {
String[] addressItems = address.split(":", 2);
int port = Integer.parseInt(addressItems.length > 1 ? addressItems[1] : env.getRequiredProperty("elasticsearch.cluster.default.communication.port"));
return new InetSocketTransportAddress(addressItems[0], port);
}
}