在异步模式下加载数据时出错

时间:2018-06-28 14:06:12

标签: elasticsearch

我正在尝试使用高级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) {

有时例外为空。这应该发生吗?

第二个问题-您如何处理这种情况,我可以减少并行请求的数量,而且看起来还可以,但是我想不能保证,如果服务器的负载较高,它可能会失败。我不想将数据存储在我的身边进行重试,如果请求失败,是否可以自动重试?

0 个答案:

没有答案