当SOLRCloud成功选举主人

时间:2015-05-14 14:55:24

标签: plugins solr solrcloud

我们有一个SOLR插件(我们的目的是一个特殊的RequestHandler),它在启动时从SOLR获得两个回调,一个RequestHandler.init方法和一个SolrCoreAware.inform(SolrCore核心)方法。在SolrCoreAware.inform方法中,我们启动了Kafka消费者。

问题在于,在SolrCloud完成启动之前,有时插件会获取要处理的Kafka消息(它只是转发给另一个SOLR更新处理程序进行索引)。在那种情况下,Solr在等待一段时间后抛出异常。有没有办法只在SolrCloud完成启动时才能回调某种类型的插件,以便我可以延迟启动Kafka消费者直到那时呢?当然,我可以采用一些hacky方式来引入基于固定时间的延迟,但希望系统可以告诉我可以初始化。

感谢。

P.S:

我得到的例外情况如下:

引起:org.apache.solr.common.SolrException:等待4000毫秒后未找到注册的领导者,集合:分类法切片:shard1         在org.apache.solr.common.cloud.ZkStateReader.getLeaderRetry(ZkStateReader.java:676)         在org.apache.solr.common.cloud.ZkStateReader.getLeaderRetry(ZkStateReader.java:662)         at org.apache.solr.update.processor.DistributedUpdateProcessor.setupRequest(DistributedUpdateProcessor.java:361)         at org.apache.solr.update.processor.DistributedUpdateProcessor.setupRequest(DistributedUpdateProcessor.java:312)         at org.apache.solr.update.processor.DistributedUpdateProcessor.processAdd(DistributedUpdateProcessor.java:662)         在org.apache.solr.handler.loader.JsonLoader $ SingleThreadedJsonLoader $ 1.handle(JsonLoader.java:227)         在org.apache.solr.common.util.JsonRecordReader $ Node.handleObjectStart(JsonRecordReader.java:364)         在org.apache.solr.common.util.JsonRecordReader $ Node.parse(JsonRecordReader.java:289)         在org.apache.solr.common.util.JsonRecordReader $ Node.access $ 200(JsonRecordReader.java:154)         在org.apache.solr.common.util.JsonRecordReader.streamRecords(JsonRecordReader.java:138)         在org.apache.solr.handler.loader.JsonLoader $ SingleThreadedJsonLoader.handleSplitMode(JsonLoader.java:205)         at org.apache.solr.handler.loader.JsonLoader $ SingleThreadedJsonLoader.processUpdate(JsonLoader.java:122)         在org.apache.solr.handler.loader.JsonLoader $ SingleThreadedJsonLoader.load(JsonLoader.java:110)         在org.apache.solr.handler.loader.JsonLoader.load(JsonLoader.java:73)         在org.apache.solr.handler.UpdateRequestHandler $ 1.load(UpdateRequestHandler.java:103)         at org.apache.solr.handler.ContentStreamHandlerBase.handleRequestBody(ContentStreamHandlerBase.java:74)         在org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:143)         在org.apache.solr.core.SolrCore.execute(SolrCore.java:1984)         在com.aol.dmp.solr.kafka.SolrKafkaHandler.processDoc(SolrKafkaHandler.java:407)

1 个答案:

答案 0 :(得分:1)

由于没有人回答,我会去。

观察SolrCloud生命周期,我认为您可以使用SolrEventListener的newSearcher-callback实现这一目标。在初始核心加载后以及每次提交后,当实例化新的搜索器时,它会得到通知。

public void newSearcher(SolrIndexSearcher newSearcher, SolrIndexSearcher currentSearcher) {
    if (currentSearcher == null) {
        //First searcher after the core has loaded.
    } else {
        //New searcher after commit.
    }
}

您可以在inform-Callback中注册监听器:

core.registerFirstSearcherListener(whatEverSolrEventListenerSeemsFit);