2017-03-05 125 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;