我们有一个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)
答案 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);