不要急,总有办法的

elasticsear rest api异步写失败问题

Elasticsearch | 作者 kevinYang | 发布于2017年12月05日 | 阅读数:4522

我使用的是REST API 进行写ES(org.elasticsearch.client 版本是5.5.3),循环多次向ES中异步写入数据(client.performRequestAsync ),利用kibana查询时与写入的数据个数不匹配,例如我写入的是11条数据,可能ES中只有10条,报下面的异常
 

11.png



代码如下:


22.png


通过抓包发现HTTP请求确实少发送了!
 
 
ps: 同步写多条是OK的
 
已邀请:

medcl - 今晚打老虎。

赞同来自:

如果确定发送了11个请求,但是Kibana 查不到:
1. 手动 refresh 一下,再试试。
2.可以抓包看看每一条 http 请求的返回是不是都是正常返回,是不是有索引异常。

kevinYang

赞同来自:

@medcl  大神 你好,
1. 手工抓包发现HTTP请求确实少了,ES的日志也显示请求确实少了,也就是数请求进来确实少了,同时ES那边没有建立Mapping都是自动建立,应该与服务端配置没有关系
2. 测试5条的时候客户端有时候偶尔抛出下面的异常

java.lang.IllegalArgumentException
at java.nio.Buffer.position(Buffer.java:244)
at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:209)
at org.apache.http.impl.nio.reactor.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:177)
at org.apache.http.impl.nio.codecs.AbstractContentEncoder.doWriteChunk(AbstractContentEncoder.java:178)
at org.apache.http.impl.nio.codecs.AbstractContentEncoder.doWriteChunk(AbstractContentEncoder.java:164)
at org.apache.http.impl.nio.codecs.AbstractContentEncoder.writeToBuffer(AbstractContentEncoder.java:151)
at org.apache.http.impl.nio.codecs.LengthDelimitedEncoder.write(LengthDelimitedEncoder.java:112)
at org.apache.http.nio.entity.NStringEntity.produceContent(NStringEntity.java:174)
at org.apache.http.nio.protocol.BasicAsyncRequestProducer.produceContent(BasicAsyncRequestProducer.java:125)
at org.apache.http.impl.nio.client.MainClientExec.produceContent(MainClientExec.java:262)
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.produceContent(DefaultClientExchangeHandlerImpl.java:136)
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.outputReady(HttpAsyncRequestExecutor.java:241)
at org.apache.http.impl.nio.DefaultNHttpClientConnection.produceOutput(DefaultNHttpClientConnection.java:290)
at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:86)
at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:39)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.outputReady(AbstractIODispatch.java:145)
at org.apache.http.impl.nio.reactor.BaseIOReactor.writable(BaseIOReactor.java:188)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:341)
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:588)
at java.lang.Thread.run(Thread.java:748)
 

付博

赞同来自:

listener类下可以自己定义成功返回什么,失败返回什么,这个自己定义下兴许就能发现问题在哪里了,有时候json解析的问题不好发现

kevinYang

赞同来自:

@付博  失败的那一条, listener 返回的是超时

付博

赞同来自:

那你把EntityUtils.toString(response.getEntity())这个玩意print出来试试看,response是你client.performRequest的那个
 

kevinYang

赞同来自:

@付博  我用的是
performRequestAsync,是异步的没有返回值response,只有listener,listener在success的时候有
Response,失败的时候只有异常,异常是TimeOut

要回复问题请先登录注册