java - org.apache.http.ContentTooLongException: entity content is too long [105539255] for the configured buffer limit [104857600] - Stack Overflow
在生產(chǎn)環(huán)境批量同步數(shù)據(jù)的時候,我寫了一個查詢請求,然后直接報錯:entity content is too long [142501157] for the configured buffer limit [104857600]
具體內(nèi)容如下:
Caused by: org.apache.http.ContentTooLongException: entity content is too long [142501157] 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:137)
at org.apache.http.impl.nio.client.MainClientExec.responseReceived(MainClientExec.java:315)
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseReceived(DefaultClientExchangeHandlerImpl.java:151)
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.responseReceived(HttpAsyncRequestExecutor.java:315)
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:255)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
at java.lang.Thread.run(Thread.java:748)
Suppressed: org.apache.http.ContentTooLongException: entity content is too long [142501157] for the configured buffer limit [104857600]
... 16 more
Suppressed: org.apache.http.ContentTooLongException: entity content is too long [142501157] for the configured buffer limit [104857600]
... 16 more
在HttpAsyncResponseConsumerFactory
類中:
在HeapBufferedAsyncResponseConsumer
類中有一個判斷:返回的內(nèi)容長度大于限定的100MB就會拋出ContentTooLongException
異常。
我這里用的依賴是:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>6.6.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.6.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.6.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.6.2</version>
</dependency>
而我們對es進行查詢操作,或者其他增刪改操作是,都會默認使用如下的RequestOptions.DEFAULT
進入RequestOptions.DEFAULT
看它的代碼:這里用了HeapBufferedResponseConsumerFactory.DEFAULT
而這個HeapBufferedResponseConsumerFactory.DEFAULT
,就是我們之前看到的,已經(jīng)被限制了100MB返回值的HeapBufferedResponseConsumerFactory。
所以有兩種方式可以解決這個bug。
方式一:
不使用默認的RequestOptions.DEFAULT
,而通過使用自定義RequestOptions
的方式(ES官方api已經(jīng)給我們開放出來了):
RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
builder.setHttpAsyncResponseConsumerFactory(
new HttpAsyncResponseConsumerFactory
//修改為500MB
.HeapBufferedResponseConsumerFactory(500 * 1024 * 1024));
RequestOptions requestOptions=
builder.build();
方式二:
如果不方便修改怎么辦,例如我們使用的是Spring Data ElasticSearch或者是其他的一些框架,而它默認使用的也是RequestOptions.DEFAULT
這時候我們可以通過java反射進行修改:文章來源:http://www.zghlxwxcb.cn/news/detail-445900.html
//設(shè)置es查詢buffer大小
RequestOptions requestOptions = RequestOptions.DEFAULT;
Class<? extends RequestOptions> reqClass = requestOptions.getClass();
Field reqField = reqClass.getDeclaredField("httpAsyncResponseConsumerFactory");
reqField.setAccessible(true);
//去除final
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(reqField, reqField.getModifiers() & ~Modifier.FINAL);
//設(shè)置默認的工廠
reqField.set(requestOptions, new HttpAsyncResponseConsumerFactory() {
@Override
public HttpAsyncResponseConsumer<HttpResponse> createHttpAsyncResponseConsumer() {
//500MB
return new HeapBufferedAsyncResponseConsumer(5 * 100 * 1024 * 1024);
}
});
如果你使用的是springmvc,那么可以把這段代碼加入到攔截器中,這樣可以攔截需要自定義返回值大小的es請求文章來源地址http://www.zghlxwxcb.cn/news/detail-445900.html
到了這里,關(guān)于ES查詢報錯:entity content is too long [142501157] for the configured buffer limit [104857600]的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!