Elasticsearch:从别名获取索引名称时的AssertionError

时间:2016-03-21 09:45:28

标签: elasticsearch elasticsearch-plugin

我们一直在项目中使用 Elasticsearch Plugin 。从别名获取索引名称时收到错误

错误

   {
   "error": "AssertionError[Expected current thread[Thread[elasticsearch[Seth][http_server_worker][T#2]{New I/O worker #20},5,main]] to not be a transport thread. Reason: [Blocking operation]]",  "status": 500
   }

代码

    String realIndex = client.admin().cluster().prepareState()
                   .execute().actionGet().getState().getMetaData()
                   .aliases().get(aliasName).iterator()
                   .next().key;

导致这个问题的原因是什么?谷歌搜索它没有得到任何帮助

1 个答案:

答案 0 :(得分:1)

从错误的外观来看,似乎这个操作在传输线程上是不允许的,因为它会阻塞线程,直到你得到结果为止。您需要在执行线程上执行此操作。

public String getIndexName() {
    final IndexNameHolder result = new IndexNameHolder(); // holds the index Name. Needed a final instance here, hence created a holder.
    getTransportClient().admin().cluster().prepareState().execute(new ActionListener<ClusterStateResponse>() {

        @Override
        public void onResponse(ClusterStateResponse response) {
            result.indexName = response.getState().getMetaData().aliases().get("alias").iterator().next().key;

        }
        @Override
        public void onFailure(Throwable e) {
            //Handle failures
        }
    });
    return result.value;
}

execute()还有另一种方法,一种采用监听器的方法。您需要实现自己的侦听器。在我的回答中,我有一个匿名的Listener实现。

我希望它有所帮助