我正在尝试使用高级restul客户端将数据加载到Elastic,这是我使用的代码
public static void loadJSONFileAsync(RestClient restClient, String index, String type, String jsonFileName) throws IOException {
// some more code here
...
String postData = String.format("/%s/_bulk", index);
ResponseListener rl = new ResponseListener() {
@Override
public void onSuccess(Response response) {
try {
successCnt++;
phaser.arriveAndDeregister() ;
} catch (Exception e) {
}
}
@Override
public void onFailure(Exception exception) {
if(exception!=null) {
System.out.println(exception.getMessage());
}
failedCnt++;
phaser.arriveAndDeregister() ;
}
};
while ( (line = reader.readLine())!= null) {
// reading the file here, some code omitted
buff = readFromFile();
if( counter == BATCH_SIZE ){
entity = new NStringEntity(buff.toString(), ContentType.APPLICATION_JSON);
try {
restClient.performRequestAsync("POST",postData, params, entity, rl);
phaser.register();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
batchNum ++;
buff = new StringBuffer();
}
}
phaser.arriveAndAwaitAdvance() ;
reader.close();
我在这里做的是我发出批量请求,并使用相位器控制并发的异步请求,因此我们等到所有请求完成为止。
我在这里有几个问题-首先是看起来像最终弹性服务器实例阻塞了数据(我认为如果我有13-14个并发请求进入每个都有10k记录,就会发生这种情况)。
第二个问题是何时调用:
public void onFailure(Exception exception) {
有时例外为空。这应该发生吗?
第二个问题-您如何处理这种情况,我可以减少并行请求的数量,而且看起来还可以,但是我想不能保证,如果服务器的负载较高,它可能会失败。我不想将数据存储在我的身边进行重试,如果请求失败,是否可以自动重试?