【问题标题】:How to use High Level Rest Client in Spring Data ES 3.2.0.M1如何在 Spring Data ES 3.2.0.M1 中使用 High Level Rest Client
【发布时间】:2019-07-12 06:43:57
【问题描述】:

Spring Data ES 3.2.0.M1 仍然使用旧的TransportClient 而不是HighLevelRestClient

Spring Data ES 3.2.0.M1 支持 High Level Rest Client,参见Add support for Java High Level REST Client。我已将 Spring Data ES 3.2.0.M1 添加到 SB2 应用程序:

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.0.M1</version>
        </dependency>

但是,仍然使用TransportClient。有两个迹象表明:启动异常:

o.e.transport.netty4.Netty4Transport     : exception caught on transport layer [NettyTcpChannel{localAddress=/127.0.0.1:61171, remoteAddress=localhost/127.0.0.1:8085}], closing connection

io.netty.handler.codec.DecoderException: java.io.StreamCorruptedException: invalid internal transport message format, got (48,54,54,50)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:472) ~[netty-codec-4.1.33.Final.jar:4.1.33.Final]

调用ElasticsearchTemplate时的异常堆栈跟踪:

    at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:349)
    at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:247)
    at org.elasticsearch.client.transport.TransportProxyClient.execute(TransportProxyClient.java:60)
    at org.elasticsearch.client.transport.TransportClient.doExecute(TransportClient.java:382)
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:395)
    at org.elasticsearch.client.support.AbstractClient.execute(AbstractClient.java:384)
    at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:46)
    at org.springframework.data.elasticsearch.core.ElasticsearchTemplate.getSearchResponse(ElasticsearchTemplate.java:947)

是否有任何配置参数告诉 Spring Data ES 切换到新的 High Level Rest Client?文档对此只字未提。

附: Spring Data ES 3.2.0.M1 有 6.4.3 ES 客户端版本:

Caused by: java.io.StreamCorruptedException: invalid internal transport message format, got (48,54,54,50)
    at org.elasticsearch.transport.TcpTransport.validateMessageHeader(TcpTransport.java:1327) ~[elasticsearch-6.4.3.jar:6.4.3]
    at org.elasticsearch.transport.netty4.Netty4SizeHeaderFrameDecoder.decode(Netty4SizeHeaderFrameDecoder.java:36) ~[transport-netty4-client-6.4.3.jar:6.4.3]
    at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502) ~[netty-codec-4.1.33.Final.jar:4.1.33.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:441) ~[netty-codec-4.1.33.Final.jar:4.1.33.Final]
    ... 20 common frames omitted

后端运行6.4.2版本:

bash-4.4$ curl http://127.0.0.1:8085
{
  "name" : "NA17WWR",
  "cluster_name" : "494164851665",
  "cluster_uuid" : "7t3LoK7PRp-ur6FyxSmHwQ",
  "version" : {
    "number" : "6.4.2",
    "build_flavor" : "oss",
    "build_type" : "zip",
    "build_hash" : "04711c2",
    "build_date" : "2018-10-16T09:16:35.059415Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

【问题讨论】:

    标签: elasticsearch spring-data-elasticsearch


    【解决方案1】:

    正如您所指的问题中所述,高级 REST 客户端在 ElasticsearchRestTemplate(请参阅 PR #216)而不是在 ElasticsearchTemplate 中可用,出于向后兼容性的原因,它们将保留到 ES 7。

    您可以使用以下配置创建一个:

    <bean name="elasticsearchTemplate"
          class="org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate">
        <constructor-arg name="client" ref="restClient"/>
    </bean>
    
    <elasticsearch:rest-client id="restClient"/>
    

    【讨论】:

    • 确实,切换到ElasticsearchRestTemplate 有助于访问 ES 6.4。谢谢!将其放入文档是有意义的:docs.spring.io/spring-data/elasticsearch/docs/3.2.0.M1/… 但是,仍然有来自 NettyWARN 日志。客户端elasticsearch-6.4.3.jar和后端的ES版本相互匹配。有什么提示吗?
    • 您确实需要确保使用正确版本的 Spring Data ES 和相同版本的 ES 服务器。
    • 我已经用客户端和后端 ES 版本更新了这个问题。 ES 版本几乎相互匹配:客户端 6.4.3 和后端 6.4.2
    • 您的所有节点都使用相同的版本吗?问题不在于 REST 客户端,而在于 TransportClient,它与正在与之通信的 ES 服务器使用的版本不同。
    猜你喜欢
    • 2020-10-04
    • 2023-04-04
    • 2021-11-05
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多