看,灰机...

多线程建立批量索引引起的问题

Elasticsearch | 作者 蓝天白云 | 发布于2016年04月07日 | 阅读数:4815

public void batch()
{
  //1 检查是是否存在索引记录
    Map<String, ClusterIndexHealth> map = client.admin().cluster().health(.......);
   boolean exists = map.containsKey(indexName);
   //2 不存在 就建立索引
   if( !exists )
   {
         client.admin().indices().create(new CreateIndexRequest(indexName)).actionGet();
    }
   //3 设置mapping
   PutMappingRequest ...
 
   //4.设置记录值
     for() {
       BulkRequestBuilder.add( ...)
    }
 //5. 提交
    batchRequest.execute().actionGet();
}
 问题:
    在多线程测试过程中,发现当新建立一个indexname时,会出现线程同时执行到2步时收到exists=false ,而同时去建立indexName,这样会造成一个线程创建成功,而其它线程失败。
以前在1.4 版本上是不用这么先创建indexname的,当然我可以在第二步加上try catch,强迫程序往下走,但是代码逻辑性不够好,请问有没其它办法避免这个问题,或是实现上述有其它的方式?
谢谢!
 
已邀请:

要回复问题请先登录注册