Narendra Jaggi
Narendra Jaggi

Reputation: 1338

Unable to connect to Elastic Search

I am building a simple REST API which queries ElasticSearch. I am not using the ElasticSearch REST API way rather than I am using the TCP way. My goal is to make REST API using spring boot which will communicate with ElasticSearch via TCP.
I am using ElasticSearch sever 5.6
I have a ElasticSearchClientFactory which contains the code to establish connection with ElasticSearch server.

ElasticSearchClientFactory.java ' buildClient

void buildClient() {

        Settings settings = Settings.builder().put("cluster.name", elasticSearchProperties.getClusterName()).build();
        TransportClient transportClient = new PreBuiltTransportClient(settings);
        if (!StringUtils.isEmpty(elasticSearchProperties.getHostname())
                && !StringUtils.isEmpty(elasticSearchProperties.getPort() + "")) {

            try {

                transportClient.addTransportAddress(
                        new InetSocketTransportAddress(InetAddress.getByName(elasticSearchProperties.getHostname()),
                                elasticSearchProperties.getPort()));

                transportClient.connectedNodes();

                this.client = transportClient;

            } catch (UnknownHostException e) {

                LOGGER.error("Unable to Connect to ElasticSearch,UnknownHost" + elasticSearchProperties.getHostname());
            }
        } else {

            LOGGER.error("Missing ElasticSearch configuration hostname and portNumber");
            throw new DataAccessException(CommonConstants.DAE001, "Unable to connect to ElasticSearch");
        }

    }

pom.xml contains following related dependencies related to ElasticSearch

   <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.5.2</version>
    </dependency>

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.5.2</version>
    </dependency>

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.7</version>
    </dependency>

Following logs printing at server startup-

2017-09-14 16:52:28:840 search org.springframework.boot.SpringApplication [main] ERROR - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'elasticSearchClientFactory' defined in file [D:\projects\verizon\mesh_workspace\search\target\classes\com\sapient\mesh\productlisting\config\ElasticSearchClientFactory.class]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: io.netty.util.internal.ObjectUtil.checkPositive(ILjava/lang/String;)I
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:732)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
    at com.sapient.mesh.SearchApplication.main(SearchApplication.java:20)
Caused by: java.lang.NoSuchMethodError: io.netty.util.internal.ObjectUtil.checkPositive(ILjava/lang/String;)I
    at io.netty.util.NettyRuntime$AvailableProcessorsHolder.setAvailableProcessors(NettyRuntime.java:44)
    at io.netty.util.NettyRuntime.setAvailableProcessors(NettyRuntime.java:87)
    at org.elasticsearch.transport.netty4.Netty4Utils.setAvailableProcessors(Netty4Utils.java:82)
    at org.elasticsearch.transport.netty4.Netty4Transport.<init>(Netty4Transport.java:138)
    at org.elasticsearch.transport.Netty4Plugin.lambda$getTransports$0(Netty4Plugin.java:93)
    at org.elasticsearch.client.transport.TransportClient.buildTemplate(TransportClient.java:174)
    at org.elasticsearch.client.transport.TransportClient.<init>(TransportClient.java:265)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:130)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:116)
    at org.elasticsearch.transport.client.PreBuiltTransportClient.<init>(PreBuiltTransportClient.java:106)
    at com.sapient.mesh.productlisting.config.ElasticSearchClientFactory.buildClient(ElasticSearchClientFactory.java:62)
    at com.sapient.mesh.productlisting.config.ElasticSearchClientFactory.afterPropertiesSet(ElasticSearchClientFactory.java:53)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579)
    ... 16 common frames omitted

Upvotes: 2

Views: 817

Answers (1)

deathangel908
deathangel908

Reputation: 9709

In java NoSuchMethodError usually tells that you have multiple instances of same library (or sometime you have only one, but it's a wrong one). If I were you I would:

  • check maven tree with mvn dependency:tree -Dverbose. In the tree you going to see 2 instances of same library (probably 2 different versions). You need to manually exclude a dependency in pom.xml from the entry that has this lib as a dependency. Well, sometime extra lib can come from a server (e.g. glassfish) instead of maven, in that case check below.
  • Put a breakpoint to NettyRuntime.java:44, connect in a debug mode and when you hit it, evaluate the path of wrong library. To evaluate the path you need to ask a classLoader where the lirary is located. You can do this, evaluate code in debug mode*. (io.netty.util.internal.ObjectUtil class.getClassLoader()).getResource("io.netty.util.internal.ObjectUtil.class")) this will provide you a path to a library, from that point you would know what you need to exclude and where it came from

*Evaluate code or Evaluate expression is an option that should be available in debug mode in your IDE (Eclipse/Jetbrains/Netbeans or w/e you use, should support it)

Upvotes: 1

Related Questions