我使用值为“test”的更新属性处理器将属性(solrCoreSuffix)添加到我的流程文件中。然后,在我的PutSolrContentStream处理器中,我将Solr位置属性设置为:http://localhost:8983/solr/mycore-${solrCoreSuffix}。我希望Solr处理器尝试访问“http://localhost:8983/solr/mycore-test”,但如日志所述,它尝试访问“http://localhost:8983/solr/mycore-”。
这个字段有“支持表达式语言:true”,我可以在检查队列中的流文件时看到我的属性具有正确的值,我可以在其他处理器上使用这个属性,例如PutFile,字段“Collection”具有相同的意外行为。
我不知道我做错了什么,我错过了什么吗?
Solr位置字段支持表达式语言,但不支持每个流文件。
这意味着当处理器启动时,它正在创建一个SolrClient(来自SolrJ)并根据环境变量、变量注册表等评估Solr位置的值,但是此时没有流文件来使用流文件属性。这允许有人根据dev/qa/prod等环境轻松外部化Solr位置。
以这种方式完成的原因是因为为所有进入的单个流文件创建与Solr的新连接会很昂贵。
在云模式下,集合不是Solr位置的一部分,并且是动态的,因为CloudSolrClient允许您在每个操作上指定集合:
https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/PutSolrContentStream.java#L178
https://github.com/apache/nifi/blob/master/nifi-nar-bundles/nifi-solr-bundle/nifi-solr-processors/src/main/java/org/apache/nifi/processors/solr/PutSolrContentStream.java#L203-L205