ElasticsearchRestTemplate entity content is too long 最大字节长度限制修改
依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>报错Caused by: org.apache.http.Co
·
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
报错
Caused by: org.apache.http.ContentTooLongException: entity content is too long [143914703] 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)
报错原因
在ElasticsearchRestTemplate中使用了RequestIOptions.DEFAULT
解决办法
查看了源码HttpAsyncResponseConsumerFactory是没有通过Spring容器注入的,所以没办法通过声明Bean来覆盖,那么我想到的办法是通过反射来修改RequestIOptions中的HttpAsyncResponseConsumerFactory。
因为我的项目使用的是SpringMVC,那么我可以在运行时来修改,即第一次接口调用的时候来修改,这个时候相关的类已经全部加载完毕。那么我可以使用SpringMVC的拦截器HandleInceptor的preHandle()
以下就为我的配置,修改最大每次查询上限为300MB
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//设置ElasticsearchRestTemplate查询的最大值为300MB 默认为100MB
registry.addInterceptor(new HandlerInterceptor() {
private boolean isSetBuffer = false;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//已经设置过
if (isSetBuffer) {
return true;
}
//设置es查询buffer大小
RequestOptions requestOptions = RequestOptions.DEFAULT;
Class<? extends RequestOptions> aClass = requestOptions.getClass();
Field aDefault = aClass.getDeclaredField("httpAsyncResponseConsumerFactory");
aDefault.setAccessible(true);
//去除final
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(aDefault, aDefault.getModifiers() & ~Modifier.FINAL);
//设置默认的工厂
aDefault.set(requestOptions, new HttpAsyncResponseConsumerFactory() {
/**
* Creates the {@link HttpAsyncResponseConsumer}, called once per request attempt.
*/
@Override
public HttpAsyncResponseConsumer<HttpResponse> createHttpAsyncResponseConsumer() {
//300MB
return new HeapBufferedAsyncResponseConsumer(3 * 100 * 1024 * 1024);
}
});
//标记
isSetBuffer = true;
return true;
}
});
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)