package eu.eudat.configurations; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager; import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; import org.apache.http.nio.reactor.IOReactorException; import org.apache.http.nio.reactor.IOReactorExceptionHandler; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import java.io.IOException; /** * Created by ikalyvas on 7/5/2018. */ @Configuration public class ElasticSearchConfiguration { private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfiguration.class); private Environment environment; @Autowired public ElasticSearchConfiguration(Environment environment) { this.environment = environment; } @Bean(destroyMethod = "close") public RestHighLevelClient client() throws Exception { final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(this.environment.getProperty("elasticsearch.username"), this.environment.getProperty("elasticsearch.password"))); try { DefaultConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(); ioReactor.setExceptionHandler(new IOReactorExceptionHandler() { @Override public boolean handle(IOException e) { logger.warn("System may be unstable: IOReactor encountered a checked exception : " + e.getMessage(), e); return true; // Return true to note this exception as handled, it will not be re-thrown } @Override public boolean handle(RuntimeException e) { logger.warn("System may be unstable: IOReactor encountered a runtime exception : " + e.getMessage(), e); return true; // Return true to note this exception as handled, it will not be re-thrown } }); RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost(this.environment.getProperty("elasticsearch.host"), Integer.parseInt(this.environment.getProperty("elasticsearch.port")), "http")) .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder .setDefaultCredentialsProvider(credentialsProvider).setConnectionManager(new PoolingNHttpClientConnectionManager(ioReactor)))); return client; }catch (IOReactorException ex) { throw new RuntimeException(ex); } } }