es 异常 org.apache.http.ContentTooLongException: entity content is too long 解决思路

问题:使用es 的java restHighLevelAPI 请求报错如下

Caused by: org.apache.http.ContentTooLongException: entity content is too long [349376897] for the configured buffer limit [104857600]
        at org.elasticsearch.client.HeapBufferedAsyncResponseConsumer.onEntityEnclosed(HeapBufferedAsyncResponseConsumer.java:76)
        at org.apache.http.nio.protocol.AbstractAsyncResponseConsumer.responseReceived(AbstractAsyncResponseConsumer.java:129)
        at org.apache.http.impl.nio.client.MainClientExec.responseReceived(MainClientExec.java:332)
        at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseReceived(DefaultClientExchangeHandlerImpl.java:148)
        at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.responseReceived(HttpAsyncRequestExecutor.java:224)
        at org.apache.http.impl.nio.client.LoggingAsyncRequestExecutor.responseReceived(LoggingAsyncRequestExecutor.java:112)
        at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:254)
        at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:73)
        at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:37)
        at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:113)
        at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:159)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:338)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:316)
        at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:277)
        at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:105)
        at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:584)
        at java.lang.Thread.run(Thread.java:748)

解决方法一:调整每次循环取数的size ;代码为

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.size(10000);

这是最简单的方式,例如我设置10000,就是每次返回1万条数据;如果报上述错误,可以设置小一点一般就能解决,此方式会增加请求次数,不影响返回结果。

解决方法二,既然报错显示默认的大小不够用,那就在轮巡返回数据条数不变的基础上,调整本地存储的大小。

如果单条数据本来就是一个很大的数据,以后很有可能出现同样的错误,同时出现请求超时的问题;所以建议设计合理的表结构和字段数,以及控制查询返回的字段数。

根据报错可以得到信息:返回的数据大于100MB;因为我的代码设置为

mClient.search(searchRequest, RequestOptions.DEFAULT) // RequestOptions.DEFAULT 为默认值100MB。

既然如此,如何自定义设置这个大小呢?

1.根据返回信息的第一行,最后定位的报错位置 为HeapBufferedAsyncResponseConsumer 类的第76行;双击shift (我的是IDEA编辑器),将类名输入查找到第76行,定位bufferLimitBytes这个成员变量是谁给它赋值的;

2.通过根据引用为HttpAsyncResponseConsumerFactory第61行new了HeapBufferedAsyncResponseConsumer 进行赋值;

3.HttpAsyncResponseConsumerFactory 是一个接口,寻找它的子类为HeapBufferedResponseConsumerFactory,是通过构造器传入;

4.上面是根据报错的倒推思路;根据我赋值的默认值  RequestOptions.DEFAULT;判断自定义设置肯定也在 RequestOptions类里,看下图小写和第三步的 HttpAsyncResponseConsumerFactory接口是一样的,RequestOptions的构造器如图是私有化的,说明我们是不能直接调用的;下一步追踪是谁调用了这个私有化的构造器

 

5. 发现为该类的内部静态类的build 方法调用的;build方法返回的是一个RequestOptions;而我之前设置的RequestOptions.DEFAULT 也是一个 RequestOptions对象;因此大概可以确定关于参数的设置应围绕 内部静态类 Builder;而Builder 确实包含方法setHttpAsyncResponseConsumerFactory可以自定义参数大小

 

 

 6.  因此代码为

      val builder = RequestOptions.DEFAULT.toBuilder
      val consumerFactory = new HeapBufferedResponseConsumerFactory(1024 * 1024 * 1024) //1g
      builder.setHttpAsyncResponseConsumerFactory(consumerFactory)
      var searchResponse = mClient.search(searchRequest, builder.build())

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误是Java代码中GraphClient发生的异常异常类型是ClassNotFoundException,具体是找不到org.apache.http.HttpEntity类。 出现这个错误可能有以下几个原因: 1. 缺少依赖库:在Java代码中使用了GraphClient类,但是没有在项目中添加所需的依赖库。在这种情况下,需要检查项目的依赖配置,确认是否添加了org.apache.http组件的正确版本。 2. 依赖库版本不匹配:如果项目中已经添加了org.apache.http组件的依赖,但是版本与代码中使用的版本不匹配,也会导致该异常。需要确认所使用的GraphClient代码与依赖库的版本匹配。 3. 编译错误:如果在编译代码时出现错误,可能会导致生成的.class文件缺少对应的类。在这种情况下,重新编译代码可能会解决问题。 为了解决这个问题,可以尝试以下几种方法: 1. 检查并确保项目中已正确添加org.apache.http组件的依赖库,并且版本与代码一致。 2. 如果已经添加了正确的依赖库但仍然出现错误,可以尝试更新依赖库的版本,并重新编译代码。 3. 检查项目的构建配置,确认是否出现了与依赖库冲突的情况,例如其他库中使用了相同的类。 总之,这个错误提示表明在运行Java代码时找不到org.apache.http.HttpEntity类,我们需要检查项目的依赖库配置,确保正确添加了所需的依赖库,并且与代码中使用的版本匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值