【问题标题】:Is there a way for a SOLR plugin to get a callback when SOLRCloud Has Successfully Elected A Master当 SOLRCloud 成功选举一个 Master 时,SOLR 插件有没有办法获得回调
【发布时间】:2023-03-15 17:01:01
【问题描述】:

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

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

谢谢。

附:

我得到的异常如下:

Caused by: org.apache.solr.common.SolrException: 等待4000ms后没有找到注册leader,collection: taxonomy slice: shard1 在 org.apache.solr.common.cloud.ZkStateReader.getLeaderRetry(ZkStateReader.java:676) 在 org.apache.solr.common.cloud.ZkStateReader.getLeaderRetry(ZkStateReader.java:662) 在 org.apache.solr.update.processor.DistributedUpdateProcessor.setupRequest(DistributedUpdateProcessor.java:361) 在 org.apache.solr.update.processor.DistributedUpdateProcessor.setupRequest(DistributedUpdateProcessor.java:312) 在 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) 在 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) 在 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)

【问题讨论】:

    标签: plugins solr solrcloud


    【解决方案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);
    

    【讨论】:

    • 看起来很有希望。我稍后会试一试,但由于我在海滩度假时放松,我会提前投票:-) 如果没有其他任何东西它提供了探索的途径并且没有其他人有任何建议
    • 很高兴我能(可能)提供帮助。度过一个愉快的假期。
    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多