2017-03-05 129 views
4

我试图连接到弹性搜索这个样子,弹性搜索与Java

Transport client = new PreBuiltTransportClient(Settings.EMPTY). 
        addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9200)); 

但我收到以下错误,当我运行: -

Exception in thread "main" java.lang.AbstractMethodError: io.netty.util.concurrent.MultithreadEventExecutorGroup.newChild(Ljava/util/concurrent/Executor;[Ljava/lang/Object;)Lio/netty/util/concurrent/EventExecutor; 
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84) 
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:58) 
at io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:47) 
at io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:49) 

我的pom.xml的是

<dependency> 
      <groupId>org.elasticsearch.client</groupId> 
      <artifactId>transport</artifactId> 
      <version>5.2.1</version> 
</dependency> 
<dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.6.2</version> 
</dependency> 

请帮助提前致谢

回答

3

我猜这大概可能是因为从一个版本低于2.4的弹性搜索的版本升级到当前的条款,在您的最终实施的改变。

实现与current version将上述正确的方法 -

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY) 
     .addTransportAddress(new InetSocketTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9200)); 

虽然有和Version 2.3执行之前是因为:

Client client = TransportClient.builder().build() 
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300)) 
    .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300)); 

而且我通过AbstractMethodError here

定义去

当应用程序试图调用时抛出n抽象方法。通常情况下, 此错误是由编译器捕获; 如果某些类的定义,因为 当前正在执行的方法,最后编译了不相容改变只能发生在运行这个错误 时间。

对于这我也建议你,要经过mvn dependency:treeexclude任何其他依赖于神器org.elasticsearch.client

+1

感谢exluding io.netty:网状-comman解决@PrashantKumar欢迎:) –

+0

,甚至没有注意到这一点。 +1投票给你,我更新了我的答案,以避免混淆。 – nullpointer

0

你的初始化语法看起来是正确的,并没有在你的POM尖叫JAR地狱或任何其他冲突,但有一个问题,你怎么把它:

使用,而不是一个Transport对象,你是TransportClient对象试图使用。

TransportClient client = new PreBuiltTransportClient(Settings.EMPTY). 
         addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

Transport处于Elasticsearch回购接口,见here。运输客户依赖于Elasticsearch的休息,看here和下载它,并把它添加到你的项目的依赖。这意味着,当你说Transport它...

  1. 是不是您正在寻找的TransportClient。
  2. 您无意中参照Elasticsearch的主要代码Transport接口。
1

9200是Elasticsearch REST API的端口。要从Java客户端连接,您应该使用端口9300。我不知道为什么堆栈跟踪和错误信息如此不清楚......

+0

妈的,好抓的问题 – ryanlutgen

0
//Try this method... 

    public Client getConnection(){ 
    if (client == null) { 
       Settings settings = Settings.builder().put("cluster.name", 
      "elasticsearch").put("client.transport.sniff", true).build(); 
    try { 
     // preparing client object... 
    client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"),9300)); 
       } catch (UnknownHostException e) { 
        e.printStackTrace(); 
       } 

      } 

      return client;