[spring-projects/spring-boot]使用 Elastic 实例化 PreBuiltXPackTransportClient 时出现开箱即用错误

2024-04-29 482 views
7

你好,

切换到 RC2 覆盖 5.6.8 的默认 5.5.0 弹性客户端

使用弹性搜索我得到这个网络错误

无法实例化 [org.elasticsearch.client.Client]:工厂方法“client”抛出异常;嵌套异常是 java.lang.IllegalStateException: availableProcessors 已设置为 [8],拒绝 [8]

实例化客户端的代码是:

@Bean
  public Client client() throws Exception {

    Settings esSettings = Settings.builder().put("cluster.name", clusterName)
        .put("xpack.security.user", userName + ":" + password)
        .build();
    TransportClient client = new PreBuiltXPackTransportClient(esSettings, Collections.emptySet());
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
    return client;
  }

我发现的解决方法是将“es.set.netty.runtime.available.processors”系统属性设置为“false”。与其说是令人烦恼的想法,不如说是令人烦恼的开箱即用体验。

干杯,

R。

回答

2

感谢您的报告。此失败意味着其他东西已经配置了可用的处理器。从你分享的一点点内容中我无法判断出那件事可能是什么以及是否可以避免。您能提供一个重现该问题的小样本吗?

切换到 RC2 覆盖 5.6.8 的默认 5.5.0 弹性客户端

您确定默认吗?自 RC1 以来,Boot 的依赖管理一直使用 5.6.x。

3

好的,我会调查,但老实说,我不知道事先配置了处理器计数。代码示例有点复杂......在一家私营公司工作。如果我找不到有问题的设置,我会尝试设置一些复制代码。

对于客户端版本...

这是我从忽略强制 5.6.8 版本的 gradle 依赖项中得到的结果:

+--- org.springframework.boot:spring-boot-starter-data-elasticsearch:2.0.0.RC2
|    +--- org.springframework.boot:spring-boot-starter:2.0.0.RC2 (*)
|    \--- org.springframework.data:spring-data-elasticsearch:3.0.4.RELEASE
|         +--- org.springframework:spring-context:5.0.4.RELEASE (*)
|         +--- org.springframework:spring-tx:5.0.4.RELEASE
|         |    +--- org.springframework:spring-beans:5.0.4.RELEASE (*)
|         |    \--- org.springframework:spring-core:5.0.4.RELEASE (*)
|         +--- org.springframework.data:spring-data-commons:2.0.4.RELEASE
|         |    +--- org.springframework:spring-core:5.0.4.RELEASE (*)
|         |    +--- org.springframework:spring-beans:5.0.4.RELEASE (*)
|         |    \--- org.slf4j:slf4j-api:1.7.25
|         +--- commons-lang:commons-lang:2.6
|         +--- joda-time:joda-time:2.9.9
|         +--- org.elasticsearch:elasticsearch:5.5.0
...
8

好的,我提交的代码被调用了两次,抱歉打扰,但感谢帮助清理我糟糕的代码

2

感谢您让我们知道。

6

这是我从 gradle 依赖项中得到的结果,省略了强制的 5.6.8 版本

在我看来,您尚未将依赖项管理插件应用到您的项目中:

apply plugin: 'io.spring.dependency-management'
2

当将插件依赖项更改应用到 5.6.7 时,您是对的

回到我原来的问题,我错了,代码没有被调用两次,处理器的数量似乎是在服务器启动期间(使用反应式启动器和 undertow)由 NettyRuntime 类(第 70 行)设置的。我会尝试尽快建立一个用于复制的小项目

0

springboot12242.tar.gz 这里是一个 gradle 项目,带有一些 bash 脚本来安装和运行我正在使用的 docker 映像。有一个readme.md

9

谢谢。唯一尝试设置可用处理器的代码是 Elasticsearch。 Reactor Netty 使用 Netty PooledByteBufAllocator,并在其静态初始化程序中进行以下调用:

final int defaultMinNumArena = NettyRuntime.availableProcessors() * 2;

此调用availableProcessors()可防止将来尝试配置可用处理器的数量。简而言之,避免该问题的唯一方法是确保尝试设置可用处理器的 Elasticsearch 代码首先运行,或者禁用或更改该代码。

正如您所注意到的,可以通过设置es.set.netty.runtime.available.processors系统属性来禁用该代码。不幸的是,我认为 Boot 不适合为您设置该属性,因为它的范围是 JVM 范围的。我认为理想的情况是 Elasticsearch 的客户端要么停止尝试配置可用处理器的数量,要么采取防御性配置,这样异常就不会破坏您的应用程序。如果您想采纳此建议,则需要向 Elasticsearch 团队提出建议。你可以对这个问题发表评论。

7

好的,谢谢,我会发表评论,但我怀疑他们不会做太多事情,因为我记得很清楚,他们计划弃用 TransportClient,转而使用 RestHighLevelClient。

感谢您的时间。

2

当同时使用 spring-boot-starter-data-redis 和 spring-boot-starter-data-elasticsearch 时,我再次遇到这个问题。我发现是Lettuce造成的,Lettuce使用Netty,elasticsearch也使用Netty。

5

请在 Spring Data Elasticsearch 项目中提出问题

我认为这不会有帮助,因为问题出在 Elasticsearch 中。如果您认为 Elasticsearch 现有的基于系统属性的解决方案不够充分,我建议对此Elasticsearch 问题发表评论。